From 52a24d2753c1a1324b37df9ab930f5172d5d5a3c Mon Sep 17 00:00:00 2001 From: Anthony Barone Date: Wed, 19 Nov 2025 20:55:48 +0000 Subject: [PATCH] Simplify logger-provider in telemetry package --- .../telemetry/src/logging/logger-provider.ts | 67 +++++++------------ 1 file changed, 26 insertions(+), 41 deletions(-) diff --git a/packages/telemetry/src/logging/logger-provider.ts b/packages/telemetry/src/logging/logger-provider.ts index 7c87b76719f..84433f0ca8d 100644 --- a/packages/telemetry/src/logging/logger-provider.ts +++ b/packages/telemetry/src/logging/logger-provider.ts @@ -61,61 +61,26 @@ export function createLoggerProvider( ...(apiKey ? { 'X-Goog-Api-Key': apiKey } : {}) } }, - dynamicHeaderProviders + dynamicHeaderProviders, + dynamicLogAttributeProviders ); return new LoggerProvider({ resource, - processors: [ - new BatchLogRecordProcessor( - new AsyncAttributeLogExporter(logExporter, dynamicLogAttributeProviders) - ) - ], + processors: [new BatchLogRecordProcessor(logExporter)], logRecordLimits: {} }); } -/** A log exporter that appends log entries with resolved async attributes before exporting. */ -class AsyncAttributeLogExporter implements LogRecordExporter { - private readonly _delegate: LogRecordExporter; - - constructor( - exporter: OTLPLogExporter, - private dynamicLogAttributeProviders: DynamicLogAttributeProvider[] - ) { - this._delegate = exporter; - } - - async export( - logs: ReadableLogRecord[], - resultCallback: (result: ExportResult) => void - ): Promise { - await Promise.all( - this.dynamicLogAttributeProviders.map(async provider => { - const attribute = await provider.getAttribute(); - if (attribute) { - logs.forEach(log => { - log.attributes[attribute[0]] = attribute[1]; - }); - } - }) - ); - this._delegate.export(logs, resultCallback); - } - - shutdown(): Promise { - return this._delegate.shutdown(); - } -} - -/** OTLP exporter that uses custom FetchTransport. */ +/** OTLP exporter that uses custom FetchTransport and resolves async attributes. */ class OTLPLogExporter extends OTLPExporterBase implements LogRecordExporter { constructor( config: OTLPExporterConfigBase = {}, - dynamicHeaderProviders: DynamicHeaderProvider[] = [] + dynamicHeaderProviders: DynamicHeaderProvider[] = [], + private dynamicLogAttributeProviders: DynamicLogAttributeProvider[] = [] ) { super( createOtlpNetworkExportDelegate( @@ -133,4 +98,24 @@ class OTLPLogExporter ) ); } + + override async export( + logs: ReadableLogRecord[], + resultCallback: (result: ExportResult) => void + ): Promise { + const attributes = await Promise.all( + this.dynamicLogAttributeProviders.map(provider => provider.getAttribute()) + ); + + const attributesToApply = Object.fromEntries( + attributes.filter((attr): attr is [string, string] => attr != null) + ); + + if (Object.keys(attributesToApply).length > 0) { + logs.forEach(log => { + Object.assign(log.attributes, attributesToApply); + }); + } + super.export(logs, resultCallback); + } }