@temporalio/interceptors-opentelemetry-v2 1.19.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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +12 -0
  3. package/lib/client/index.d.ts +26 -0
  4. package/lib/client/index.js +185 -0
  5. package/lib/client/index.js.map +1 -0
  6. package/lib/index.d.ts +13 -0
  7. package/lib/index.js +32 -0
  8. package/lib/index.js.map +1 -0
  9. package/lib/instrumentation.d.ts +58 -0
  10. package/lib/instrumentation.js +152 -0
  11. package/lib/instrumentation.js.map +1 -0
  12. package/lib/plugin.d.ts +31 -0
  13. package/lib/plugin.js +66 -0
  14. package/lib/plugin.js.map +1 -0
  15. package/lib/worker/index.d.ts +69 -0
  16. package/lib/worker/index.js +222 -0
  17. package/lib/worker/index.js.map +1 -0
  18. package/lib/workflow/context-manager.d.ts +10 -0
  19. package/lib/workflow/context-manager.js +67 -0
  20. package/lib/workflow/context-manager.js.map +1 -0
  21. package/lib/workflow/definitions.d.ts +127 -0
  22. package/lib/workflow/definitions.js +92 -0
  23. package/lib/workflow/definitions.js.map +1 -0
  24. package/lib/workflow/id-generator.d.ts +8 -0
  25. package/lib/workflow/id-generator.js +30 -0
  26. package/lib/workflow/id-generator.js.map +1 -0
  27. package/lib/workflow/index.d.ts +51 -0
  28. package/lib/workflow/index.js +252 -0
  29. package/lib/workflow/index.js.map +1 -0
  30. package/lib/workflow/performance-polyfill.d.ts +16 -0
  31. package/lib/workflow/performance-polyfill.js +29 -0
  32. package/lib/workflow/performance-polyfill.js.map +1 -0
  33. package/lib/workflow/runtime.d.ts +1 -0
  34. package/lib/workflow/runtime.js +14 -0
  35. package/lib/workflow/runtime.js.map +1 -0
  36. package/lib/workflow/span-exporter.d.ts +9 -0
  37. package/lib/workflow/span-exporter.js +56 -0
  38. package/lib/workflow/span-exporter.js.map +1 -0
  39. package/lib/workflow/workflow-imports-impl.d.ts +7 -0
  40. package/lib/workflow/workflow-imports-impl.js +17 -0
  41. package/lib/workflow/workflow-imports-impl.js.map +1 -0
  42. package/lib/workflow/workflow-imports.d.ts +16 -0
  43. package/lib/workflow/workflow-imports.js +25 -0
  44. package/lib/workflow/workflow-imports.js.map +1 -0
  45. package/lib/workflow-interceptors.d.ts +3 -0
  46. package/lib/workflow-interceptors.js +12 -0
  47. package/lib/workflow-interceptors.js.map +1 -0
  48. package/package.json +78 -0
  49. package/src/client/index.ts +220 -0
  50. package/src/index.ts +14 -0
  51. package/src/instrumentation.ts +159 -0
  52. package/src/plugin.ts +86 -0
  53. package/src/worker/index.ts +264 -0
  54. package/src/workflow/context-manager.ts +53 -0
  55. package/src/workflow/definitions.ts +145 -0
  56. package/src/workflow/id-generator.ts +30 -0
  57. package/src/workflow/index.ts +312 -0
  58. package/src/workflow/performance-polyfill.ts +31 -0
  59. package/src/workflow/runtime.ts +12 -0
  60. package/src/workflow/span-exporter.ts +60 -0
  61. package/src/workflow/workflow-imports-impl.ts +14 -0
  62. package/src/workflow/workflow-imports.ts +39 -0
  63. package/src/workflow-interceptors.ts +14 -0
