Skip to content

Commit aa2fab1

Browse files
committed
Merge remote-tracking branch 'upstream/main' into sigv4_logs
2 parents bb280d4 + 17a5892 commit aa2fab1

16 files changed

+2656
-37
lines changed

aws-distro-opentelemetry-node-autoinstrumentation/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@
100100
"@opentelemetry/api": "1.9.0",
101101
"@opentelemetry/auto-configuration-propagators": "0.3.2",
102102
"@opentelemetry/auto-instrumentations-node": "0.56.0",
103+
"@opentelemetry/api-events": "0.57.1",
104+
"@opentelemetry/sdk-events": "0.57.1",
105+
"@opentelemetry/sdk-logs": "0.57.1",
103106
"@opentelemetry/core": "1.30.1",
104107
"@opentelemetry/exporter-metrics-otlp-grpc": "0.57.1",
105108
"@opentelemetry/exporter-metrics-otlp-http": "0.57.1",

aws-distro-opentelemetry-node-autoinstrumentation/src/aws-metric-attributes-span-exporter.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
MetricAttributeGenerator,
1414
SERVICE_METRIC,
1515
} from './metric-attribute-generator';
16+
import { Mutable } from './utils';
1617

1718
/**
1819
* This exporter will update a span with metric attributes before exporting. It depends on a
@@ -125,9 +126,6 @@ export class AwsMetricAttributesSpanExporter implements SpanExporter {
125126
}
126127

127128
// Bypass `readonly` restriction of ReadableSpan's attributes.
128-
// Workaround provided from official TypeScript docs:
129-
// https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html#improved-control-over-mapped-type-modifiers
130-
type Mutable<T> = { -readonly [P in keyof T]: T[P] };
131129
const mutableSpan: Mutable<ReadableSpan> = span;
132130
mutableSpan.attributes = updateAttributes;
133131

aws-distro-opentelemetry-node-autoinstrumentation/src/exporter/otlp/aws/traces/otlp-aws-span-exporter.ts

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ import { CompressionAlgorithm, OTLPExporterNodeConfigBase } from '@opentelemetry
55
import { IExportTraceServiceResponse, ProtobufTraceSerializer } from '@opentelemetry/otlp-transformer';
66
import { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base';
77
import { OTLPAwsBaseExporter } from '../common/otlp-aws-base-exporter';
8+
import { LLOHandler } from '../../../../llo-handler';
9+
import { LoggerProvider as APILoggerProvider, logs } from '@opentelemetry/api-logs';
10+
import { ExportResult } from '@opentelemetry/core';
11+
import { isAgentObservabilityEnabled } from '../../../../utils';
12+
import { diag } from '@opentelemetry/api';
13+
import { LoggerProvider } from '@opentelemetry/sdk-logs';
814

915
/**
1016
* This exporter extends the functionality of the OTLPProtoTraceExporter to allow spans to be exported
@@ -21,13 +27,52 @@ export class OTLPAwsSpanExporter
2127
extends OTLPAwsBaseExporter<ReadableSpan[], IExportTraceServiceResponse>
2228
implements SpanExporter
2329
{
24-
constructor(endpoint: string, config?: OTLPExporterNodeConfigBase) {
30+
private loggerProvider: APILoggerProvider | undefined;
31+
private lloHandler: LLOHandler | undefined;
32+
33+
constructor(endpoint: string, config?: OTLPExporterNodeConfigBase, loggerProvider?: APILoggerProvider) {
2534
const modifiedConfig: OTLPExporterNodeConfigBase = {
2635
...config,
2736
url: endpoint,
2837
compression: CompressionAlgorithm.NONE,
2938
};
3039

3140
super(endpoint, 'xray', new OTLPProtoTraceExporter(modifiedConfig), ProtobufTraceSerializer, config?.compression);
41+
42+
this.lloHandler = undefined;
43+
this.loggerProvider = loggerProvider;
44+
}
45+
46+
// Lazily initialize LLO handler when needed to avoid initialization order issues
47+
private ensureLloHandler(): boolean {
48+
if (!this.lloHandler && isAgentObservabilityEnabled()) {
49+
// If loggerProvider wasn't provided, try to get the current one
50+
if (!this.loggerProvider) {
51+
try {
52+
this.loggerProvider = logs.getLoggerProvider();
53+
} catch (e: unknown) {
54+
diag.debug('Failed to get logger provider', e);
55+
return false;
56+
}
57+
}
58+
59+
if (this.loggerProvider instanceof LoggerProvider) {
60+
this.lloHandler = new LLOHandler(this.loggerProvider);
61+
return true;
62+
}
63+
}
64+
65+
return !!this.lloHandler;
66+
}
67+
68+
public override async export(items: ReadableSpan[], resultCallback: (result: ExportResult) => void): Promise<void> {
69+
let itemsToSerialize: ReadableSpan[] = items;
70+
if (isAgentObservabilityEnabled() && this.ensureLloHandler() && this.lloHandler) {
71+
// items to serialize are now the lloProcessedSpans
72+
itemsToSerialize = this.lloHandler.processSpans(items);
73+
itemsToSerialize = this.lloHandler.processSpans(items);
74+
}
75+
76+
return super.export(itemsToSerialize, resultCallback);
3277
}
3378
}

0 commit comments

Comments
 (0)