Skip to content

Commit 734763f

Browse files
Autocomplete: fix OpenTelemetry exporter with multiple processors (#3270)
Currently, `NodeSDK` does not support multiple-span processors and exporters. This functionality [was added](open-telemetry/opentelemetry-js#4454) three weeks ago and will be included in [the following experimental release](open-telemetry/opentelemetry-js#4504). To fix the problem without waiting for the release, I migrated this functionality to lower-level primitives, where we have complete control over the number of exporters.
1 parent a760233 commit 734763f

File tree

3 files changed

+39
-15
lines changed

3 files changed

+39
-15
lines changed

pnpm-lock.yaml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vscode/package.json

+2
Original file line numberDiff line numberDiff line change
@@ -1062,10 +1062,12 @@
10621062
"@opentelemetry/api": "^1.7.0",
10631063
"@opentelemetry/core": "^1.18.1",
10641064
"@opentelemetry/exporter-trace-otlp-http": "^0.45.1",
1065+
"@opentelemetry/instrumentation": "^0.45.1",
10651066
"@opentelemetry/instrumentation-http": "^0.45.1",
10661067
"@opentelemetry/resources": "^1.18.1",
10671068
"@opentelemetry/sdk-node": "^0.45.1",
10681069
"@opentelemetry/sdk-trace-base": "^1.18.1",
1070+
"@opentelemetry/sdk-trace-node": "^1.18.1",
10691071
"@opentelemetry/semantic-conventions": "^1.18.1",
10701072
"@sentry/browser": "^7.66.0",
10711073
"@sentry/core": "^7.66.0",

vscode/src/services/open-telemetry/OpenTelemetryService.node.ts

+31-15
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api'
22
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'
3+
import { registerInstrumentations } from '@opentelemetry/instrumentation'
34
import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'
45
import { Resource } from '@opentelemetry/resources'
5-
import { NodeSDK } from '@opentelemetry/sdk-node'
6+
import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node'
67
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'
78

89
import {
@@ -21,7 +22,9 @@ export type OpenTelemetryServiceConfig = Pick<
2122
>
2223

2324
export class OpenTelemetryService {
24-
private sdk: NodeSDK | undefined
25+
private tracerProvider?: NodeTracerProvider
26+
private unloadInstrumentations?: () => void
27+
2528
private lastTraceUrl: string | undefined
2629
// We use a single promise object that we chain on to, to avoid multiple reconfigure calls to
2730
// be run in parallel
@@ -51,27 +54,40 @@ export class OpenTelemetryService {
5154
}
5255
this.lastTraceUrl = traceUrl
5356

54-
const logLevel = this.config.debugVerbose ? DiagLogLevel.DEBUG : DiagLogLevel.ERROR
57+
const logLevel = this.config.debugVerbose ? DiagLogLevel.INFO : DiagLogLevel.ERROR
5558
diag.setLogger(new DiagConsoleLogger(), logLevel)
5659

57-
await this.sdk?.shutdown()
58-
this.sdk = undefined
60+
await this.reset()
5961

60-
this.sdk = new NodeSDK({
62+
this.unloadInstrumentations = registerInstrumentations({
63+
instrumentations: [new HttpInstrumentation()],
64+
})
65+
this.configureTracerProvider(traceUrl)
66+
}
67+
68+
public configureTracerProvider(traceUrl: string): void {
69+
this.tracerProvider = new NodeTracerProvider({
6170
resource: new Resource({
6271
[SemanticResourceAttributes.SERVICE_NAME]: 'cody-client',
6372
[SemanticResourceAttributes.SERVICE_VERSION]: version,
6473
}),
65-
instrumentations: [new HttpInstrumentation()],
66-
traceExporter: new OTLPTraceExporter({ url: traceUrl }),
74+
})
6775

68-
// Disable default process logging. We do not care about the VS Code extension process
69-
autoDetectResources: false,
76+
// Add the default tracer exporter used in production.
77+
this.tracerProvider.addSpanProcessor(
78+
new BatchSpanProcessor(new OTLPTraceExporter({ url: traceUrl }))
79+
)
7080

71-
...((process.env.NODE_ENV === 'development' || this.config.debugVerbose) && {
72-
spanProcessor: new BatchSpanProcessor(new ConsoleBatchSpanExporter()),
73-
}),
74-
})
75-
this.sdk.start()
81+
// Add the console exporter used in development for verbose logging and debugging.
82+
if (process.env.NODE_ENV === 'development' || this.config.debugVerbose) {
83+
this.tracerProvider.addSpanProcessor(new BatchSpanProcessor(new ConsoleBatchSpanExporter()))
84+
}
85+
86+
this.tracerProvider.register()
87+
}
88+
89+
public async reset(): Promise<void> {
90+
await this.tracerProvider?.shutdown()
91+
this.unloadInstrumentations?.()
7692
}
7793
}

0 commit comments

Comments
 (0)