@@ -0,0 +1,69 @@
1
+ import * as otel from '@opentelemetry/api';
2
+ import type { Resource } from '@opentelemetry/resources';
3
+ import type { SpanProcessor } from '@opentelemetry/sdk-trace-base';
4
+ import type * as nexus from 'nexus-rpc';
5
+ import type { Context as ActivityContext } from '@temporalio/activity';
6
+ import type { Next, ActivityInboundCallsInterceptor, ActivityOutboundCallsInterceptor, NexusInboundCallsInterceptor, NexusOutboundCallsInterceptor, NexusStartOperationInput, NexusStartOperationOutput, NexusCancelOperationInput, InjectedSink, GetLogAttributesInput, GetMetricTagsInput, ActivityExecuteInput } from '@temporalio/worker';
7
+ import { type OpenTelemetryWorkflowExporter } from '../workflow/definitions';
8
+ export interface InterceptorOptions {
9
+ readonly tracer?: otel.Tracer;
10
+ }
11
+ /**
12
+ * Intercepts calls to start an Activity.
13
+ *
14
+ * Wraps the operation in an opentelemetry Span and links it to a parent Span context if one is
15
+ * provided in the Activity input headers.
16
+ *
17
+ * @experimental This interceptor is experimental and APIs may change without notice.
18
+ */
19
+ export declare class OpenTelemetryActivityInboundInterceptor implements ActivityInboundCallsInterceptor {
20
+ protected readonly ctx: ActivityContext;
21
+ protected readonly tracer: otel.Tracer;
22
+ constructor(ctx: ActivityContext, options?: InterceptorOptions);
23
+ execute(input: ActivityExecuteInput, next: Next<ActivityInboundCallsInterceptor, 'execute'>): Promise<unknown>;
24
+ }
25
+ /**
26
+ * Intercepts calls to emit logs and metrics from an Activity.
27
+ *
28
+ * Attach OpenTelemetry context tracing attributes to emitted log messages, if appropriate.
29
+ *
30
+ * @experimental This interceptor is experimental and APIs may change without notice.
31
+ */
32
+ export declare class OpenTelemetryActivityOutboundInterceptor implements ActivityOutboundCallsInterceptor {
33
+ protected readonly ctx: ActivityContext;
34
+ constructor(ctx: ActivityContext);
35
+ getLogAttributes(input: GetLogAttributesInput, next: Next<ActivityOutboundCallsInterceptor, 'getLogAttributes'>): Record<string, unknown>;
36
+ getMetricTags(input: GetMetricTagsInput, next: Next<ActivityOutboundCallsInterceptor, 'getMetricTags'>): GetMetricTagsInput;
37
+ }
38
+ /**
39
+ * Intercepts inbound Nexus Operation calls on the worker.
40
+ *
41
+ * Wraps `startOperation` and `cancelOperation` in opentelemetry Spans, linking to a parent Span context
42
+ * if one is provided in the Nexus request headers.
43
+ *
44
+ * @experimental This interceptor is experimental and APIs may change without notice.
45
+ */
46
+ export declare class OpenTelemetryNexusInboundInterceptor implements NexusInboundCallsInterceptor {
47
+ protected readonly ctx: nexus.OperationContext;
48
+ protected readonly tracer: otel.Tracer;
49
+ constructor(ctx: nexus.OperationContext, options?: InterceptorOptions);
50
+ startOperation(input: NexusStartOperationInput, next: Next<NexusInboundCallsInterceptor, 'startOperation'>): Promise<NexusStartOperationOutput>;
51
+ cancelOperation(input: NexusCancelOperationInput, next: Next<NexusInboundCallsInterceptor, 'cancelOperation'>): Promise<void>;
52
+ }
53
+ /**
54
+ * Intercepts outbound calls from a Nexus Operation handler.
55
+ *
56
+ * Attaches OpenTelemetry context tracing attributes to emitted log messages.
57
+ *
58
+ * @experimental This interceptor is experimental and APIs may change without notice.
59
+ */
60
+ export declare class OpenTelemetryNexusOutboundInterceptor implements NexusOutboundCallsInterceptor {
61
+ protected readonly ctx: nexus.OperationContext;
62
+ constructor(ctx: nexus.OperationContext);
63
+ getLogAttributes(input: GetLogAttributesInput, next: Next<NexusOutboundCallsInterceptor, 'getLogAttributes'>): Record<string, unknown>;
64
+ getMetricTags(input: GetMetricTagsInput, next: Next<NexusOutboundCallsInterceptor, 'getMetricTags'>): GetMetricTagsInput;
65
+ }
66
+ /**
67
+ * Takes an opentelemetry SpanProcessor and turns it into an injected Workflow span exporter sink.
68
+ */
69
+ export declare function makeWorkflowExporter(processor: SpanProcessor, resource: Resource): InjectedSink<OpenTelemetryWorkflowExporter>;
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.OpenTelemetryNexusOutboundInterceptor = exports.OpenTelemetryNexusInboundInterceptor = exports.OpenTelemetryActivityOutboundInterceptor = exports.OpenTelemetryActivityInboundInterceptor = void 0;
27
+ exports.makeWorkflowExporter = makeWorkflowExporter;
28
+ const otel = __importStar(require("@opentelemetry/api"));
29
+ const api_1 = require("@opentelemetry/api");
30
+ const common_1 = require("@temporalio/common");
31
+ const instrumentation_1 = require("../instrumentation");
32
+ const definitions_1 = require("../workflow/definitions");
33
+ /**
34
+ * Intercepts calls to start an Activity.
35
+ *
36
+ * Wraps the operation in an opentelemetry Span and links it to a parent Span context if one is
37
+ * provided in the Activity input headers.
38
+ *
39
+ * @experimental This interceptor is experimental and APIs may change without notice.
40
+ */
41
+ class OpenTelemetryActivityInboundInterceptor {
42
+ ctx;
43
+ tracer;
44
+ constructor(ctx, options) {
45
+ this.ctx = ctx;
46
+ this.tracer = options?.tracer ?? otel.trace.getTracer('@temporalio/interceptor-activity');
47
+ }
48
+ async execute(input, next) {
49
+ const context = (0, instrumentation_1.extractContextFromHeaders)(input.headers);
50
+ const spanName = `${definitions_1.SpanName.ACTIVITY_EXECUTE}${definitions_1.SPAN_DELIMITER}${this.ctx.info.activityType}`;
51
+ return await (0, instrumentation_1.instrument)({
52
+ tracer: this.tracer,
53
+ spanName,
54
+ fn: (span) => {
55
+ span.setAttribute(instrumentation_1.ACTIVITY_ID_ATTR_KEY, this.ctx.info.activityId);
56
+ if (this.ctx.info.inWorkflow) {
57
+ span.setAttribute(instrumentation_1.WORKFLOW_ID_ATTR_KEY, this.ctx.info.workflowExecution.workflowId);
58
+ span.setAttribute(instrumentation_1.RUN_ID_ATTR_KEY, this.ctx.info.workflowExecution.runId);
59
+ }
60
+ return next(input);
61
+ },
62
+ context,
63
+ acceptableErrors: (err) => err instanceof common_1.CompleteAsyncError,
64
+ });
65
+ }
66
+ }
67
+ exports.OpenTelemetryActivityInboundInterceptor = OpenTelemetryActivityInboundInterceptor;
68
+ /**
69
+ * Intercepts calls to emit logs and metrics from an Activity.
70
+ *
71
+ * Attach OpenTelemetry context tracing attributes to emitted log messages, if appropriate.
72
+ *
73
+ * @experimental This interceptor is experimental and APIs may change without notice.
74
+ */
75
+ class OpenTelemetryActivityOutboundInterceptor {
76
+ ctx;
77
+ constructor(ctx) {
78
+ this.ctx = ctx;
79
+ }
80
+ getLogAttributes(input, next) {
81
+ const span = otel.trace.getSpan(otel.context.active());
82
+ const spanContext = span?.spanContext();
83
+ if (spanContext && otel.isSpanContextValid(spanContext)) {
84
+ return next({
85
+ trace_id: spanContext.traceId,
86
+ span_id: spanContext.spanId,
87
+ trace_flags: `0${spanContext.traceFlags.toString(16)}`,
88
+ ...input,
89
+ });
90
+ }
91
+ else {
92
+ return next(input);
93
+ }
94
+ }
95
+ getMetricTags(input, next) {
96
+ return next(input);
97
+ }
98
+ }
99
+ exports.OpenTelemetryActivityOutboundInterceptor = OpenTelemetryActivityOutboundInterceptor;
100
+ /**
101
+ * Intercepts inbound Nexus Operation calls on the worker.
102
+ *
103
+ * Wraps `startOperation` and `cancelOperation` in opentelemetry Spans, linking to a parent Span context
104
+ * if one is provided in the Nexus request headers.
105
+ *
106
+ * @experimental This interceptor is experimental and APIs may change without notice.
107
+ */
108
+ class OpenTelemetryNexusInboundInterceptor {
109
+ ctx;
110
+ tracer;
111
+ constructor(ctx, options) {
112
+ this.ctx = ctx;
113
+ this.tracer = options?.tracer ?? otel.trace.getTracer('@temporalio/interceptor-nexus');
114
+ }
115
+ async startOperation(input, next) {
116
+ const context = (0, instrumentation_1.extractContextFromNexusHeaders)(input.ctx.headers);
117
+ const spanName = `${definitions_1.SpanName.NEXUS_START_OPERATION_EXECUTE}${definitions_1.SPAN_DELIMITER}${input.ctx.service}/${input.ctx.operation}`;
118
+ return await (0, instrumentation_1.instrument)({
119
+ tracer: this.tracer,
120
+ spanName,
121
+ fn: (span) => {
122
+ span.setAttribute(instrumentation_1.NEXUS_SERVICE_ATTR_KEY, input.ctx.service);
123
+ span.setAttribute(instrumentation_1.NEXUS_OPERATION_ATTR_KEY, input.ctx.operation);
124
+ return next(input);
125
+ },
126
+ context,
127
+ });
128
+ }
129
+ async cancelOperation(input, next) {
130
+ const context = (0, instrumentation_1.extractContextFromNexusHeaders)(input.ctx.headers);
131
+ const spanName = `${definitions_1.SpanName.NEXUS_CANCEL_OPERATION_EXECUTE}${definitions_1.SPAN_DELIMITER}${input.ctx.service}/${input.ctx.operation}`;
132
+ return await (0, instrumentation_1.instrument)({
133
+ tracer: this.tracer,
134
+ spanName,
135
+ fn: (span) => {
136
+ span.setAttribute(instrumentation_1.NEXUS_SERVICE_ATTR_KEY, input.ctx.service);
137
+ span.setAttribute(instrumentation_1.NEXUS_OPERATION_ATTR_KEY, input.ctx.operation);
138
+ return next(input);
139
+ },
140
+ context,
141
+ });
142
+ }
143
+ }
144
+ exports.OpenTelemetryNexusInboundInterceptor = OpenTelemetryNexusInboundInterceptor;
145
+ /**
146
+ * Intercepts outbound calls from a Nexus Operation handler.
147
+ *
148
+ * Attaches OpenTelemetry context tracing attributes to emitted log messages.
149
+ *
150
+ * @experimental This interceptor is experimental and APIs may change without notice.
151
+ */
152
+ class OpenTelemetryNexusOutboundInterceptor {
153
+ ctx;
154
+ constructor(ctx) {
155
+ this.ctx = ctx;
156
+ }
157
+ getLogAttributes(input, next) {
158
+ const span = otel.trace.getSpan(otel.context.active());
159
+ const spanContext = span?.spanContext();
160
+ if (spanContext && otel.isSpanContextValid(spanContext)) {
161
+ return next({
162
+ trace_id: spanContext.traceId,
163
+ span_id: spanContext.spanId,
164
+ trace_flags: `0${spanContext.traceFlags.toString(16)}`,
165
+ ...input,
166
+ });
167
+ }
168
+ else {
169
+ return next(input);
170
+ }
171
+ }
172
+ getMetricTags(input, next) {
173
+ return next(input);
174
+ }
175
+ }
176
+ exports.OpenTelemetryNexusOutboundInterceptor = OpenTelemetryNexusOutboundInterceptor;
177
+ /**
178
+ * Takes an opentelemetry SpanProcessor and turns it into an injected Workflow span exporter sink.
179
+ */
180
+ function makeWorkflowExporter(processor, resource) {
181
+ return {
182
+ export: {
183
+ fn: (info, spanData) => {
184
+ const spans = spanData.map((serialized) => {
185
+ Object.assign(serialized.attributes, info);
186
+ // Spans are copied over from the isolate and are converted to ReadableSpan instances
187
+ return extractReadableSpan(serialized, resource);
188
+ });
189
+ spans.forEach((span) => processor.onEnd(span));
190
+ },
191
+ },
192
+ };
193
+ }
194
+ /**
195
+ * Deserialize a serialized span created by the Workflow isolate
196
+ */
197
+ function extractReadableSpan(serializable, resource) {
198
+ const { spanContext: { traceState, ...restSpanContext }, parentSpanContext: serializedParentSpanContext, instrumentationScope, ...rest } = serializable;
199
+ const spanContext = {
200
+ // Reconstruct the TraceState from the serialized string.
201
+ traceState: traceState ? (0, api_1.createTraceState)(traceState) : undefined,
202
+ ...restSpanContext,
203
+ };
204
+ let parentSpanContext;
205
+ if (serializedParentSpanContext) {
206
+ const { traceState: parentTraceState, ...restParentSpanContext } = serializedParentSpanContext;
207
+ parentSpanContext = {
208
+ traceState: parentTraceState ? (0, api_1.createTraceState)(parentTraceState) : undefined,
209
+ ...restParentSpanContext,
210
+ };
211
+ }
212
+ return {
213
+ spanContext() {
214
+ return spanContext;
215
+ },
216
+ parentSpanContext,
217
+ instrumentationScope,
218
+ resource,
219
+ ...rest,
220
+ };
221
+ }
222
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type AsyncLocalStorage } from 'async_hooks';
2
+ import * as otel from '@opentelemetry/api';
3
+ export declare class ContextManager implements otel.ContextManager {
4
+ protected storage: AsyncLocalStorage<otel.Context>;
5
+ active(): otel.Context;
6
+ bind<T>(context: otel.Context, target: T): T;
7
+ enable(): this;
8
+ disable(): this;
9
+ with<A extends unknown[], F extends (...args: A) => ReturnType<F>>(context: otel.Context, fn: F, thisArg?: ThisParameterType<F>, ...args: A): ReturnType<F>;
10
+ }
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.ContextManager = void 0;
27
+ const otel = __importStar(require("@opentelemetry/api"));
28
+ class ContextManager {
29
+ // The workflow sandbox provides AsyncLocalStorage through globalThis.
30
+ storage = new globalThis.AsyncLocalStorage();
31
+ active() {
32
+ return this.storage.getStore() || otel.ROOT_CONTEXT;
33
+ }
34
+ bind(context, target) {
35
+ if (typeof target !== 'function') {
36
+ throw new TypeError(`Only function binding is supported, got ${typeof target}`);
37
+ }
38
+ // Stolen from https://github.com/open-telemetry/opentelemetry-js/blob/main/packages/opentelemetry-context-async-hooks/src/AbstractAsyncHooksContextManager.ts
39
+ const contextWrapper = (...args) => {
40
+ return this.with(context, () => target.apply(this, args));
41
+ };
42
+ Object.defineProperty(contextWrapper, 'length', {
43
+ enumerable: false,
44
+ configurable: true,
45
+ writable: false,
46
+ value: target.length,
47
+ });
48
+ /**
49
+ * It isn't possible to tell Typescript that contextWrapper is the same as T
50
+ * so we forced to cast as any here.
51
+ */
52
+ return contextWrapper;
53
+ }
54
+ enable() {
55
+ return this;
56
+ }
57
+ disable() {
58
+ this.storage.disable();
59
+ return this;
60
+ }
61
+ with(context, fn, thisArg, ...args) {
62
+ const cb = thisArg == null ? fn : fn.bind(thisArg);
63
+ return this.storage.run(context, cb, ...args);
64
+ }
65
+ }
66
+ exports.ContextManager = ContextManager;
67
+ //# sourceMappingURL=context-manager.js.map
@@ -0,0 +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;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"}
@@ -0,0 +1,127 @@
1
+ import type * as otel from '@opentelemetry/api';
2
+ import type * as tracing from '@opentelemetry/sdk-trace-base';
3
+ import type { InstrumentationScope } from '@opentelemetry/core';
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
+ };
11
+ /**
12
+ * Serializable version of the opentelemetry Span for cross isolate copying
13
+ */
14
+ export interface SerializableSpan {
15
+ readonly name: string;
16
+ readonly kind: otel.SpanKind;
17
+ readonly spanContext: SerializableSpanContext;
18
+ readonly parentSpanContext?: SerializableSpanContext;
19
+ readonly startTime: otel.HrTime;
20
+ readonly endTime: otel.HrTime;
21
+ readonly status: otel.SpanStatus;
22
+ readonly attributes: otel.Attributes;
23
+ readonly links: otel.Link[];
24
+ readonly events: tracing.TimedEvent[];
25
+ readonly duration: otel.HrTime;
26
+ readonly ended: boolean;
27
+ readonly droppedAttributesCount: number;
28
+ readonly droppedLinksCount: number;
29
+ readonly droppedEventsCount: number;
30
+ readonly instrumentationScope: InstrumentationScope;
31
+ }
32
+ export interface OpenTelemetryWorkflowExporter extends Sink {
33
+ export(span: SerializableSpan[]): void;
34
+ }
35
+ /**
36
+ * Required external dependencies for Workflow interceptor to export spans
37
+ */
38
+ export interface OpenTelemetrySinks extends Sinks {
39
+ exporter: OpenTelemetryWorkflowExporter;
40
+ }
41
+ export declare enum SpanName {
42
+ /**
43
+ * Workflow is scheduled by a client
44
+ */
45
+ WORKFLOW_START = "StartWorkflow",
46
+ /**
47
+ * Workflow is signalled
48
+ */
49
+ WORKFLOW_SIGNAL = "SignalWorkflow",
50
+ /**
51
+ * Workflow is client calls signalWithStart
52
+ */
53
+ WORKFLOW_SIGNAL_WITH_START = "SignalWithStartWorkflow",
54
+ /**
55
+ * Workflow is queried
56
+ */
57
+ WORKFLOW_QUERY = "QueryWorkflow",
58
+ /**
59
+ * Workflow update is started by client
60
+ */
61
+ WORKFLOW_START_UPDATE = "StartWorkflowUpdate",
62
+ /**
63
+ * Workflow is started with an update
64
+ */
65
+ WORKFLOW_UPDATE_WITH_START = "UpdateWithStartWorkflow",
66
+ /**
67
+ * Workflow handles an incoming signal
68
+ */
69
+ WORKFLOW_HANDLE_SIGNAL = "HandleSignal",
70
+ /**
71
+ * Workflow handles an incoming query
72
+ */
73
+ WORKFLOW_HANDLE_QUERY = "HandleQuery",
74
+ /**
75
+ * Workflow handles an incoming update
76
+ */
77
+ WORKFLOW_HANDLE_UPDATE = "HandleUpdate",
78
+ /**
79
+ * Workflow validates an incoming update
80
+ */
81
+ WORKFLOW_VALIDATE_UPDATE = "ValidateUpdate",
82
+ /**
83
+ * Workflow is terminated
84
+ */
85
+ WORKFLOW_TERMINATE = "TerminateWorkflow",
86
+ /**
87
+ * Workflow is cancelled
88
+ */
89
+ WORKFLOW_CANCEL = "CancelWorkflow",
90
+ /**
91
+ * Workflow is described
92
+ */
93
+ WORKFLOW_DESCRIBE = "DescribeWorkflow",
94
+ /**
95
+ * Workflow run is executing
96
+ */
97
+ WORKFLOW_EXECUTE = "RunWorkflow",
98
+ /**
99
+ * Child Workflow is started (by parent Workflow)
100
+ */
101
+ CHILD_WORKFLOW_START = "StartChildWorkflow",
102
+ /**
103
+ * Activity is scheduled by a Workflow
104
+ */
105
+ ACTIVITY_START = "StartActivity",
106
+ /**
107
+ * Activity is executing
108
+ */
109
+ ACTIVITY_EXECUTE = "RunActivity",
110
+ /**
111
+ * Workflow is continuing as new
112
+ */
113
+ CONTINUE_AS_NEW = "ContinueAsNew",
114
+ /**
115
+ * Nexus operation is started
116
+ */
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"
126
+ }
127
+ export declare const SPAN_DELIMITER = ":";
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SPAN_DELIMITER = exports.SpanName = void 0;
4
+ var SpanName;
5
+ (function (SpanName) {
6
+ /**
7
+ * Workflow is scheduled by a client
8
+ */
9
+ SpanName["WORKFLOW_START"] = "StartWorkflow";
10
+ /**
11
+ * Workflow is signalled
12
+ */
13
+ SpanName["WORKFLOW_SIGNAL"] = "SignalWorkflow";
14
+ /**
15
+ * Workflow is client calls signalWithStart
16
+ */
17
+ SpanName["WORKFLOW_SIGNAL_WITH_START"] = "SignalWithStartWorkflow";
18
+ /**
19
+ * Workflow is queried
20
+ */
21
+ SpanName["WORKFLOW_QUERY"] = "QueryWorkflow";
22
+ /**
23
+ * Workflow update is started by client
24
+ */
25
+ SpanName["WORKFLOW_START_UPDATE"] = "StartWorkflowUpdate";
26
+ /**
27
+ * Workflow is started with an update
28
+ */
29
+ SpanName["WORKFLOW_UPDATE_WITH_START"] = "UpdateWithStartWorkflow";
30
+ /**
31
+ * Workflow handles an incoming signal
32
+ */
33
+ SpanName["WORKFLOW_HANDLE_SIGNAL"] = "HandleSignal";
34
+ /**
35
+ * Workflow handles an incoming query
36
+ */
37
+ SpanName["WORKFLOW_HANDLE_QUERY"] = "HandleQuery";
38
+ /**
39
+ * Workflow handles an incoming update
40
+ */
41
+ SpanName["WORKFLOW_HANDLE_UPDATE"] = "HandleUpdate";
42
+ /**
43
+ * Workflow validates an incoming update
44
+ */
45
+ SpanName["WORKFLOW_VALIDATE_UPDATE"] = "ValidateUpdate";
46
+ /**
47
+ * Workflow is terminated
48
+ */
49
+ SpanName["WORKFLOW_TERMINATE"] = "TerminateWorkflow";
50
+ /**
51
+ * Workflow is cancelled
52
+ */
53
+ SpanName["WORKFLOW_CANCEL"] = "CancelWorkflow";
54
+ /**
55
+ * Workflow is described
56
+ */
57
+ SpanName["WORKFLOW_DESCRIBE"] = "DescribeWorkflow";
58
+ /**
59
+ * Workflow run is executing
60
+ */
61
+ SpanName["WORKFLOW_EXECUTE"] = "RunWorkflow";
62
+ /**
63
+ * Child Workflow is started (by parent Workflow)
64
+ */
65
+ SpanName["CHILD_WORKFLOW_START"] = "StartChildWorkflow";
66
+ /**
67
+ * Activity is scheduled by a Workflow
68
+ */
69
+ SpanName["ACTIVITY_START"] = "StartActivity";
70
+ /**
71
+ * Activity is executing
72
+ */
73
+ SpanName["ACTIVITY_EXECUTE"] = "RunActivity";
74
+ /**
75
+ * Workflow is continuing as new
76
+ */
77
+ SpanName["CONTINUE_AS_NEW"] = "ContinueAsNew";
78
+ /**
79
+ * Nexus operation is started
80
+ */
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";
90
+ })(SpanName || (exports.SpanName = SpanName = {}));
91
+ exports.SPAN_DELIMITER = ':';
92
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/workflow/definitions.ts"],"names":[],"mappings":";;;AA4CA,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"}
@@ -0,0 +1,8 @@
1
+ import type { IdGenerator } from '@opentelemetry/sdk-trace-base';
2
+ /**
3
+ * Generates span and trace IDs from a named workflow random stream.
4
+ */
5
+ export declare class DeterministicIdGenerator implements IdGenerator {
6
+ generateTraceId(): string;
7
+ generateSpanId(): string;
8
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DeterministicIdGenerator = void 0;
4
+ const workflow_imports_1 = require("./workflow-imports");
5
+ const OTEL_ID_RANDOM_STREAM = '@temporalio/interceptors-opentelemetry-v2/id-generator';
6
+ function randomHex(length) {
7
+ const stream = (0, workflow_imports_1.getRandomStream)(OTEL_ID_RANDOM_STREAM);
8
+ const chars = [];
9
+ for (let i = 0; i < length; i++) {
10
+ const nibble = (stream.random() * 16) >>> 0;
11
+ chars.push(nibble.toString(16));
12
+ }
13
+ return chars.join('');
14
+ }
15
+ /**
16
+ * Generates span and trace IDs from a named workflow random stream.
17
+ */
18
+ class DeterministicIdGenerator {
19
+ generateTraceId() {
20
+ const id = randomHex(32);
21
+ // Ensure non-zero per W3C Trace Context spec
22
+ return id === '00000000000000000000000000000000' ? '00000000000000000000000000000001' : id;
23
+ }
24
+ generateSpanId() {
25
+ const id = randomHex(16);
26
+ return id === '0000000000000000' ? '0000000000000001' : id;
27
+ }
28
+ }
29
+ exports.DeterministicIdGenerator = DeterministicIdGenerator;
30
+ //# sourceMappingURL=id-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-generator.js","sourceRoot":"","sources":["../../src/workflow/id-generator.ts"],"names":[],"mappings":";;;AACA,yDAAqD;AAErD,MAAM,qBAAqB,GAAG,wDAAwD,CAAC;AAEvF,SAAS,SAAS,CAAC,MAAc;IAC/B,MAAM,MAAM,GAAG,IAAA,kCAAe,EAAC,qBAAqB,CAAC,CAAC;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAa,wBAAwB;IACnC,eAAe;QACb,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QACzB,6CAA6C;QAC7C,OAAO,EAAE,KAAK,kCAAkC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7F,CAAC;IAED,cAAc;QACZ,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QACzB,OAAO,EAAE,KAAK,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,CAAC;CACF;AAXD,4DAWC"}