Skip to content
Merged
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
67 changes: 26 additions & 41 deletions packages/telemetry/src/logging/logger-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<void> {
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<void> {
return this._delegate.shutdown();
}
}

/** OTLP exporter that uses custom FetchTransport. */
/** OTLP exporter that uses custom FetchTransport and resolves async attributes. */
class OTLPLogExporter
extends OTLPExporterBase<ReadableLogRecord[]>
implements LogRecordExporter
{
constructor(
config: OTLPExporterConfigBase = {},
dynamicHeaderProviders: DynamicHeaderProvider[] = []
dynamicHeaderProviders: DynamicHeaderProvider[] = [],
private dynamicLogAttributeProviders: DynamicLogAttributeProvider[] = []
) {
super(
createOtlpNetworkExportDelegate(
Expand All @@ -133,4 +98,24 @@ class OTLPLogExporter
)
);
}

override async export(
logs: ReadableLogRecord[],
resultCallback: (result: ExportResult) => void
): Promise<void> {
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);
}
}
Loading