Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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 @@ -22,6 +22,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2

### :bug: Bug Fixes

* fix(sdk-logs): stop `Logger.emit()` doing work (record construction, metrics, processor `onEmit`) after the `LoggerProvider` has shut down [#6826](https://github.com/open-telemetry/opentelemetry-js/pull/6826) @anneheartrecord
* fix(sdk-node): pass all config properties (endpoint, headers, timeout, TLS, compression, temporality preference, default histogram aggregation) to OTLP metric exporters in declarative config [#6814](https://github.com/open-telemetry/opentelemetry-js/pull/6814) @MikeGoldsmith
* fix(sdk-logs): default BatchLogRecordProcessor `scheduleDelayMillis` is 1000 [#6796](https://github.com/open-telemetry/opentelemetry-js/pull/6796) @trentm
* fix(configuration): percent-decode keys and values in `resource.attributes_list` per spec [#6787](https://github.com/open-telemetry/opentelemetry-js/pull/6787) @MikeGoldsmith
Expand Down
4 changes: 4 additions & 0 deletions experimental/packages/sdk-logs/src/Logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ export class Logger implements ILogger {
severityNumber?: SeverityNumber;
eventName?: string;
}): boolean {
if (this._sharedState.hasShutdown) {
return false;
}

const loggerConfig = this._loggerConfig;

if (loggerConfig.disabled) {
Expand Down
1 change: 1 addition & 0 deletions experimental/packages/sdk-logs/src/LoggerProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ export class LoggerProvider implements ILoggerProvider {
}

private _shutdown(): Promise<void> {
this._sharedState.hasShutdown = true;
return this._sharedState.activeProcessor.shutdown();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ export class LoggerProviderSharedState {
readonly logRecordLimits: Required<LogRecordLimits>;
readonly processors: LogRecordProcessor[];
readonly loggerMetrics: LoggerMetrics;
hasShutdown = false;
private _loggerConfigurator: LoggerConfigurator;
private _loggerConfigs: Map<string, Required<LoggerConfig>> = new Map();

Expand Down
43 changes: 43 additions & 0 deletions experimental/packages/sdk-logs/test/common/Logger.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,49 @@ describe('Logger', () => {
assert.ok(callSpy.called);
});

it('should not do any work when emitting after the LoggerProvider has shut down', async () => {
const { logger, loggerProvider, logProcessor } =
setupLoggerProvider('simple');
const onEmitSpy = sinon.spy(logProcessor, 'onEmit');
const makeReadonlySpy = sinon.spy(
LogRecordImpl.prototype,
'_makeReadonly'
);

try {
assert.strictEqual(
logger.enabled(),
true,
'sanity: logger should be enabled before shutdown'
);

await loggerProvider.shutdown();

assert.strictEqual(
logger.enabled(),
false,
'enabled() should report false after the provider has shut down'
);

logger.emit({
body: 'log body emitted after shutdown',
});

assert.strictEqual(
onEmitSpy.called,
false,
'processor.onEmit should not be called after the provider has shut down'
);
assert.strictEqual(
makeReadonlySpy.called,
false,
'no LogRecord should be constructed after the provider has shut down'
);
} finally {
makeReadonlySpy.restore();
}
});

it('should make log record instance readonly after emit it', () => {
const { logger } = setupLoggerProvider('simple');
const makeOnlySpy = sinon.spy(LogRecordImpl.prototype, '_makeReadonly');
Expand Down
Loading