Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
e4f9653
feat(api-lods, sdk-logs): add Logger#enabled method
david-luna Feb 4, 2026
cbaabf1
chore: add more tests
david-luna Feb 5, 2026
d5c32d8
chore: add changelog entry
david-luna Feb 5, 2026
073c3dc
fix: fix changelog
david-luna Feb 5, 2026
71806ab
feat(sdk-logs): check logger config in Logger#enable
david-luna Feb 23, 2026
9b35e35
Merge branch 'main' into add-logger-enabled
david-luna Feb 23, 2026
08b15b1
chore: add enabled in log record processors
david-luna Feb 25, 2026
4d4cd2b
chore: add enabled in session log record processor
david-luna Feb 26, 2026
76cba2a
chore: add tests to session log record processor
david-luna Feb 26, 2026
5d3afbf
chore: add tests to multi log processor
david-luna Feb 26, 2026
733bd6f
chore: made enabled optional for processors
david-luna Feb 26, 2026
8346a29
chore: remove code
david-luna Feb 26, 2026
e0b3db0
chore: remove code from test stubs
david-luna Feb 26, 2026
a7099e1
chore: revert changes in session processor
david-luna Feb 26, 2026
7ffd0d6
Update experimental/packages/api-logs/src/types/Logger.ts
david-luna Feb 27, 2026
6afe03b
Update experimental/packages/api-logs/src/ProxyLogger.ts
david-luna Feb 27, 2026
b8c4791
fix: handle UNSPECIFIED level
david-luna Feb 27, 2026
4a28b26
Merge branch 'main' into add-logger-enabled
david-luna Mar 17, 2026
5331ea3
chore: update types
david-luna Mar 17, 2026
0126595
fix: fix lint issues
david-luna Mar 17, 2026
b956007
Apply suggestion from @trentm
david-luna Mar 17, 2026
feaafd9
chore: improve trace based logic
david-luna Mar 18, 2026
6ba5fa5
Merge branch 'add-logger-enabled' of github.com:david-luna/openteleme…
david-luna Mar 18, 2026
4dd2bd4
Update experimental/CHANGELOG.md
david-luna Mar 18, 2026
443c67e
Merge branch 'main' into add-logger-enabled
david-luna Mar 30, 2026
5e5ed85
chore: update changelog
david-luna Mar 30, 2026
2f93dd0
Merge branch 'add-logger-enabled' of github.com:david-luna/openteleme…
david-luna Mar 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions experimental/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2

### :boom: Breaking Changes

