/
instrumenter.ts
64 lines (56 loc) · 1.98 KB
/
instrumenter.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
import {
Instrumenter,
InstrumenterSpanOptions,
TracingContext,
TracingSpan,
} from "@azure/core-tracing";
import { context, defaultTextMapGetter, defaultTextMapSetter, trace } from "@opentelemetry/api";
import { OpenTelemetrySpanWrapper } from "./spanWrapper";
import { W3CTraceContextPropagator } from "@opentelemetry/core";
import { toSpanOptions } from "./transformations";
// While default propagation is user-configurable, Azure services always use the W3C implementation.
export const propagator = new W3CTraceContextPropagator();
export class OpenTelemetryInstrumenter implements Instrumenter {
startSpan(
name: string,
spanOptions: InstrumenterSpanOptions
): { span: TracingSpan; tracingContext: TracingContext } {
const span = trace
.getTracer(spanOptions.packageName, spanOptions.packageVersion)
.startSpan(name, toSpanOptions(spanOptions));
const ctx = spanOptions?.tracingContext || context.active();
return {
span: new OpenTelemetrySpanWrapper(span),
tracingContext: trace.setSpan(ctx, span),
};
}
withContext<
CallbackArgs extends unknown[],
Callback extends (...args: CallbackArgs) => ReturnType<Callback>
>(
tracingContext: TracingContext,
callback: Callback,
...callbackArgs: CallbackArgs
): ReturnType<Callback> {
return context.with(
tracingContext,
callback,
/** Assume caller will bind `this` or use arrow functions */ undefined,
...callbackArgs
);
}
parseTraceparentHeader(traceparentHeader: string): TracingContext {
return propagator.extract(
context.active(),
{ traceparent: traceparentHeader },
defaultTextMapGetter
);
}
createRequestHeaders(tracingContext?: TracingContext): Record<string, string> {
const headers: Record<string, string> = {};
propagator.inject(tracingContext || context.active(), headers, defaultTextMapSetter);
return headers;
}
}