@temporalio/interceptors-opentelemetry 1.14.2-canary-release-testing.0 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/instrumentation.d.ts +11 -0
- package/lib/instrumentation.js +24 -1
- package/lib/instrumentation.js.map +1 -1
- package/lib/plugin.d.ts +31 -0
- package/lib/plugin.js +66 -0
- package/lib/plugin.js.map +1 -0
- package/lib/worker/index.d.ts +36 -3
- package/lib/worker/index.js +105 -6
- package/lib/worker/index.js.map +1 -1
- package/lib/workflow/context-manager.js +0 -1
- package/lib/workflow/context-manager.js.map +1 -1
- package/lib/workflow/definitions.d.ts +16 -2
- package/lib/workflow/definitions.js +8 -0
- package/lib/workflow/definitions.js.map +1 -1
- package/lib/workflow/index.js +3 -3
- package/lib/workflow/index.js.map +1 -1
- package/lib/workflow/span-exporter.js +9 -1
- package/lib/workflow/span-exporter.js.map +1 -1
- package/lib/workflow-interceptors.d.ts +3 -0
- package/lib/workflow-interceptors.js +12 -0
- package/lib/workflow-interceptors.js.map +1 -0
- package/package.json +12 -10
- package/src/index.ts +1 -0
- package/src/instrumentation.ts +24 -1
- package/src/plugin.ts +85 -0
- package/src/worker/index.ts +149 -5
- package/src/workflow/context-manager.ts +1 -1
- package/src/workflow/definitions.ts +16 -3
- package/src/workflow/index.ts +4 -3
- package/src/workflow/span-exporter.ts +10 -2
- package/src/workflow-interceptors.ts +14 -0
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -24,6 +24,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.OpenTelemetryWorkflowClientCallsInterceptor = exports.OpenTelemetryWorkflowClientInterceptor = void 0;
|
|
27
|
+
__exportStar(require("./plugin"), exports);
|
|
27
28
|
__exportStar(require("./workflow"), exports);
|
|
28
29
|
__exportStar(require("./worker"), exports);
|
|
29
30
|
var client_1 = require("./client");
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;AAEH,6CAA2B;AAC3B,2CAAyB;AACzB,mCAIkB;AAHhB,gIAAA,sCAAsC,OAAA;AACtC,qEAAqE;AACrE,qIAAA,sCAAsC,OAA+C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;AAEH,2CAAyB;AACzB,6CAA2B;AAC3B,2CAAyB;AACzB,mCAIkB;AAHhB,gIAAA,sCAAsC,OAAA;AACtC,qEAAqE;AACrE,qIAAA,sCAAsC,OAA+C"}
|
package/lib/instrumentation.d.ts
CHANGED
|
@@ -26,10 +26,21 @@ export declare const NEXUS_ENDPOINT_ATTR_KEY = "temporalNexusEndpoint";
|
|
|
26
26
|
* If found, return an otel Context deserialized from the provided headers
|
|
27
27
|
*/
|
|
28
28
|
export declare function extractContextFromHeaders(headers: Headers): otel.Context | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* If found, return an otel Context deserialized from the provided Nexus headers.
|
|
31
|
+
*
|
|
32
|
+
* Nexus headers are plain `Record<string, string>`, so we extract the context
|
|
33
|
+
* directly from the string map.
|
|
34
|
+
*/
|
|
35
|
+
export declare function extractContextFromNexusHeaders(headers: Record<string, string>): otel.Context | undefined;
|
|
29
36
|
/**
|
|
30
37
|
* Given headers, return new headers with the current otel context inserted
|
|
31
38
|
*/
|
|
32
39
|
export declare function headersWithContext(headers: Headers): Headers;
|
|
40
|
+
/**
|
|
41
|
+
* Given Nexus headers, return new headers with the current otel context injected directly
|
|
42
|
+
*/
|
|
43
|
+
export declare function nexusHeadersWithContext(headers: Record<string, string>): Record<string, string>;
|
|
33
44
|
export interface InstrumentOptions<T> {
|
|
34
45
|
tracer: otel.Tracer;
|
|
35
46
|
spanName: string;
|
package/lib/instrumentation.js
CHANGED
|
@@ -25,7 +25,9 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.NEXUS_ENDPOINT_ATTR_KEY = exports.NEXUS_OPERATION_ATTR_KEY = exports.NEXUS_SERVICE_ATTR_KEY = exports.TERMINATE_REASON_ATTR_KEY = exports.UPDATE_ID_ATTR_KEY = exports.ACTIVITY_ID_ATTR_KEY = exports.WORKFLOW_ID_ATTR_KEY = exports.RUN_ID_ATTR_KEY = exports.TRACE_HEADER = void 0;
|
|
27
27
|
exports.extractContextFromHeaders = extractContextFromHeaders;
|
|
28
|
+
exports.extractContextFromNexusHeaders = extractContextFromNexusHeaders;
|
|
28
29
|
exports.headersWithContext = headersWithContext;
|
|
30
|
+
exports.nexusHeadersWithContext = nexusHeadersWithContext;
|
|
29
31
|
exports.instrument = instrument;
|
|
30
32
|
exports.instrumentSync = instrumentSync;
|
|
31
33
|
/**
|
|
@@ -64,6 +66,18 @@ function extractContextFromHeaders(headers) {
|
|
|
64
66
|
const textMap = payloadConverter.fromPayload(encodedSpanContext);
|
|
65
67
|
return otel.propagation.extract(otel.context.active(), textMap, otel.defaultTextMapGetter);
|
|
66
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* If found, return an otel Context deserialized from the provided Nexus headers.
|
|
71
|
+
*
|
|
72
|
+
* Nexus headers are plain `Record<string, string>`, so we extract the context
|
|
73
|
+
* directly from the string map.
|
|
74
|
+
*/
|
|
75
|
+
function extractContextFromNexusHeaders(headers) {
|
|
76
|
+
if (Object.keys(headers).length === 0) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
return otel.propagation.extract(otel.context.active(), headers, otel.defaultTextMapGetter);
|
|
80
|
+
}
|
|
67
81
|
/**
|
|
68
82
|
* Given headers, return new headers with the current otel context inserted
|
|
69
83
|
*/
|
|
@@ -72,6 +86,14 @@ function headersWithContext(headers) {
|
|
|
72
86
|
otel.propagation.inject(otel.context.active(), carrier, otel.defaultTextMapSetter);
|
|
73
87
|
return { ...headers, [exports.TRACE_HEADER]: payloadConverter.toPayload(carrier) };
|
|
74
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Given Nexus headers, return new headers with the current otel context injected directly
|
|
91
|
+
*/
|
|
92
|
+
function nexusHeadersWithContext(headers) {
|
|
93
|
+
const carrier = {};
|
|
94
|
+
otel.propagation.inject(otel.context.active(), carrier, otel.defaultTextMapSetter);
|
|
95
|
+
return { ...headers, ...carrier };
|
|
96
|
+
}
|
|
75
97
|
async function wrapWithSpan(span, fn, acceptableErrors) {
|
|
76
98
|
try {
|
|
77
99
|
const ret = await fn(span);
|
|
@@ -104,7 +126,8 @@ function maybeAddErrorToSpan(err, span, acceptableErrors) {
|
|
|
104
126
|
const isBenignErr = err instanceof common_1.ApplicationFailure && err.category === common_1.ApplicationFailureCategory.BENIGN;
|
|
105
127
|
if (acceptableErrors === undefined || !acceptableErrors(err)) {
|
|
106
128
|
const statusCode = isBenignErr ? otel.SpanStatusCode.UNSET : otel.SpanStatusCode.ERROR;
|
|
107
|
-
|
|
129
|
+
const message = err != null && typeof err.message === 'string' ? err.message : String(err);
|
|
130
|
+
span.setStatus({ code: statusCode, message });
|
|
108
131
|
span.recordException(err);
|
|
109
132
|
}
|
|
110
133
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../src/instrumentation.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,8DAOC;AAKD,gDAIC;
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../src/instrumentation.ts"],"names":[],"mappings":"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"}
|
package/lib/plugin.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { SpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
2
|
+
import { Resource } from '@opentelemetry/resources';
|
|
3
|
+
import { SimplePlugin } from '@temporalio/plugin';
|
|
4
|
+
import { ReplayWorkerOptions, WorkerOptions } from '@temporalio/worker';
|
|
5
|
+
import { InterceptorOptions } from './client';
|
|
6
|
+
/**
|
|
7
|
+
* Configuration options for {@link OpenTelemetryPlugin}.
|
|
8
|
+
*
|
|
9
|
+
* @experimental Plugins is an experimental feature; APIs may change without notice.
|
|
10
|
+
*/
|
|
11
|
+
export interface OpenTelemetryPluginOptions extends InterceptorOptions {
|
|
12
|
+
/** OpenTelemetry resource attributes to attach to exported spans */
|
|
13
|
+
readonly resource: Resource;
|
|
14
|
+
/** Exporter used to send spans to a tracing backend */
|
|
15
|
+
readonly spanProcessor: SpanProcessor;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A plugin that adds OpenTelemetry tracing.
|
|
19
|
+
*
|
|
20
|
+
* Configures Client, Activity, and Workflow interceptors for trace propagation and injects
|
|
21
|
+
* a span exporter sink for Workflow spans.
|
|
22
|
+
*
|
|
23
|
+
* @experimental Plugins is an experimental feature; APIs may change without notice.
|
|
24
|
+
*/
|
|
25
|
+
export declare class OpenTelemetryPlugin extends SimplePlugin {
|
|
26
|
+
readonly otelOptions: OpenTelemetryPluginOptions;
|
|
27
|
+
constructor(otelOptions: OpenTelemetryPluginOptions);
|
|
28
|
+
configureWorker(options: WorkerOptions): WorkerOptions;
|
|
29
|
+
configureReplayWorker(options: ReplayWorkerOptions): ReplayWorkerOptions;
|
|
30
|
+
private injectSinks;
|
|
31
|
+
}
|
package/lib/plugin.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenTelemetryPlugin = void 0;
|
|
4
|
+
const plugin_1 = require("@temporalio/plugin");
|
|
5
|
+
const client_1 = require("./client");
|
|
6
|
+
const worker_1 = require("./worker");
|
|
7
|
+
/**
|
|
8
|
+
* A plugin that adds OpenTelemetry tracing.
|
|
9
|
+
*
|
|
10
|
+
* Configures Client, Activity, and Workflow interceptors for trace propagation and injects
|
|
11
|
+
* a span exporter sink for Workflow spans.
|
|
12
|
+
*
|
|
13
|
+
* @experimental Plugins is an experimental feature; APIs may change without notice.
|
|
14
|
+
*/
|
|
15
|
+
class OpenTelemetryPlugin extends plugin_1.SimplePlugin {
|
|
16
|
+
otelOptions;
|
|
17
|
+
constructor(otelOptions) {
|
|
18
|
+
const workflowInterceptorsPath = require.resolve('./workflow-interceptors');
|
|
19
|
+
const interceptorOptions = otelOptions.tracer ? { tracer: otelOptions.tracer } : {};
|
|
20
|
+
super({
|
|
21
|
+
name: 'OpenTelemetryPlugin',
|
|
22
|
+
clientInterceptors: {
|
|
23
|
+
workflow: [new client_1.OpenTelemetryWorkflowClientInterceptor(interceptorOptions)],
|
|
24
|
+
},
|
|
25
|
+
workerInterceptors: {
|
|
26
|
+
client: {
|
|
27
|
+
workflow: [new client_1.OpenTelemetryWorkflowClientInterceptor(interceptorOptions)],
|
|
28
|
+
},
|
|
29
|
+
workflowModules: [workflowInterceptorsPath],
|
|
30
|
+
activity: [
|
|
31
|
+
(ctx) => ({
|
|
32
|
+
inbound: new worker_1.OpenTelemetryActivityInboundInterceptor(ctx, interceptorOptions),
|
|
33
|
+
outbound: new worker_1.OpenTelemetryActivityOutboundInterceptor(ctx),
|
|
34
|
+
}),
|
|
35
|
+
],
|
|
36
|
+
nexus: [
|
|
37
|
+
(ctx) => ({
|
|
38
|
+
inbound: new worker_1.OpenTelemetryNexusInboundInterceptor(ctx, interceptorOptions),
|
|
39
|
+
outbound: new worker_1.OpenTelemetryNexusOutboundInterceptor(ctx),
|
|
40
|
+
}),
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
this.otelOptions = otelOptions;
|
|
45
|
+
}
|
|
46
|
+
configureWorker(options) {
|
|
47
|
+
return super.configureWorker(this.injectSinks(options));
|
|
48
|
+
}
|
|
49
|
+
configureReplayWorker(options) {
|
|
50
|
+
return super.configureReplayWorker(this.injectSinks(options));
|
|
51
|
+
}
|
|
52
|
+
injectSinks(options) {
|
|
53
|
+
const sinks = {
|
|
54
|
+
exporter: (0, worker_1.makeWorkflowExporter)(this.otelOptions.spanProcessor, this.otelOptions.resource),
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
...options,
|
|
58
|
+
sinks: {
|
|
59
|
+
...options.sinks,
|
|
60
|
+
...sinks,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.OpenTelemetryPlugin = OpenTelemetryPlugin;
|
|
66
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":";;;AAEA,+CAAkD;AAElD,qCAAsF;AACtF,qCAMkB;AAelB;;;;;;;GAOG;AACH,MAAa,mBAAoB,SAAQ,qBAAY;IAC9B;IAArB,YAAqB,WAAuC;QAC1D,MAAM,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAC5E,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpF,KAAK,CAAC;YACJ,IAAI,EAAE,qBAAqB;YAC3B,kBAAkB,EAAE;gBAClB,QAAQ,EAAE,CAAC,IAAI,+CAAsC,CAAC,kBAAkB,CAAC,CAAC;aAC3E;YACD,kBAAkB,EAAE;gBAClB,MAAM,EAAE;oBACN,QAAQ,EAAE,CAAC,IAAI,+CAAsC,CAAC,kBAAkB,CAAC,CAAC;iBAC3E;gBACD,eAAe,EAAE,CAAC,wBAAwB,CAAC;gBAC3C,QAAQ,EAAE;oBACR,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;wBACR,OAAO,EAAE,IAAI,gDAAuC,CAAC,GAAG,EAAE,kBAAkB,CAAC;wBAC7E,QAAQ,EAAE,IAAI,iDAAwC,CAAC,GAAG,CAAC;qBAC5D,CAAC;iBACH;gBACD,KAAK,EAAE;oBACL,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;wBACR,OAAO,EAAE,IAAI,6CAAoC,CAAC,GAAG,EAAE,kBAAkB,CAAC;wBAC1E,QAAQ,EAAE,IAAI,8CAAqC,CAAC,GAAG,CAAC;qBACzD,CAAC;iBACH;aACF;SACF,CAAC,CAAC;QA1BgB,gBAAW,GAAX,WAAW,CAA4B;IA2B5D,CAAC;IAED,eAAe,CAAC,OAAsB;QACpC,OAAO,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,qBAAqB,CAAC,OAA4B;QAChD,OAAO,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;IAEO,WAAW,CAA2C,OAAU;QACtE,MAAM,KAAK,GAAsC;YAC/C,QAAQ,EAAE,IAAA,6BAAoB,EAAC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;SAC1F,CAAC;QACF,OAAO;YACL,GAAG,OAAO;YACV,KAAK,EAAE;gBACL,GAAG,OAAO,CAAC,KAAK;gBAChB,GAAG,KAAK;aACT;SACF,CAAC;IACJ,CAAC;CACF;AAlDD,kDAkDC"}
|
package/lib/worker/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as otel from '@opentelemetry/api';
|
|
2
2
|
import type { Resource } from '@opentelemetry/resources';
|
|
3
|
-
import type { SpanExporter } from '@opentelemetry/sdk-trace-base';
|
|
3
|
+
import type { SpanExporter, SpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
4
|
+
import type * as nexus from 'nexus-rpc';
|
|
4
5
|
import type { Context as ActivityContext } from '@temporalio/activity';
|
|
5
|
-
import type { Next, ActivityInboundCallsInterceptor, ActivityOutboundCallsInterceptor, InjectedSink, GetLogAttributesInput, GetMetricTagsInput, ActivityExecuteInput } from '@temporalio/worker';
|
|
6
|
+
import type { Next, ActivityInboundCallsInterceptor, ActivityOutboundCallsInterceptor, NexusInboundCallsInterceptor, NexusOutboundCallsInterceptor, NexusStartOperationInput, NexusStartOperationOutput, NexusCancelOperationInput, InjectedSink, GetLogAttributesInput, GetMetricTagsInput, ActivityExecuteInput } from '@temporalio/worker';
|
|
6
7
|
import { type OpenTelemetryWorkflowExporter } from '../workflow/definitions';
|
|
7
8
|
export interface InterceptorOptions {
|
|
8
9
|
readonly tracer?: otel.Tracer;
|
|
@@ -30,7 +31,39 @@ export declare class OpenTelemetryActivityOutboundInterceptor implements Activit
|
|
|
30
31
|
getLogAttributes(input: GetLogAttributesInput, next: Next<ActivityOutboundCallsInterceptor, 'getLogAttributes'>): Record<string, unknown>;
|
|
31
32
|
getMetricTags(input: GetMetricTagsInput, next: Next<ActivityOutboundCallsInterceptor, 'getMetricTags'>): GetMetricTagsInput;
|
|
32
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Intercepts inbound Nexus Operation calls on the worker.
|
|
36
|
+
*
|
|
37
|
+
* Wraps `startOperation` and `cancelOperation` in opentelemetry Spans, linking to a parent Span context
|
|
38
|
+
* if one is provided in the Nexus request headers.
|
|
39
|
+
*/
|
|
40
|
+
export declare class OpenTelemetryNexusInboundInterceptor implements NexusInboundCallsInterceptor {
|
|
41
|
+
protected readonly ctx: nexus.OperationContext;
|
|
42
|
+
protected readonly tracer: otel.Tracer;
|
|
43
|
+
constructor(ctx: nexus.OperationContext, options?: InterceptorOptions);
|
|
44
|
+
startOperation(input: NexusStartOperationInput, next: Next<NexusInboundCallsInterceptor, 'startOperation'>): Promise<NexusStartOperationOutput>;
|
|
45
|
+
cancelOperation(input: NexusCancelOperationInput, next: Next<NexusInboundCallsInterceptor, 'cancelOperation'>): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Intercepts outbound calls from a Nexus Operation handler.
|
|
49
|
+
*
|
|
50
|
+
* Attaches OpenTelemetry context tracing attributes to emitted log messages and metrics.
|
|
51
|
+
*/
|
|
52
|
+
export declare class OpenTelemetryNexusOutboundInterceptor implements NexusOutboundCallsInterceptor {
|
|
53
|
+
protected readonly ctx: nexus.OperationContext;
|
|
54
|
+
constructor(ctx: nexus.OperationContext);
|
|
55
|
+
getLogAttributes(input: GetLogAttributesInput, next: Next<NexusOutboundCallsInterceptor, 'getLogAttributes'>): Record<string, unknown>;
|
|
56
|
+
getMetricTags(input: GetMetricTagsInput, next: Next<NexusOutboundCallsInterceptor, 'getMetricTags'>): GetMetricTagsInput;
|
|
57
|
+
}
|
|
33
58
|
/**
|
|
34
59
|
* Takes an opentelemetry SpanExporter and turns it into an injected Workflow span exporter sink
|
|
60
|
+
*
|
|
61
|
+
* @deprecated Do not directly pass a `SpanExporter`. Pass a `SpanProcessor` instead to ensure proper handling of async attributes.
|
|
62
|
+
*/
|
|
63
|
+
export declare function makeWorkflowExporter(spanExporter: SpanExporter, resource: Resource): InjectedSink<OpenTelemetryWorkflowExporter>;
|
|
64
|
+
/**
|
|
65
|
+
* Takes an opentelemetry SpanProcessor and turns it into an injected Workflow span exporter sink.
|
|
66
|
+
*
|
|
67
|
+
* For backward compatibility, passing a `SpanExporter` directly is still supported.
|
|
35
68
|
*/
|
|
36
|
-
export declare function makeWorkflowExporter(
|
|
69
|
+
export declare function makeWorkflowExporter(spanProcessor: SpanProcessor, resource: Resource): InjectedSink<OpenTelemetryWorkflowExporter>;
|
package/lib/worker/index.js
CHANGED
|
@@ -23,9 +23,11 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.OpenTelemetryActivityOutboundInterceptor = exports.OpenTelemetryActivityInboundInterceptor = void 0;
|
|
26
|
+
exports.OpenTelemetryNexusOutboundInterceptor = exports.OpenTelemetryNexusInboundInterceptor = exports.OpenTelemetryActivityOutboundInterceptor = exports.OpenTelemetryActivityInboundInterceptor = void 0;
|
|
27
27
|
exports.makeWorkflowExporter = makeWorkflowExporter;
|
|
28
28
|
const otel = __importStar(require("@opentelemetry/api"));
|
|
29
|
+
const api_1 = require("@opentelemetry/api");
|
|
30
|
+
const common_1 = require("@temporalio/common");
|
|
29
31
|
const instrumentation_1 = require("../instrumentation");
|
|
30
32
|
const definitions_1 = require("../workflow/definitions");
|
|
31
33
|
/**
|
|
@@ -54,6 +56,7 @@ class OpenTelemetryActivityInboundInterceptor {
|
|
|
54
56
|
return next(input);
|
|
55
57
|
},
|
|
56
58
|
context,
|
|
59
|
+
acceptableErrors: (err) => err instanceof common_1.CompleteAsyncError,
|
|
57
60
|
});
|
|
58
61
|
}
|
|
59
62
|
}
|
|
@@ -101,9 +104,92 @@ class OpenTelemetryActivityOutboundInterceptor {
|
|
|
101
104
|
}
|
|
102
105
|
exports.OpenTelemetryActivityOutboundInterceptor = OpenTelemetryActivityOutboundInterceptor;
|
|
103
106
|
/**
|
|
104
|
-
*
|
|
107
|
+
* Intercepts inbound Nexus Operation calls on the worker.
|
|
108
|
+
*
|
|
109
|
+
* Wraps `startOperation` and `cancelOperation` in opentelemetry Spans, linking to a parent Span context
|
|
110
|
+
* if one is provided in the Nexus request headers.
|
|
105
111
|
*/
|
|
106
|
-
|
|
112
|
+
class OpenTelemetryNexusInboundInterceptor {
|
|
113
|
+
ctx;
|
|
114
|
+
tracer;
|
|
115
|
+
constructor(ctx, options) {
|
|
116
|
+
this.ctx = ctx;
|
|
117
|
+
this.tracer = options?.tracer ?? otel.trace.getTracer('@temporalio/interceptor-nexus');
|
|
118
|
+
}
|
|
119
|
+
async startOperation(input, next) {
|
|
120
|
+
const context = (0, instrumentation_1.extractContextFromNexusHeaders)(input.ctx.headers);
|
|
121
|
+
const spanName = `${definitions_1.SpanName.NEXUS_START_OPERATION_EXECUTE}${definitions_1.SPAN_DELIMITER}${input.ctx.service}/${input.ctx.operation}`;
|
|
122
|
+
return await (0, instrumentation_1.instrument)({
|
|
123
|
+
tracer: this.tracer,
|
|
124
|
+
spanName,
|
|
125
|
+
fn: (span) => {
|
|
126
|
+
span.setAttribute(instrumentation_1.NEXUS_SERVICE_ATTR_KEY, input.ctx.service);
|
|
127
|
+
span.setAttribute(instrumentation_1.NEXUS_OPERATION_ATTR_KEY, input.ctx.operation);
|
|
128
|
+
return next(input);
|
|
129
|
+
},
|
|
130
|
+
context,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async cancelOperation(input, next) {
|
|
134
|
+
const context = (0, instrumentation_1.extractContextFromNexusHeaders)(input.ctx.headers);
|
|
135
|
+
const spanName = `${definitions_1.SpanName.NEXUS_CANCEL_OPERATION_EXECUTE}${definitions_1.SPAN_DELIMITER}${input.ctx.service}/${input.ctx.operation}`;
|
|
136
|
+
return await (0, instrumentation_1.instrument)({
|
|
137
|
+
tracer: this.tracer,
|
|
138
|
+
spanName,
|
|
139
|
+
fn: (span) => {
|
|
140
|
+
span.setAttribute(instrumentation_1.NEXUS_SERVICE_ATTR_KEY, input.ctx.service);
|
|
141
|
+
span.setAttribute(instrumentation_1.NEXUS_OPERATION_ATTR_KEY, input.ctx.operation);
|
|
142
|
+
return next(input);
|
|
143
|
+
},
|
|
144
|
+
context,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
exports.OpenTelemetryNexusInboundInterceptor = OpenTelemetryNexusInboundInterceptor;
|
|
149
|
+
/**
|
|
150
|
+
* Intercepts outbound calls from a Nexus Operation handler.
|
|
151
|
+
*
|
|
152
|
+
* Attaches OpenTelemetry context tracing attributes to emitted log messages and metrics.
|
|
153
|
+
*/
|
|
154
|
+
class OpenTelemetryNexusOutboundInterceptor {
|
|
155
|
+
ctx;
|
|
156
|
+
constructor(ctx) {
|
|
157
|
+
this.ctx = ctx;
|
|
158
|
+
}
|
|
159
|
+
getLogAttributes(input, next) {
|
|
160
|
+
const span = otel.trace.getSpan(otel.context.active());
|
|
161
|
+
const spanContext = span?.spanContext();
|
|
162
|
+
if (spanContext && otel.isSpanContextValid(spanContext)) {
|
|
163
|
+
return next({
|
|
164
|
+
trace_id: spanContext.traceId,
|
|
165
|
+
span_id: spanContext.spanId,
|
|
166
|
+
trace_flags: `0${spanContext.traceFlags.toString(16)}`,
|
|
167
|
+
...input,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
return next(input);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
getMetricTags(input, next) {
|
|
175
|
+
const span = otel.trace.getSpan(otel.context.active());
|
|
176
|
+
const spanContext = span?.spanContext();
|
|
177
|
+
if (spanContext && otel.isSpanContextValid(spanContext)) {
|
|
178
|
+
return next({
|
|
179
|
+
trace_id: spanContext.traceId,
|
|
180
|
+
span_id: spanContext.spanId,
|
|
181
|
+
trace_flags: `0${spanContext.traceFlags.toString(16)}`,
|
|
182
|
+
...input,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
return next(input);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.OpenTelemetryNexusOutboundInterceptor = OpenTelemetryNexusOutboundInterceptor;
|
|
191
|
+
function makeWorkflowExporter(processorOrExporter, resource) {
|
|
192
|
+
const givenSpanProcessor = isSpanProcessor(processorOrExporter);
|
|
107
193
|
return {
|
|
108
194
|
export: {
|
|
109
195
|
fn: (info, spanData) => {
|
|
@@ -112,17 +198,30 @@ function makeWorkflowExporter(exporter, resource) {
|
|
|
112
198
|
// Spans are copied over from the isolate and are converted to ReadableSpan instances
|
|
113
199
|
return extractReadableSpan(serialized, resource);
|
|
114
200
|
});
|
|
115
|
-
|
|
116
|
-
|
|
201
|
+
if (givenSpanProcessor) {
|
|
202
|
+
spans.forEach((span) => processorOrExporter.onEnd(span));
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
// Ignore the export result for simplicity
|
|
206
|
+
processorOrExporter.export(spans, () => undefined);
|
|
207
|
+
}
|
|
117
208
|
},
|
|
118
209
|
},
|
|
119
210
|
};
|
|
120
211
|
}
|
|
212
|
+
function isSpanProcessor(obj) {
|
|
213
|
+
return 'onEnd' in obj && typeof obj.onEnd === 'function';
|
|
214
|
+
}
|
|
121
215
|
/**
|
|
122
216
|
* Deserialize a serialized span created by the Workflow isolate
|
|
123
217
|
*/
|
|
124
218
|
function extractReadableSpan(serializable, resource) {
|
|
125
|
-
const { spanContext, ...rest } = serializable;
|
|
219
|
+
const { spanContext: { traceState, ...restSpanContext }, ...rest } = serializable;
|
|
220
|
+
const spanContext = {
|
|
221
|
+
// Reconstruct the TraceState from the serialized string.
|
|
222
|
+
traceState: traceState ? (0, api_1.createTraceState)(traceState) : undefined,
|
|
223
|
+
...restSpanContext,
|
|
224
|
+
};
|
|
126
225
|
return {
|
|
127
226
|
spanContext() {
|
|
128
227
|
return spanContext;
|
package/lib/worker/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../src/workflow/context-manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,yDAA2C;AAE3C,MAAa,cAAc;IACzB,sEAAsE;IAC5D,OAAO,GAAoC,IAAK,UAAkB,CAAC,iBAAiB,EAAE,CAAC;IAEjG,MAAM;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;IACtD,CAAC;IAED,IAAI,CAAI,OAAqB,EAAE,MAAS;QACtC,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,IAAI,SAAS,CAAC,2CAA2C,OAAO,MAAM,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,8JAA8J;QAC9J,MAAM,cAAc,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,QAAQ,EAAE;YAC9C,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,MAAM,CAAC,MAAM;SACrB,CAAC,CAAC;QACH;;;WAGG;
|
|
1
|
+
{"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../src/workflow/context-manager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AACA,yDAA2C;AAE3C,MAAa,cAAc;IACzB,sEAAsE;IAC5D,OAAO,GAAoC,IAAK,UAAkB,CAAC,iBAAiB,EAAE,CAAC;IAEjG,MAAM;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;IACtD,CAAC;IAED,IAAI,CAAI,OAAqB,EAAE,MAAS;QACtC,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,MAAM,IAAI,SAAS,CAAC,2CAA2C,OAAO,MAAM,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,8JAA8J;QAC9J,MAAM,cAAc,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,cAAc,EAAE,QAAQ,EAAE;YAC9C,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,MAAM,CAAC,MAAM;SACrB,CAAC,CAAC;QACH;;;WAGG;QAEH,OAAO,cAAqB,CAAC;IAC/B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CACF,OAAqB,EACrB,EAAK,EACL,OAA8B,EAC9B,GAAG,IAAO;QAEV,MAAM,EAAE,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IAChD,CAAC;CACF;AAjDD,wCAiDC"}
|
|
@@ -2,13 +2,19 @@ import * as otel from '@opentelemetry/api';
|
|
|
2
2
|
import * as tracing from '@opentelemetry/sdk-trace-base';
|
|
3
3
|
import { InstrumentationLibrary } from '@opentelemetry/core';
|
|
4
4
|
import type { Sink, Sinks } from '@temporalio/workflow';
|
|
5
|
+
/**
|
|
6
|
+
* Serializable version of SpanContext where traceState is converted to a string.
|
|
7
|
+
*/
|
|
8
|
+
export type SerializableSpanContext = Omit<otel.SpanContext, 'traceState'> & {
|
|
9
|
+
traceState?: string;
|
|
10
|
+
};
|
|
5
11
|
/**
|
|
6
12
|
* Serializable version of the opentelemetry Span for cross isolate copying
|
|
7
13
|
*/
|
|
8
14
|
export interface SerializableSpan {
|
|
9
15
|
readonly name: string;
|
|
10
16
|
readonly kind: otel.SpanKind;
|
|
11
|
-
readonly spanContext:
|
|
17
|
+
readonly spanContext: SerializableSpanContext;
|
|
12
18
|
readonly parentSpanId?: string;
|
|
13
19
|
readonly startTime: otel.HrTime;
|
|
14
20
|
readonly endTime: otel.HrTime;
|
|
@@ -108,6 +114,14 @@ export declare enum SpanName {
|
|
|
108
114
|
/**
|
|
109
115
|
* Nexus operation is started
|
|
110
116
|
*/
|
|
111
|
-
NEXUS_OPERATION_START = "StartNexusOperation"
|
|
117
|
+
NEXUS_OPERATION_START = "StartNexusOperation",
|
|
118
|
+
/**
|
|
119
|
+
* Nexus operation is executing
|
|
120
|
+
*/
|
|
121
|
+
NEXUS_START_OPERATION_EXECUTE = "RunStartNexusOperation",
|
|
122
|
+
/**
|
|
123
|
+
* Nexus operation cancel is executing
|
|
124
|
+
*/
|
|
125
|
+
NEXUS_CANCEL_OPERATION_EXECUTE = "RunCancelNexusOperation"
|
|
112
126
|
}
|
|
113
127
|
export declare const SPAN_DELIMITER = ":";
|
|
@@ -79,6 +79,14 @@ var SpanName;
|
|
|
79
79
|
* Nexus operation is started
|
|
80
80
|
*/
|
|
81
81
|
SpanName["NEXUS_OPERATION_START"] = "StartNexusOperation";
|
|
82
|
+
/**
|
|
83
|
+
* Nexus operation is executing
|
|
84
|
+
*/
|
|
85
|
+
SpanName["NEXUS_START_OPERATION_EXECUTE"] = "RunStartNexusOperation";
|
|
86
|
+
/**
|
|
87
|
+
* Nexus operation cancel is executing
|
|
88
|
+
*/
|
|
89
|
+
SpanName["NEXUS_CANCEL_OPERATION_EXECUTE"] = "RunCancelNexusOperation";
|
|
82
90
|
})(SpanName || (exports.SpanName = SpanName = {}));
|
|
83
91
|
exports.SPAN_DELIMITER = ':';
|
|
84
92
|
//# sourceMappingURL=definitions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/workflow/definitions.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/workflow/definitions.ts"],"names":[],"mappings":";;;AA6CA,IAAY,QAkGX;AAlGD,WAAY,QAAQ;IAClB;;OAEG;IACH,4CAAgC,CAAA;IAEhC;;OAEG;IACH,8CAAkC,CAAA;IAElC;;OAEG;IACH,kEAAsD,CAAA;IAEtD;;OAEG;IACH,4CAAgC,CAAA;IAEhC;;OAEG;IACH,yDAA6C,CAAA;IAE7C;;OAEG;IACH,kEAAsD,CAAA;IAEtD;;OAEG;IACH,mDAAuC,CAAA;IAEvC;;OAEG;IACH,iDAAqC,CAAA;IAErC;;OAEG;IACH,mDAAuC,CAAA;IAEvC;;OAEG;IACH,uDAA2C,CAAA;IAE3C;;OAEG;IACH,oDAAwC,CAAA;IAExC;;OAEG;IACH,8CAAkC,CAAA;IAElC;;OAEG;IACH,kDAAsC,CAAA;IAEtC;;OAEG;IACH,4CAAgC,CAAA;IAChC;;OAEG;IACH,uDAA2C,CAAA;IAC3C;;OAEG;IACH,4CAAgC,CAAA;IAChC;;OAEG;IACH,4CAAgC,CAAA;IAChC;;OAEG;IACH,6CAAiC,CAAA;IACjC;;OAEG;IACH,yDAA6C,CAAA;IAC7C;;OAEG;IACH,oEAAwD,CAAA;IACxD;;OAEG;IACH,sEAA0D,CAAA;AAC5D,CAAC,EAlGW,QAAQ,wBAAR,QAAQ,QAkGnB;AAEY,QAAA,cAAc,GAAG,GAAG,CAAC"}
|
package/lib/workflow/index.js
CHANGED
|
@@ -27,7 +27,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.OpenTelemetryInternalsInterceptor = exports.OpenTelemetryOutboundInterceptor = exports.OpenTelemetryInboundInterceptor = void 0;
|
|
30
|
-
/* eslint-disable import/order */
|
|
31
30
|
// eslint-disable-next-line import/no-unassigned-import
|
|
32
31
|
require("./runtime"); // Patch the Workflow isolate runtime for opentelemetry
|
|
33
32
|
const otel = __importStar(require("@opentelemetry/api"));
|
|
@@ -176,12 +175,13 @@ class OpenTelemetryOutboundInterceptor {
|
|
|
176
175
|
return next(input);
|
|
177
176
|
return await (0, instrumentation_1.instrument)({
|
|
178
177
|
tracer: this.tracer,
|
|
179
|
-
spanName: `${definitions_1.SpanName.NEXUS_OPERATION_START}${definitions_1.SPAN_DELIMITER}${input.service}
|
|
178
|
+
spanName: `${definitions_1.SpanName.NEXUS_OPERATION_START}${definitions_1.SPAN_DELIMITER}${input.service}/${input.operation}`,
|
|
180
179
|
fn: async (span) => {
|
|
181
180
|
span.setAttribute(instrumentation_1.NEXUS_SERVICE_ATTR_KEY, input.service);
|
|
182
181
|
span.setAttribute(instrumentation_1.NEXUS_OPERATION_ATTR_KEY, input.operation);
|
|
183
182
|
span.setAttribute(instrumentation_1.NEXUS_ENDPOINT_ATTR_KEY, input.endpoint);
|
|
184
|
-
|
|
183
|
+
const headers = (0, instrumentation_1.nexusHeadersWithContext)(input.headers);
|
|
184
|
+
return await next({ ...input, headers });
|
|
185
185
|
},
|
|
186
186
|
});
|
|
187
187
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAAuD;AACvD,qBAAmB,CAAC,uDAAuD;AAC3E,yDAA2C;AAC3C,uEAAyD;AAqBzD,wDAU4B;AAC5B,uDAAmD;AACnD,+CAAyD;AACzD,mDAA+C;AAC/C,yDAAyF;AAEzF,gDAA8B;AAE9B,IAAI,MAAM,GAA4B,SAAS,CAAC;AAChD,IAAI,cAAc,GAA+B,SAAS,CAAC;AAE3D,SAAS,SAAS;IAChB,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,cAAc,GAAG,IAAI,gCAAc,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACnD,QAAQ,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,mBAAmB,CAAC,IAAI,4BAAY,EAAE,CAAC,CAAC,CAAC;QAC/E,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;QACtC,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAa,+BAA+B;IACvB,MAAM,GAAG,SAAS,EAAE,CAAC;IAEjC,KAAK,CAAC,OAAO,CAClB,KAA2B,EAC3B,IAAsD;QAEtD,MAAM,OAAO,GAAG,IAAA,2CAAyB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,IAAA,+BAAY,GAAE,CAAC,OAAO,CAAC,2BAAQ,CAAC,yCAAyC,CAAC;YAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAEzG,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,gBAAgB,GAAG,4BAAc,GAAG,IAAA,+BAAY,GAAE,CAAC,YAAY,EAAE;YACvF,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACrB,OAAO;YACP,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,YAAY,gCAAa;SACxD,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,YAAY,CACvB,KAAkB,EAClB,IAA2D;QAE3D,mDAAmD;QACnD,IAAI,CAAC,IAAA,+BAAY,GAAE,CAAC,OAAO,CAAC,2BAAQ,CAAC,6CAA6C,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QAExG,MAAM,OAAO,GAAG,IAAA,2CAAyB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,IAAA,+BAAY,GAAE,CAAC,OAAO,CAAC,2BAAQ,CAAC,yCAAyC,CAAC;YAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAEzG,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,sBAAsB,GAAG,4BAAc,GAAG,KAAK,CAAC,UAAU,EAAE;YAClF,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACrB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,YAAY,CACvB,KAAkB,EAClB,IAA2D;QAE3D,IAAI,CAAC,IAAA,+BAAY,GAAE,CAAC,OAAO,CAAC,2BAAQ,CAAC,8CAA8C,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QAEzG,MAAM,OAAO,GAAG,IAAA,2CAAyB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEzD,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,sBAAsB,GAAG,4BAAc,GAAG,KAAK,CAAC,IAAI,EAAE;YAC5E,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;gBACX,IAAI,CAAC,YAAY,CAAC,oCAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACtD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAEM,cAAc,CAAC,KAAkB,EAAE,IAA6D;QACrG,IAAI,CAAC,IAAA,+BAAY,GAAE,CAAC,OAAO,CAAC,2BAAQ,CAAC,8CAA8C,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QAEzG,MAAM,OAAO,GAAG,IAAA,2CAAyB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzD,IAAA,gCAAc,EAAC;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,wBAAwB,GAAG,4BAAc,GAAG,KAAK,CAAC,IAAI,EAAE;YAC9E,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;gBACX,IAAI,CAAC,YAAY,CAAC,oCAAkB,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACtD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,WAAW,CACtB,KAAiB,EACjB,IAA0D;QAE1D,IAAI,CAAC,IAAA,+BAAY,GAAE,CAAC,OAAO,CAAC,2BAAQ,CAAC,8CAA8C,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QAEzG,MAAM,OAAO,GAAG,IAAA,2CAAyB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEzD,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,qBAAqB,GAAG,4BAAc,GAAG,KAAK,CAAC,SAAS,EAAE;YAChF,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACrB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;CACF;AAtFD,0EAsFC;AAED;;;;;;GAMG;AACH,MAAa,gCAAgC;IACxB,MAAM,GAAG,SAAS,EAAE,CAAC;IAEjC,KAAK,CAAC,gBAAgB,CAC3B,KAAoB,EACpB,IAAgE;QAEhE,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,cAAc,GAAG,4BAAc,GAAG,KAAK,CAAC,YAAY,EAAE;YAC5E,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,+BAAY,GAAE,CAAC,OAAO,CAAC,2BAAQ,CAAC,yCAAyC,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEzG,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAChC,KAAyB,EACzB,IAAqE;QAErE,oDAAoD;QACpD,IAAI,CAAC,IAAA,+BAAY,GAAE,CAAC,OAAO,CAAC,2BAAQ,CAAC,8CAA8C,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QAEzG,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,cAAc,GAAG,4BAAc,GAAG,KAAK,CAAC,YAAY,EAAE;YAC5E,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,+BAAY,GAAE,CAAC,OAAO,CAAC,2BAAQ,CAAC,yCAAyC,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEzG,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC9B,KAA+B,EAC/B,IAAmE;QAEnE,IAAI,CAAC,IAAA,+BAAY,GAAE,CAAC,OAAO,CAAC,2BAAQ,CAAC,8CAA8C,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QAEzG,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,qBAAqB,GAAG,4BAAc,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,EAAE;YACjG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACjB,IAAI,CAAC,YAAY,CAAC,wCAAsB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBACzD,IAAI,CAAC,YAAY,CAAC,0CAAwB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC7D,IAAI,CAAC,YAAY,CAAC,yCAAuB,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC3D,MAAM,OAAO,GAAG,IAAA,yCAAuB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACvD,OAAO,MAAM,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3C,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,2BAA2B,CACtC,KAAuC,EACvC,IAA2E;QAE3E,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,oBAAoB,GAAG,4BAAc,GAAG,KAAK,CAAC,YAAY,EAAE;YAClF,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,+BAAY,GAAE,CAAC,OAAO,CAAC,2BAAQ,CAAC,yCAAyC,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEzG,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,aAAa,CACxB,KAAyB,EACzB,IAA6D;QAE7D,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,eAAe,GAAG,4BAAc,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE;YACrF,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,+BAAY,GAAE,CAAC,OAAO,CAAC,2BAAQ,CAAC,yCAAyC,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEzG,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;YACD,gBAAgB,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,YAAY,gCAAa;SACxD,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,cAAc,CACzB,KAA0B,EAC1B,IAA8D;QAE9D,OAAO,MAAM,IAAA,4BAAU,EAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,GAAG,sBAAQ,CAAC,eAAe,GAAG,4BAAc,GAAG,KAAK,CAAC,UAAU,EAAE;YAC3E,EAAE,EAAE,KAAK,IAAI,EAAE;gBACb,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAA,+BAAY,GAAE,CAAC,OAAO,CAAC,2BAAQ,CAAC,yCAAyC,CAAC;oBAAE,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEzG,OAAO,IAAI,CAAC;oBACV,GAAG,KAAK;oBACR,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEM,gBAAgB,CACrB,KAA4B,EAC5B,IAAgE;QAEhE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,EAAE,CAAC;QACxC,IAAI,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;gBACV,QAAQ,EAAE,WAAW,CAAC,OAAO;gBAC7B,OAAO,EAAE,WAAW,CAAC,MAAM;gBAC3B,WAAW,EAAE,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;gBACtD,GAAG,KAAK;aACT,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAEM,aAAa,CAClB,KAAyB,EACzB,IAA6D;QAE7D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,EAAE,CAAC;QACxC,IAAI,WAAW,IAAI,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;YACxD,OAAO,IAAI,CAAC;gBACV,QAAQ,EAAE,WAAW,CAAC,OAAO;gBAC7B,OAAO,EAAE,WAAW,CAAC,MAAM;gBAC3B,WAAW,EAAE,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;gBACtD,GAAG,KAAK;aACT,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;CACF;AA5JD,4EA4JC;AAED,MAAa,iCAAiC;IAC5C,KAAK,CAAC,OAAO,CAAC,KAAmB,EAAE,IAAmD;QACpF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,cAAc,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,CAAC;IACd,CAAC;CACF;AAPD,8EAOC"}
|
|
@@ -16,10 +16,18 @@ class SpanExporter {
|
|
|
16
16
|
// Nothing to shut down
|
|
17
17
|
}
|
|
18
18
|
makeSerializable(span) {
|
|
19
|
+
const { traceState, ...restSpanContext } = span.spanContext();
|
|
20
|
+
// Serialize traceState to a string because TraceState objects lose their
|
|
21
|
+
// prototype methods when crossing the V8 isolate boundary.
|
|
22
|
+
// See: https://github.com/temporalio/sdk-typescript/issues/1738
|
|
23
|
+
const serializableSpanContext = {
|
|
24
|
+
traceState: traceState?.serialize(),
|
|
25
|
+
...restSpanContext,
|
|
26
|
+
};
|
|
19
27
|
return {
|
|
20
28
|
name: span.name,
|
|
21
29
|
kind: span.kind,
|
|
22
|
-
spanContext:
|
|
30
|
+
spanContext: serializableSpanContext,
|
|
23
31
|
parentSpanId: span.parentSpanId,
|
|
24
32
|
startTime: span.startTime,
|
|
25
33
|
endTime: span.endTime,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"span-exporter.js","sourceRoot":"","sources":["../../src/workflow/span-exporter.ts"],"names":[],"mappings":";;;AACA,8CAAqE;AAErE,yDAAgD;AAEhD,MAAa,YAAY;IACf,QAAQ,CAAkC;IAE3C,MAAM,CAAC,KAA6B,EAAE,cAA8C;QACzF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAA,6BAAU,GAAsB,CAAC,QAAQ,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvE,cAAc,CAAC,EAAE,IAAI,EAAE,uBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,QAAQ;QACnB,uBAAuB;IACzB,CAAC;IAEM,gBAAgB,CAAC,IAA0B;QAChD,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"span-exporter.js","sourceRoot":"","sources":["../../src/workflow/span-exporter.ts"],"names":[],"mappings":";;;AACA,8CAAqE;AAErE,yDAAgD;AAEhD,MAAa,YAAY;IACf,QAAQ,CAAkC;IAE3C,MAAM,CAAC,KAA6B,EAAE,cAA8C;QACzF,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAA,6BAAU,GAAsB,CAAC,QAAQ,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvE,cAAc,CAAC,EAAE,IAAI,EAAE,uBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,QAAQ;QACnB,uBAAuB;IACzB,CAAC;IAEM,gBAAgB,CAAC,IAA0B;QAChD,MAAM,EAAE,UAAU,EAAE,GAAG,eAAe,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9D,yEAAyE;QACzE,2DAA2D;QAC3D,gEAAgE;QAChE,MAAM,uBAAuB,GAA4B;YACvD,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE;YACnC,GAAG,eAAe;SACnB,CAAC;QACF,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,uBAAuB;YACpC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;YACnD,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;SACpD,CAAC;IACJ,CAAC;CACF;AA3CD,oCA2CC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** Not a workflow, just interceptors */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.interceptors = void 0;
|
|
5
|
+
const workflow_1 = require("./workflow");
|
|
6
|
+
const interceptors = () => ({
|
|
7
|
+
inbound: [new workflow_1.OpenTelemetryInboundInterceptor()],
|
|
8
|
+
outbound: [new workflow_1.OpenTelemetryOutboundInterceptor()],
|
|
9
|
+
internals: [new workflow_1.OpenTelemetryInternalsInterceptor()],
|
|
10
|
+
});
|
|
11
|
+
exports.interceptors = interceptors;
|
|
12
|
+
//# sourceMappingURL=workflow-interceptors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-interceptors.js","sourceRoot":"","sources":["../src/workflow-interceptors.ts"],"names":[],"mappings":";AAAA,wCAAwC;;;AAGxC,yCAIoB;AAEb,MAAM,YAAY,GAAG,GAAyB,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,CAAC,IAAI,0CAA+B,EAAE,CAAC;IAChD,QAAQ,EAAE,CAAC,IAAI,2CAAgC,EAAE,CAAC;IAClD,SAAS,EAAE,CAAC,IAAI,4CAAiC,EAAE,CAAC;CACrD,CAAC,CAAC;AAJU,QAAA,YAAY,gBAItB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@temporalio/interceptors-opentelemetry",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.16.0",
|
|
4
4
|
"description": "Temporal.io SDK interceptors bundle for tracing with opentelemetry",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "./lib/index.d.ts",
|
|
@@ -16,18 +16,20 @@
|
|
|
16
16
|
"@opentelemetry/api": "^1.9.0",
|
|
17
17
|
"@opentelemetry/core": "^1.25.1",
|
|
18
18
|
"@opentelemetry/resources": "^1.25.1",
|
|
19
|
-
"@opentelemetry/sdk-trace-base": "^1.25.1"
|
|
19
|
+
"@opentelemetry/sdk-trace-base": "^1.25.1",
|
|
20
|
+
"@temporalio/plugin": "1.16.0"
|
|
20
21
|
},
|
|
21
22
|
"devDependencies": {
|
|
22
|
-
"
|
|
23
|
-
"@temporalio/
|
|
24
|
-
"@temporalio/
|
|
25
|
-
"@temporalio/
|
|
26
|
-
"@temporalio/
|
|
23
|
+
"nexus-rpc": "^0.0.2",
|
|
24
|
+
"@temporalio/activity": "1.16.0",
|
|
25
|
+
"@temporalio/client": "1.16.0",
|
|
26
|
+
"@temporalio/worker": "1.16.0",
|
|
27
|
+
"@temporalio/common": "1.16.0",
|
|
28
|
+
"@temporalio/workflow": "1.16.0"
|
|
27
29
|
},
|
|
28
30
|
"peerDependencies": {
|
|
29
|
-
"@temporalio/common": "1.
|
|
30
|
-
"@temporalio/workflow": "1.
|
|
31
|
+
"@temporalio/common": "1.16.0",
|
|
32
|
+
"@temporalio/workflow": "1.16.0"
|
|
31
33
|
},
|
|
32
34
|
"peerDependenciesMeta": {
|
|
33
35
|
"@temporalio/workflow": {
|
|
@@ -47,7 +49,7 @@
|
|
|
47
49
|
"access": "public"
|
|
48
50
|
},
|
|
49
51
|
"engines": {
|
|
50
|
-
"node": ">=
|
|
52
|
+
"node": ">= 20.0.0"
|
|
51
53
|
},
|
|
52
54
|
"files": [
|
|
53
55
|
"src",
|
package/src/index.ts
CHANGED
package/src/instrumentation.ts
CHANGED
|
@@ -43,6 +43,19 @@ export function extractContextFromHeaders(headers: Headers): otel.Context | unde
|
|
|
43
43
|
return otel.propagation.extract(otel.context.active(), textMap, otel.defaultTextMapGetter);
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
/**
|
|
47
|
+
* If found, return an otel Context deserialized from the provided Nexus headers.
|
|
48
|
+
*
|
|
49
|
+
* Nexus headers are plain `Record<string, string>`, so we extract the context
|
|
50
|
+
* directly from the string map.
|
|
51
|
+
*/
|
|
52
|
+
export function extractContextFromNexusHeaders(headers: Record<string, string>): otel.Context | undefined {
|
|
53
|
+
if (Object.keys(headers).length === 0) {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
return otel.propagation.extract(otel.context.active(), headers, otel.defaultTextMapGetter);
|
|
57
|
+
}
|
|
58
|
+
|
|
46
59
|
/**
|
|
47
60
|
* Given headers, return new headers with the current otel context inserted
|
|
48
61
|
*/
|
|
@@ -52,6 +65,15 @@ export function headersWithContext(headers: Headers): Headers {
|
|
|
52
65
|
return { ...headers, [TRACE_HEADER]: payloadConverter.toPayload(carrier) };
|
|
53
66
|
}
|
|
54
67
|
|
|
68
|
+
/**
|
|
69
|
+
* Given Nexus headers, return new headers with the current otel context injected directly
|
|
70
|
+
*/
|
|
71
|
+
export function nexusHeadersWithContext(headers: Record<string, string>): Record<string, string> {
|
|
72
|
+
const carrier: Record<string, string> = {};
|
|
73
|
+
otel.propagation.inject(otel.context.active(), carrier, otel.defaultTextMapSetter);
|
|
74
|
+
return { ...headers, ...carrier };
|
|
75
|
+
}
|
|
76
|
+
|
|
55
77
|
async function wrapWithSpan<T>(
|
|
56
78
|
span: otel.Span,
|
|
57
79
|
fn: (span: otel.Span) => Promise<T>,
|
|
@@ -90,7 +112,8 @@ function maybeAddErrorToSpan(err: any, span: otel.Span, acceptableErrors?: (err:
|
|
|
90
112
|
const isBenignErr = err instanceof ApplicationFailure && err.category === ApplicationFailureCategory.BENIGN;
|
|
91
113
|
if (acceptableErrors === undefined || !acceptableErrors(err)) {
|
|
92
114
|
const statusCode = isBenignErr ? otel.SpanStatusCode.UNSET : otel.SpanStatusCode.ERROR;
|
|
93
|
-
|
|
115
|
+
const message = err != null && typeof err.message === 'string' ? err.message : String(err);
|
|
116
|
+
span.setStatus({ code: statusCode, message });
|
|
94
117
|
span.recordException(err);
|
|
95
118
|
} else {
|
|
96
119
|
span.setStatus({ code: otel.SpanStatusCode.OK });
|
package/src/plugin.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { SpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
2
|
+
import { Resource } from '@opentelemetry/resources';
|
|
3
|
+
import { SimplePlugin } from '@temporalio/plugin';
|
|
4
|
+
import { InjectedSinks, ReplayWorkerOptions, WorkerOptions } from '@temporalio/worker';
|
|
5
|
+
import { InterceptorOptions, OpenTelemetryWorkflowClientInterceptor } from './client';
|
|
6
|
+
import {
|
|
7
|
+
makeWorkflowExporter,
|
|
8
|
+
OpenTelemetryActivityInboundInterceptor,
|
|
9
|
+
OpenTelemetryActivityOutboundInterceptor,
|
|
10
|
+
OpenTelemetryNexusInboundInterceptor,
|
|
11
|
+
OpenTelemetryNexusOutboundInterceptor,
|
|
12
|
+
} from './worker';
|
|
13
|
+
import { OpenTelemetrySinks } from './workflow';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Configuration options for {@link OpenTelemetryPlugin}.
|
|
17
|
+
*
|
|
18
|
+
* @experimental Plugins is an experimental feature; APIs may change without notice.
|
|
19
|
+
*/
|
|
20
|
+
export interface OpenTelemetryPluginOptions extends InterceptorOptions {
|
|
21
|
+
/** OpenTelemetry resource attributes to attach to exported spans */
|
|
22
|
+
readonly resource: Resource;
|
|
23
|
+
/** Exporter used to send spans to a tracing backend */
|
|
24
|
+
readonly spanProcessor: SpanProcessor;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* A plugin that adds OpenTelemetry tracing.
|
|
29
|
+
*
|
|
30
|
+
* Configures Client, Activity, and Workflow interceptors for trace propagation and injects
|
|
31
|
+
* a span exporter sink for Workflow spans.
|
|
32
|
+
*
|
|
33
|
+
* @experimental Plugins is an experimental feature; APIs may change without notice.
|
|
34
|
+
*/
|
|
35
|
+
export class OpenTelemetryPlugin extends SimplePlugin {
|
|
36
|
+
constructor(readonly otelOptions: OpenTelemetryPluginOptions) {
|
|
37
|
+
const workflowInterceptorsPath = require.resolve('./workflow-interceptors');
|
|
38
|
+
const interceptorOptions = otelOptions.tracer ? { tracer: otelOptions.tracer } : {};
|
|
39
|
+
super({
|
|
40
|
+
name: 'OpenTelemetryPlugin',
|
|
41
|
+
clientInterceptors: {
|
|
42
|
+
workflow: [new OpenTelemetryWorkflowClientInterceptor(interceptorOptions)],
|
|
43
|
+
},
|
|
44
|
+
workerInterceptors: {
|
|
45
|
+
client: {
|
|
46
|
+
workflow: [new OpenTelemetryWorkflowClientInterceptor(interceptorOptions)],
|
|
47
|
+
},
|
|
48
|
+
workflowModules: [workflowInterceptorsPath],
|
|
49
|
+
activity: [
|
|
50
|
+
(ctx) => ({
|
|
51
|
+
inbound: new OpenTelemetryActivityInboundInterceptor(ctx, interceptorOptions),
|
|
52
|
+
outbound: new OpenTelemetryActivityOutboundInterceptor(ctx),
|
|
53
|
+
}),
|
|
54
|
+
],
|
|
55
|
+
nexus: [
|
|
56
|
+
(ctx) => ({
|
|
57
|
+
inbound: new OpenTelemetryNexusInboundInterceptor(ctx, interceptorOptions),
|
|
58
|
+
outbound: new OpenTelemetryNexusOutboundInterceptor(ctx),
|
|
59
|
+
}),
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
configureWorker(options: WorkerOptions): WorkerOptions {
|
|
66
|
+
return super.configureWorker(this.injectSinks(options));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
configureReplayWorker(options: ReplayWorkerOptions): ReplayWorkerOptions {
|
|
70
|
+
return super.configureReplayWorker(this.injectSinks(options));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private injectSinks<T extends { sinks?: InjectedSinks<any> }>(options: T): T {
|
|
74
|
+
const sinks: InjectedSinks<OpenTelemetrySinks> = {
|
|
75
|
+
exporter: makeWorkflowExporter(this.otelOptions.spanProcessor, this.otelOptions.resource),
|
|
76
|
+
};
|
|
77
|
+
return {
|
|
78
|
+
...options,
|
|
79
|
+
sinks: {
|
|
80
|
+
...options.sinks,
|
|
81
|
+
...sinks,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
package/src/worker/index.ts
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import * as otel from '@opentelemetry/api';
|
|
2
|
+
import { createTraceState } from '@opentelemetry/api';
|
|
2
3
|
import type { Resource } from '@opentelemetry/resources';
|
|
3
|
-
import type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base';
|
|
4
|
+
import type { ReadableSpan, SpanExporter, SpanProcessor } from '@opentelemetry/sdk-trace-base';
|
|
5
|
+
import type * as nexus from 'nexus-rpc';
|
|
4
6
|
import type { Context as ActivityContext } from '@temporalio/activity';
|
|
7
|
+
import { CompleteAsyncError } from '@temporalio/common';
|
|
5
8
|
import type {
|
|
6
9
|
Next,
|
|
7
10
|
ActivityInboundCallsInterceptor,
|
|
8
11
|
ActivityOutboundCallsInterceptor,
|
|
12
|
+
NexusInboundCallsInterceptor,
|
|
13
|
+
NexusOutboundCallsInterceptor,
|
|
14
|
+
NexusStartOperationInput,
|
|
15
|
+
NexusStartOperationOutput,
|
|
16
|
+
NexusCancelOperationInput,
|
|
9
17
|
InjectedSink,
|
|
10
18
|
GetLogAttributesInput,
|
|
11
19
|
GetMetricTagsInput,
|
|
@@ -14,9 +22,12 @@ import type {
|
|
|
14
22
|
import {
|
|
15
23
|
instrument,
|
|
16
24
|
extractContextFromHeaders,
|
|
25
|
+
extractContextFromNexusHeaders,
|
|
17
26
|
WORKFLOW_ID_ATTR_KEY,
|
|
18
27
|
RUN_ID_ATTR_KEY,
|
|
19
28
|
ACTIVITY_ID_ATTR_KEY,
|
|
29
|
+
NEXUS_SERVICE_ATTR_KEY,
|
|
30
|
+
NEXUS_OPERATION_ATTR_KEY,
|
|
20
31
|
} from '../instrumentation';
|
|
21
32
|
import {
|
|
22
33
|
type OpenTelemetryWorkflowExporter,
|
|
@@ -58,6 +69,7 @@ export class OpenTelemetryActivityInboundInterceptor implements ActivityInboundC
|
|
|
58
69
|
return next(input);
|
|
59
70
|
},
|
|
60
71
|
context,
|
|
72
|
+
acceptableErrors: (err) => err instanceof CompleteAsyncError,
|
|
61
73
|
});
|
|
62
74
|
}
|
|
63
75
|
}
|
|
@@ -107,13 +119,128 @@ export class OpenTelemetryActivityOutboundInterceptor implements ActivityOutboun
|
|
|
107
119
|
}
|
|
108
120
|
}
|
|
109
121
|
|
|
122
|
+
/**
|
|
123
|
+
* Intercepts inbound Nexus Operation calls on the worker.
|
|
124
|
+
*
|
|
125
|
+
* Wraps `startOperation` and `cancelOperation` in opentelemetry Spans, linking to a parent Span context
|
|
126
|
+
* if one is provided in the Nexus request headers.
|
|
127
|
+
*/
|
|
128
|
+
export class OpenTelemetryNexusInboundInterceptor implements NexusInboundCallsInterceptor {
|
|
129
|
+
protected readonly tracer: otel.Tracer;
|
|
130
|
+
|
|
131
|
+
constructor(
|
|
132
|
+
protected readonly ctx: nexus.OperationContext,
|
|
133
|
+
options?: InterceptorOptions
|
|
134
|
+
) {
|
|
135
|
+
this.tracer = options?.tracer ?? otel.trace.getTracer('@temporalio/interceptor-nexus');
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
async startOperation(
|
|
139
|
+
input: NexusStartOperationInput,
|
|
140
|
+
next: Next<NexusInboundCallsInterceptor, 'startOperation'>
|
|
141
|
+
): Promise<NexusStartOperationOutput> {
|
|
142
|
+
const context = extractContextFromNexusHeaders(input.ctx.headers);
|
|
143
|
+
const spanName = `${SpanName.NEXUS_START_OPERATION_EXECUTE}${SPAN_DELIMITER}${input.ctx.service}/${input.ctx.operation}`;
|
|
144
|
+
return await instrument({
|
|
145
|
+
tracer: this.tracer,
|
|
146
|
+
spanName,
|
|
147
|
+
fn: (span) => {
|
|
148
|
+
span.setAttribute(NEXUS_SERVICE_ATTR_KEY, input.ctx.service);
|
|
149
|
+
span.setAttribute(NEXUS_OPERATION_ATTR_KEY, input.ctx.operation);
|
|
150
|
+
return next(input);
|
|
151
|
+
},
|
|
152
|
+
context,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async cancelOperation(
|
|
157
|
+
input: NexusCancelOperationInput,
|
|
158
|
+
next: Next<NexusInboundCallsInterceptor, 'cancelOperation'>
|
|
159
|
+
): Promise<void> {
|
|
160
|
+
const context = extractContextFromNexusHeaders(input.ctx.headers);
|
|
161
|
+
const spanName = `${SpanName.NEXUS_CANCEL_OPERATION_EXECUTE}${SPAN_DELIMITER}${input.ctx.service}/${input.ctx.operation}`;
|
|
162
|
+
return await instrument({
|
|
163
|
+
tracer: this.tracer,
|
|
164
|
+
spanName,
|
|
165
|
+
fn: (span) => {
|
|
166
|
+
span.setAttribute(NEXUS_SERVICE_ATTR_KEY, input.ctx.service);
|
|
167
|
+
span.setAttribute(NEXUS_OPERATION_ATTR_KEY, input.ctx.operation);
|
|
168
|
+
return next(input);
|
|
169
|
+
},
|
|
170
|
+
context,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Intercepts outbound calls from a Nexus Operation handler.
|
|
177
|
+
*
|
|
178
|
+
* Attaches OpenTelemetry context tracing attributes to emitted log messages and metrics.
|
|
179
|
+
*/
|
|
180
|
+
export class OpenTelemetryNexusOutboundInterceptor implements NexusOutboundCallsInterceptor {
|
|
181
|
+
constructor(protected readonly ctx: nexus.OperationContext) {}
|
|
182
|
+
|
|
183
|
+
public getLogAttributes(
|
|
184
|
+
input: GetLogAttributesInput,
|
|
185
|
+
next: Next<NexusOutboundCallsInterceptor, 'getLogAttributes'>
|
|
186
|
+
): Record<string, unknown> {
|
|
187
|
+
const span = otel.trace.getSpan(otel.context.active());
|
|
188
|
+
const spanContext = span?.spanContext();
|
|
189
|
+
if (spanContext && otel.isSpanContextValid(spanContext)) {
|
|
190
|
+
return next({
|
|
191
|
+
trace_id: spanContext.traceId,
|
|
192
|
+
span_id: spanContext.spanId,
|
|
193
|
+
trace_flags: `0${spanContext.traceFlags.toString(16)}`,
|
|
194
|
+
...input,
|
|
195
|
+
});
|
|
196
|
+
} else {
|
|
197
|
+
return next(input);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
public getMetricTags(
|
|
202
|
+
input: GetMetricTagsInput,
|
|
203
|
+
next: Next<NexusOutboundCallsInterceptor, 'getMetricTags'>
|
|
204
|
+
): GetMetricTagsInput {
|
|
205
|
+
const span = otel.trace.getSpan(otel.context.active());
|
|
206
|
+
const spanContext = span?.spanContext();
|
|
207
|
+
if (spanContext && otel.isSpanContextValid(spanContext)) {
|
|
208
|
+
return next({
|
|
209
|
+
trace_id: spanContext.traceId,
|
|
210
|
+
span_id: spanContext.spanId,
|
|
211
|
+
trace_flags: `0${spanContext.traceFlags.toString(16)}`,
|
|
212
|
+
...input,
|
|
213
|
+
});
|
|
214
|
+
} else {
|
|
215
|
+
return next(input);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
110
220
|
/**
|
|
111
221
|
* Takes an opentelemetry SpanExporter and turns it into an injected Workflow span exporter sink
|
|
222
|
+
*
|
|
223
|
+
* @deprecated Do not directly pass a `SpanExporter`. Pass a `SpanProcessor` instead to ensure proper handling of async attributes.
|
|
224
|
+
*/
|
|
225
|
+
export function makeWorkflowExporter(
|
|
226
|
+
spanExporter: SpanExporter,
|
|
227
|
+
resource: Resource
|
|
228
|
+
): InjectedSink<OpenTelemetryWorkflowExporter>;
|
|
229
|
+
/**
|
|
230
|
+
* Takes an opentelemetry SpanProcessor and turns it into an injected Workflow span exporter sink.
|
|
231
|
+
*
|
|
232
|
+
* For backward compatibility, passing a `SpanExporter` directly is still supported.
|
|
112
233
|
*/
|
|
113
234
|
export function makeWorkflowExporter(
|
|
114
|
-
|
|
235
|
+
spanProcessor: SpanProcessor,
|
|
236
|
+
resource: Resource
|
|
237
|
+
): InjectedSink<OpenTelemetryWorkflowExporter>;
|
|
238
|
+
export function makeWorkflowExporter(
|
|
239
|
+
processorOrExporter: SpanProcessor | SpanExporter,
|
|
115
240
|
resource: Resource
|
|
116
241
|
): InjectedSink<OpenTelemetryWorkflowExporter> {
|
|
242
|
+
const givenSpanProcessor = isSpanProcessor(processorOrExporter);
|
|
243
|
+
|
|
117
244
|
return {
|
|
118
245
|
export: {
|
|
119
246
|
fn: (info, spanData) => {
|
|
@@ -122,18 +249,35 @@ export function makeWorkflowExporter(
|
|
|
122
249
|
// Spans are copied over from the isolate and are converted to ReadableSpan instances
|
|
123
250
|
return extractReadableSpan(serialized, resource);
|
|
124
251
|
});
|
|
125
|
-
|
|
126
|
-
|
|
252
|
+
|
|
253
|
+
if (givenSpanProcessor) {
|
|
254
|
+
spans.forEach((span) => processorOrExporter.onEnd(span));
|
|
255
|
+
} else {
|
|
256
|
+
// Ignore the export result for simplicity
|
|
257
|
+
processorOrExporter.export(spans, () => undefined);
|
|
258
|
+
}
|
|
127
259
|
},
|
|
128
260
|
},
|
|
129
261
|
};
|
|
130
262
|
}
|
|
131
263
|
|
|
264
|
+
function isSpanProcessor(obj: SpanProcessor | SpanExporter): obj is SpanProcessor {
|
|
265
|
+
return 'onEnd' in obj && typeof obj.onEnd === 'function';
|
|
266
|
+
}
|
|
267
|
+
|
|
132
268
|
/**
|
|
133
269
|
* Deserialize a serialized span created by the Workflow isolate
|
|
134
270
|
*/
|
|
135
271
|
function extractReadableSpan(serializable: SerializableSpan, resource: Resource): ReadableSpan {
|
|
136
|
-
const {
|
|
272
|
+
const {
|
|
273
|
+
spanContext: { traceState, ...restSpanContext },
|
|
274
|
+
...rest
|
|
275
|
+
} = serializable;
|
|
276
|
+
const spanContext: otel.SpanContext = {
|
|
277
|
+
// Reconstruct the TraceState from the serialized string.
|
|
278
|
+
traceState: traceState ? createTraceState(traceState) : undefined,
|
|
279
|
+
...restSpanContext,
|
|
280
|
+
};
|
|
137
281
|
return {
|
|
138
282
|
spanContext() {
|
|
139
283
|
return spanContext;
|
|
@@ -28,7 +28,7 @@ export class ContextManager implements otel.ContextManager {
|
|
|
28
28
|
* It isn't possible to tell Typescript that contextWrapper is the same as T
|
|
29
29
|
* so we forced to cast as any here.
|
|
30
30
|
*/
|
|
31
|
-
|
|
31
|
+
|
|
32
32
|
return contextWrapper as any;
|
|
33
33
|
}
|
|
34
34
|
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import * as otel from '@opentelemetry/api';
|
|
2
2
|
import * as tracing from '@opentelemetry/sdk-trace-base';
|
|
3
|
-
import { InstrumentationLibrary } from '@opentelemetry/core'; // eslint-disable
|
|
3
|
+
import { InstrumentationLibrary } from '@opentelemetry/core'; // eslint-disable @typescript-eslint/no-deprecated
|
|
4
4
|
import type { Sink, Sinks } from '@temporalio/workflow';
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Serializable version of SpanContext where traceState is converted to a string.
|
|
8
|
+
*/
|
|
9
|
+
export type SerializableSpanContext = Omit<otel.SpanContext, 'traceState'> & { traceState?: string };
|
|
10
|
+
|
|
6
11
|
/**
|
|
7
12
|
* Serializable version of the opentelemetry Span for cross isolate copying
|
|
8
13
|
*/
|
|
9
14
|
export interface SerializableSpan {
|
|
10
15
|
readonly name: string;
|
|
11
16
|
readonly kind: otel.SpanKind;
|
|
12
|
-
readonly spanContext:
|
|
17
|
+
readonly spanContext: SerializableSpanContext;
|
|
13
18
|
readonly parentSpanId?: string;
|
|
14
19
|
readonly startTime: otel.HrTime;
|
|
15
20
|
readonly endTime: otel.HrTime;
|
|
@@ -23,7 +28,7 @@ export interface SerializableSpan {
|
|
|
23
28
|
readonly droppedLinksCount: number;
|
|
24
29
|
readonly droppedEventsCount: number;
|
|
25
30
|
// readonly resource: Resource;
|
|
26
|
-
// eslint-disable-next-line
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated
|
|
27
32
|
readonly instrumentationLibrary: InstrumentationLibrary;
|
|
28
33
|
}
|
|
29
34
|
|
|
@@ -128,6 +133,14 @@ export enum SpanName {
|
|
|
128
133
|
* Nexus operation is started
|
|
129
134
|
*/
|
|
130
135
|
NEXUS_OPERATION_START = 'StartNexusOperation',
|
|
136
|
+
/**
|
|
137
|
+
* Nexus operation is executing
|
|
138
|
+
*/
|
|
139
|
+
NEXUS_START_OPERATION_EXECUTE = 'RunStartNexusOperation',
|
|
140
|
+
/**
|
|
141
|
+
* Nexus operation cancel is executing
|
|
142
|
+
*/
|
|
143
|
+
NEXUS_CANCEL_OPERATION_EXECUTE = 'RunCancelNexusOperation',
|
|
131
144
|
}
|
|
132
145
|
|
|
133
146
|
export const SPAN_DELIMITER = ':';
|
package/src/workflow/index.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* eslint-disable import/order */
|
|
2
1
|
// eslint-disable-next-line import/no-unassigned-import
|
|
3
2
|
import './runtime'; // Patch the Workflow isolate runtime for opentelemetry
|
|
4
3
|
import * as otel from '@opentelemetry/api';
|
|
@@ -28,6 +27,7 @@ import {
|
|
|
28
27
|
instrumentSync,
|
|
29
28
|
extractContextFromHeaders,
|
|
30
29
|
headersWithContext,
|
|
30
|
+
nexusHeadersWithContext,
|
|
31
31
|
UPDATE_ID_ATTR_KEY,
|
|
32
32
|
NEXUS_SERVICE_ATTR_KEY,
|
|
33
33
|
NEXUS_OPERATION_ATTR_KEY,
|
|
@@ -211,12 +211,13 @@ export class OpenTelemetryOutboundInterceptor implements WorkflowOutboundCallsIn
|
|
|
211
211
|
|
|
212
212
|
return await instrument({
|
|
213
213
|
tracer: this.tracer,
|
|
214
|
-
spanName: `${SpanName.NEXUS_OPERATION_START}${SPAN_DELIMITER}${input.service}
|
|
214
|
+
spanName: `${SpanName.NEXUS_OPERATION_START}${SPAN_DELIMITER}${input.service}/${input.operation}`,
|
|
215
215
|
fn: async (span) => {
|
|
216
216
|
span.setAttribute(NEXUS_SERVICE_ATTR_KEY, input.service);
|
|
217
217
|
span.setAttribute(NEXUS_OPERATION_ATTR_KEY, input.operation);
|
|
218
218
|
span.setAttribute(NEXUS_ENDPOINT_ATTR_KEY, input.endpoint);
|
|
219
|
-
|
|
219
|
+
const headers = nexusHeadersWithContext(input.headers);
|
|
220
|
+
return await next({ ...input, headers });
|
|
220
221
|
},
|
|
221
222
|
});
|
|
222
223
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as tracing from '@opentelemetry/sdk-trace-base';
|
|
2
2
|
import { ExportResult, ExportResultCode } from '@opentelemetry/core';
|
|
3
|
-
import { OpenTelemetrySinks, SerializableSpan } from './definitions';
|
|
3
|
+
import { OpenTelemetrySinks, SerializableSpan, SerializableSpanContext } from './definitions';
|
|
4
4
|
import { proxySinks } from './workflow-imports';
|
|
5
5
|
|
|
6
6
|
export class SpanExporter implements tracing.SpanExporter {
|
|
@@ -19,10 +19,18 @@ export class SpanExporter implements tracing.SpanExporter {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
public makeSerializable(span: tracing.ReadableSpan): SerializableSpan {
|
|
22
|
+
const { traceState, ...restSpanContext } = span.spanContext();
|
|
23
|
+
// Serialize traceState to a string because TraceState objects lose their
|
|
24
|
+
// prototype methods when crossing the V8 isolate boundary.
|
|
25
|
+
// See: https://github.com/temporalio/sdk-typescript/issues/1738
|
|
26
|
+
const serializableSpanContext: SerializableSpanContext = {
|
|
27
|
+
traceState: traceState?.serialize(),
|
|
28
|
+
...restSpanContext,
|
|
29
|
+
};
|
|
22
30
|
return {
|
|
23
31
|
name: span.name,
|
|
24
32
|
kind: span.kind,
|
|
25
|
-
spanContext:
|
|
33
|
+
spanContext: serializableSpanContext,
|
|
26
34
|
parentSpanId: span.parentSpanId,
|
|
27
35
|
startTime: span.startTime,
|
|
28
36
|
endTime: span.endTime,
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Not a workflow, just interceptors */
|
|
2
|
+
|
|
3
|
+
import type { WorkflowInterceptors } from '@temporalio/workflow';
|
|
4
|
+
import {
|
|
5
|
+
OpenTelemetryInboundInterceptor,
|
|
6
|
+
OpenTelemetryOutboundInterceptor,
|
|
7
|
+
OpenTelemetryInternalsInterceptor,
|
|
8
|
+
} from './workflow';
|
|
9
|
+
|
|
10
|
+
export const interceptors = (): WorkflowInterceptors => ({
|
|
11
|
+
inbound: [new OpenTelemetryInboundInterceptor()],
|
|
12
|
+
outbound: [new OpenTelemetryOutboundInterceptor()],
|
|
13
|
+
internals: [new OpenTelemetryInternalsInterceptor()],
|
|
14
|
+
});
|