* feat(api-logs, sdk-logs)!: add `enabled` method to Logger interface and implementi it in logs API and SDK [#6371](https://github.com/open-telemetry/opentelemetry-js/pull/6371) @david-luna

### :rocket: Features

### :bug: Bug Fixes
Expand Down
3 changes: 3 additions & 0 deletions experimental/packages/api-logs/src/NoopLogger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ import type { LogRecord } from './types/LogRecord';

export class NoopLogger implements Logger {
emit(_logRecord: LogRecord): void {}
enabled(): boolean {
return false;
Comment thread
david-luna marked this conversation as resolved.
}
}

export const NOOP_LOGGER = new NoopLogger();
10 changes: 10 additions & 0 deletions experimental/packages/api-logs/src/ProxyLogger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
* SPDX-License-Identifier: Apache-2.0
*/

import type { Context } from '@opentelemetry/api';
import { NOOP_LOGGER } from './NoopLogger';
import type { Logger } from './types/Logger';
import type { LoggerOptions } from './types/LoggerOptions';
import type { LogRecord } from './types/LogRecord';
import type { SeverityNumber } from './types/LogRecord';

export class ProxyLogger implements Logger {
// When a real implementation is provided, this will be it
Expand Down Expand Up @@ -37,6 +39,14 @@ export class ProxyLogger implements Logger {
this._getLogger().emit(logRecord);
}

enabled(options?: {
context?: Context;
severityNumber?: SeverityNumber;
eventName?: string;
}): boolean {
return this._getLogger().enabled(options);
}

/**
* Try to get a logger from the proxy logger provider.
* If the proxy logger provider has no delegate, return a noop logger.
Expand Down
12 changes: 12 additions & 0 deletions experimental/packages/api-logs/src/types/Logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
* SPDX-License-Identifier: Apache-2.0
*/

import type { Context } from '@opentelemetry/api';
import type { LogRecord } from './LogRecord';
import type { SeverityNumber } from './LogRecord';

export interface Logger {
/**
Expand All @@ -12,4 +14,14 @@ export interface Logger {
* @param logRecord
*/
emit(logRecord: LogRecord): void;

/**
* Will a log record with the given details get emitted?
* This can be used to avoid expensive calculation of log record data.
*/
enabled(options?: {
context?: Context;
severityNumber?: SeverityNumber;
eventName?: string;
}): boolean;
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,9 @@ describe('NoopLogger', () => {
body: 'log body',
});
});

it('calling enabled should return false', () => {
const logger = new NoopLoggerProvider().getLogger('test-noop');
assert.ok(!logger.enabled());
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,18 @@ describe('ProxyLogger', () => {

let delegateLogger: Logger;
let emitCalled: boolean;
let enabledCalled: boolean;

beforeEach(() => {
emitCalled = false;
delegateLogger = {
emit() {
emitCalled = true;
},
enabled() {
enabledCalled = true;
return true;
},
};

logger = provider.getLogger('test');
Expand All @@ -99,5 +104,10 @@ describe('ProxyLogger', () => {
});
assert.ok(emitCalled);
});

it('should call enabled from the delegate logger', () => {
logger.enabled();
assert.ok(enabledCalled);
});
});
});
15 changes: 14 additions & 1 deletion experimental/packages/sdk-logs/src/LogRecordProcessor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
*/

import type { Context } from '@opentelemetry/api';

import type { InstrumentationScope } from '@opentelemetry/core';
import type { SdkLogRecord } from './export/SdkLogRecord';
import type { SeverityNumber } from '@opentelemetry/api-logs';

export interface LogRecordProcessor {
/**
Expand All @@ -25,4 +26,16 @@ export interface LogRecordProcessor {
* opportunity for processor to do any cleanup required.
*/
shutdown(): Promise<void>;

/**
* Tells if the logger is enabled for the given context, severity number and event
* name if provided.
* @param options
*/
enabled?(options: {
context: Context;
instrumentationScope: InstrumentationScope;
severityNumber?: SeverityNumber;
eventName?: string;
}): boolean;
}
50 changes: 50 additions & 0 deletions experimental/packages/sdk-logs/src/Logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import type * as logsAPI from '@opentelemetry/api-logs';
import { SeverityNumber } from '@opentelemetry/api-logs';
import type { InstrumentationScope } from '@opentelemetry/core';
import type { Context } from '@opentelemetry/api';
import {
context,
trace,
Expand Down Expand Up @@ -97,4 +98,53 @@ export class Logger implements logsAPI.Logger {
*/
logRecordInstance._makeReadonly();
}

public enabled(options?: {
context?: Context;
severityNumber?: SeverityNumber;
eventName?: string;
}): boolean {
const loggerConfig = this._loggerConfig;

if (loggerConfig.disabled) {
return false;
}

// Severity number given and lower than the min configured
const severityNumber = options?.severityNumber;
if (
typeof severityNumber === 'number' &&
severityNumber !== SeverityNumber.UNSPECIFIED &&
severityNumber < loggerConfig.minimumSeverity
) {
return false;
}
Comment thread
trentm marked this conversation as resolved.

const currentContext = options?.context || context.active();
// Trace based: the context (given or the active) has a unsampled Span
if (loggerConfig.traceBased) {
const spanContext = trace.getSpanContext(currentContext);
if (spanContext && isSpanContextValid(spanContext)) {
const isSampled =
(spanContext.traceFlags & TraceFlags.SAMPLED) === TraceFlags.SAMPLED;
if (!isSampled) {
return false;
}
}
}

// Lastly check if there is any enabled processor
const enabledOpts = {
context: currentContext,
instrumentationScope: this.instrumentationScope,
severityNumber: options?.severityNumber,
eventName: options?.eventName,
};
for (const processor of this._sharedState.processors) {
if (!processor.enabled || processor.enabled(enabledOpts)) {
return true;
}
}
return false;
}
}
16 changes: 16 additions & 0 deletions experimental/packages/sdk-logs/src/MultiLogRecordProcessor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
* SPDX-License-Identifier: Apache-2.0
*/

import type { InstrumentationScope } from '@opentelemetry/core';
import { callWithTimeout } from '@opentelemetry/core';
import type { Context } from '@opentelemetry/api';
import type { LogRecordProcessor } from './LogRecordProcessor';
import type { SdkLogRecord } from './export/SdkLogRecord';
import type { SeverityNumber } from '@opentelemetry/api-logs';

/**
* Implementation of the {@link LogRecordProcessor} that simply forwards all
Expand Down Expand Up @@ -41,4 +43,18 @@ export class MultiLogRecordProcessor implements LogRecordProcessor {
public async shutdown(): Promise<void> {
await Promise.all(this.processors.map(processor => processor.shutdown()));
}

public enabled(options: {
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

note for reviewer: IMO it must be implemented here since any of the processors may implement it and need to be called if so

context: Context;
instrumentationScope: InstrumentationScope;
severityNumber?: SeverityNumber;
eventName?: string;
}): boolean {
for (const processor of this.processors) {
if (!processor.enabled || processor.enabled(options)) {
return true;
}
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,29 @@
* SPDX-License-Identifier: Apache-2.0
*/

import type { InstrumentationScope } from '@opentelemetry/core';
import type { Context } from '@opentelemetry/api';
import type { LogRecordProcessor } from '../LogRecordProcessor';
import type { ReadableLogRecord } from './ReadableLogRecord';
import type { SeverityNumber } from '@opentelemetry/api-logs';

export class NoopLogRecordProcessor implements LogRecordProcessor {
forceFlush(): Promise<void> {
public forceFlush(): Promise<void> {
return Promise.resolve();
}

onEmit(_logRecord: ReadableLogRecord, _context: Context): void {}
public onEmit(_logRecord: ReadableLogRecord, _context: Context): void {}

shutdown(): Promise<void> {
public shutdown(): Promise<void> {
return Promise.resolve();
}

public enabled(_options: {
context: Context;
instrumentationScope: InstrumentationScope;
severityNumber?: SeverityNumber;
eventName?: string;
}): boolean {
return false;
Comment thread
david-luna marked this conversation as resolved.
}
}
Loading
Loading