Skip to content
Merged
Show file tree
Hide file tree
Changes from 12 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
1 change: 1 addition & 0 deletions experimental/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2
`NodeSDK` from `@opentelemetry/sdk-node` to get automatic environment variable configuration.
* fix(instrumentation-http)!: do not normalize hyphens to underscores in captured header attribute names if using stable semconv [#6381](https://github.com/open-telemetry/opentelemetry-js/issues/6381) @trentm
* With the `headersToSpanAttributes` option, one can specify that HTTP headers should be captured as span attributes named `http.{request,response}.header.HEADERNAME`. With old Semantic Conventions, the `HEADERNAME` normalizes hyphens to underscores, e.g. `http.response.header.content_length`. When stable HTTP semconv is enabled (via `OTEL_SEMCONV_STABILITY_OPT_IN`), hyphens are no longer changed, e.g. `http.response.header.content-length`.
* 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
Comment thread
david-luna marked this conversation as resolved.
Outdated

### :rocket: Features

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 @@ -19,6 +19,9 @@ import { 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();
16 changes: 15 additions & 1 deletion experimental/packages/api-logs/src/ProxyLogger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@
* limitations under the License.
*/

import { Context } from '@opentelemetry/api';
Comment thread
david-luna marked this conversation as resolved.
Outdated
import { NOOP_LOGGER } from './NoopLogger';
import { Logger } from './types/Logger';
import { LoggerOptions } from './types/LoggerOptions';
import { LogRecord } from './types/LogRecord';
import { LogRecord, SeverityNumber } from './types/LogRecord';

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

/**
* Returns `true` if the logger is enabled for the given options.
*
* @param options
*/
Comment thread
david-luna marked this conversation as resolved.
Outdated
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
14 changes: 13 additions & 1 deletion experimental/packages/api-logs/src/types/Logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
* limitations under the License.
*/

import { LogRecord } from './LogRecord';
import type { Context } from '@opentelemetry/api';
import { LogRecord, SeverityNumber } from './LogRecord';
Comment thread
david-luna marked this conversation as resolved.
Outdated

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

/**
* Tells if the logger is enabled for the given context, severity number and event
* name if provided.
* @param options the context, severity number and event name
Comment thread
david-luna marked this conversation as resolved.
Outdated
*/
enabled(options?: {
context?: Context;
severityNumber?: SeverityNumber;
eventName?: string;
}): boolean;
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,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 @@ -85,13 +85,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 @@ -110,5 +115,10 @@ describe('ProxyLogger', () => {
});
assert.ok(emitCalled);
});

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

import { Context } from '@opentelemetry/api';
import { SeverityNumber } from '@opentelemetry/api-logs';
import { InstrumentationScope } from '@opentelemetry/core';
Comment thread
david-luna marked this conversation as resolved.
Outdated

import { SdkLogRecord } from './export/SdkLogRecord';

Expand All @@ -36,4 +38,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;
}
43 changes: 43 additions & 0 deletions experimental/packages/sdk-logs/src/Logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {
trace,
TraceFlags,
isSpanContextValid,
Context,
} from '@opentelemetry/api';

import { LogRecordImpl } from './LogRecordImpl';
Expand Down Expand Up @@ -108,4 +109,46 @@ export class Logger implements logsAPI.Logger {
*/
logRecordInstance._makeReadonly();
}

public enabled(options?: {
context?: Context;
severityNumber?: SeverityNumber;
eventName?: string;
}): boolean {
// This logger is disabled
Comment thread
david-luna marked this conversation as resolved.
Outdated
if (this._loggerConfig.disabled) {
Comment thread
pichlermarc marked this conversation as resolved.
Outdated
return false;
}

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

// Trace based: the context (given or the active) has a unsampled Span
if (this._loggerConfig.traceBased) {
const span = trace.getSpan(options?.context || context.active());
if (span && span.spanContext().traceFlags === TraceFlags.NONE) {
return false;
}
Comment thread
david-luna marked this conversation as resolved.
Outdated
}

// Lastly check if there is any enabled processor
const enabledOpts = {
context: options?.context || context.active(),
Comment thread
david-luna marked this conversation as resolved.
Outdated
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;
}
}
17 changes: 16 additions & 1 deletion experimental/packages/sdk-logs/src/MultiLogRecordProcessor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@
* limitations under the License.
*/

import { callWithTimeout } from '@opentelemetry/core';
import { callWithTimeout, InstrumentationScope } from '@opentelemetry/core';
Comment thread
david-luna marked this conversation as resolved.
Outdated
import type { Context } from '@opentelemetry/api';
import type { LogRecordProcessor } from './LogRecordProcessor';
import type { SdkLogRecord } from './export/SdkLogRecord';
import { SeverityNumber } from '@opentelemetry/api-logs';

/**
* Implementation of the {@link LogRecordProcessor} that simply forwards all
Expand Down Expand Up @@ -52,4 +53,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 @@ -15,17 +15,28 @@
*/

import { Context } from '@opentelemetry/api';
import { SeverityNumber } from '@opentelemetry/api-logs';
import { InstrumentationScope } from '@opentelemetry/core';
Comment thread
david-luna marked this conversation as resolved.
Outdated
import { LogRecordProcessor } from '../LogRecordProcessor';
import { ReadableLogRecord } from './ReadableLogRecord';

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