Skip to content

Commit c09e4e3

Browse files
committed
chore: support opentelemetry v2
1 parent 8d489e3 commit c09e4e3

9 files changed

Lines changed: 728 additions & 484 deletions

File tree

package-lock.json

Lines changed: 662 additions & 425 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@
5252
"temporalio": "file:packages/meta"
5353
},
5454
"devDependencies": {
55-
"@opentelemetry/api": "^1.7.0",
56-
"@opentelemetry/core": "^1.19.0",
57-
"@opentelemetry/sdk-node": "^0.46.0",
55+
"@opentelemetry/api": "^1.9.0",
56+
"@opentelemetry/core": "^2.0.1",
57+
"@opentelemetry/sdk-node": "^0.203.0",
5858
"@tsconfig/node18": "^18.2.4",
5959
"@types/fs-extra": "^11.0.4",
6060
"@types/ms": "^0.7.34",

packages/interceptors-opentelemetry/package.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@
1414
"author": "Temporal Technologies Inc. <sdk@temporal.io>",
1515
"license": "MIT",
1616
"dependencies": {
17-
"@opentelemetry/api": "^1.7.0",
18-
"@opentelemetry/core": "^1.19.0",
19-
"@opentelemetry/resources": "^1.19.0",
20-
"@opentelemetry/sdk-trace-base": "^1.19.0"
17+
"@opentelemetry/api": "^1.9.0",
18+
"@opentelemetry/core": "^2.0.1",
19+
"@opentelemetry/resources": "^2.0.1",
20+
"@opentelemetry/sdk-trace-base": "^2.0.1",
21+
"@opentelemetry/sdk-trace-node": "^2.0.1"
2122
},
2223
"devDependencies": {
2324
"@temporalio/activity": "file:../activity",

packages/interceptors-opentelemetry/src/workflow/definitions.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as otel from '@opentelemetry/api';
22
import * as tracing from '@opentelemetry/sdk-trace-base';
3-
import { InstrumentationLibrary } from '@opentelemetry/core'; // eslint-disable deprecation/deprecation
3+
import { InstrumentationScope } from '@opentelemetry/core'; // eslint-disable deprecation/deprecation
44
import { Sink, Sinks } from '@temporalio/workflow';
55

66
/**
@@ -10,7 +10,7 @@ export interface SerializableSpan {
1010
readonly name: string;
1111
readonly kind: otel.SpanKind;
1212
readonly spanContext: otel.SpanContext;
13-
readonly parentSpanId?: string;
13+
readonly parentSpanContext?: otel.SpanContext;
1414
readonly startTime: otel.HrTime;
1515
readonly endTime: otel.HrTime;
1616
readonly status: otel.SpanStatus;
@@ -24,7 +24,7 @@ export interface SerializableSpan {
2424
readonly droppedEventsCount: number;
2525
// readonly resource: Resource;
2626
// eslint-disable-next-line deprecation/deprecation
27-
readonly instrumentationLibrary: InstrumentationLibrary;
27+
readonly instrumentationScope: InstrumentationScope;
2828
}
2929

3030
export interface OpenTelemetryWorkflowExporter extends Sink {

packages/interceptors-opentelemetry/src/workflow/index.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// eslint-disable-next-line import/no-unassigned-import
33
import './runtime'; // Patch the Workflow isolate runtime for opentelemetry
44
import * as otel from '@opentelemetry/api';
5-
import * as tracing from '@opentelemetry/sdk-trace-base';
5+
import * as tracing from '@opentelemetry/sdk-trace-node';
66
import {
77
ActivityInput,
88
ContinueAsNew,
@@ -35,8 +35,9 @@ function getTracer(): otel.Tracer {
3535
contextManager = new ContextManager();
3636
}
3737
if (tracer === undefined) {
38-
const provider = new tracing.BasicTracerProvider();
39-
provider.addSpanProcessor(new tracing.SimpleSpanProcessor(new SpanExporter()));
38+
const provider = new tracing.NodeTracerProvider({
39+
spanProcessors: [new tracing.SimpleSpanProcessor(new SpanExporter())],
40+
});
4041
provider.register({ contextManager });
4142
tracer = provider.getTracer('@temporalio/interceptor-workflow');
4243
}

packages/interceptors-opentelemetry/src/workflow/span-exporter.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export class SpanExporter implements tracing.SpanExporter {
2020
name: span.name,
2121
kind: span.kind,
2222
spanContext: span.spanContext(),
23-
parentSpanId: span.parentSpanId,
23+
parentSpanContext: span.parentSpanContext,
2424
startTime: span.startTime,
2525
endTime: span.endTime,
2626
status: span.status,
@@ -32,7 +32,7 @@ export class SpanExporter implements tracing.SpanExporter {
3232
droppedAttributesCount: span.droppedAttributesCount,
3333
droppedEventsCount: span.droppedEventsCount,
3434
droppedLinksCount: span.droppedLinksCount,
35-
instrumentationLibrary: span.instrumentationLibrary,
35+
instrumentationScope: span.instrumentationScope,
3636
};
3737
}
3838
}

packages/test/package.json

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@
2626
"dependencies": {
2727
"@grpc/grpc-js": "^1.12.4",
2828
"@grpc/proto-loader": "^0.7.10",
29-
"@opentelemetry/api": "^1.7.0",
30-
"@opentelemetry/core": "^1.19.0",
31-
"@opentelemetry/exporter-trace-otlp-grpc": "^0.46.0",
32-
"@opentelemetry/sdk-node": "^0.46.0",
33-
"@opentelemetry/sdk-trace-base": "^1.19.0",
34-
"@opentelemetry/semantic-conventions": "^1.19.0",
29+
"@opentelemetry/api": "^1.9.0",
30+
"@opentelemetry/core": "^2.0.1",
31+
"@opentelemetry/exporter-trace-otlp-grpc": "^0.203.0",
32+
"@opentelemetry/sdk-node": "^0.203.0",
33+
"@opentelemetry/sdk-trace-base": "^2.0.1",
34+
"@opentelemetry/sdk-trace-node": "^2.0.1",
35+
"@opentelemetry/semantic-conventions": "^1.36.0",
3536
"@temporalio/activity": "file:../activity",
3637
"@temporalio/client": "file:../client",
3738
"@temporalio/cloud": "file:../cloud",

packages/test/src/load/worker.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import http from 'node:http';
33
import { inspect } from 'node:util';
44
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';
55
import * as opentelemetry from '@opentelemetry/sdk-node';
6-
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';
6+
import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';
77
import arg from 'arg';
88
import { Connection } from '@temporalio/client';
99
import {
@@ -34,8 +34,8 @@ async function withOptionalOtel(args: arg.Result<WorkerArgSpec>, fn: () => Promi
3434

3535
const traceExporter = new OTLPTraceExporter({ url });
3636
const otel = new opentelemetry.NodeSDK({
37-
resource: new opentelemetry.resources.Resource({
38-
[SemanticResourceAttributes.SERVICE_NAME]: 'load-worker',
37+
resource: opentelemetry.resources.resourceFromAttributes({
38+
[ATTR_SERVICE_NAME]: 'load-worker',
3939
taskQueue,
4040
}),
4141
traceExporter,

packages/test/src/test-otel.ts

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ import { SpanStatusCode } from '@opentelemetry/api';
88
import { ExportResultCode } from '@opentelemetry/core';
99
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';
1010
import * as opentelemetry from '@opentelemetry/sdk-node';
11-
import { BasicTracerProvider, InMemorySpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
12-
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';
11+
import { InMemorySpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
12+
import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
13+
import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions';
1314
import test from 'ava';
1415
import { v4 as uuid4 } from 'uuid';
1516
import { Connection, WorkflowClient } from '@temporalio/client';
@@ -234,8 +235,8 @@ if (RUN_INTEGRATION_TESTS) {
234235
try {
235236
const spans = Array<opentelemetry.tracing.ReadableSpan>();
236237

237-
const staticResource = new opentelemetry.resources.Resource({
238-
[SemanticResourceAttributes.SERVICE_NAME]: 'ts-test-otel-worker',
238+
const staticResource = opentelemetry.resources.resourceFromAttributes({
239+
[ATTR_SERVICE_NAME]: 'ts-test-otel-worker',
239240
});
240241
const traceExporter: opentelemetry.tracing.SpanExporter = {
241242
export(spans_, resultCallback) {
@@ -283,98 +284,102 @@ if (RUN_INTEGRATION_TESTS) {
283284
const originalSpan = spans.find(({ name }) => name === `${SpanName.WORKFLOW_START}${SPAN_DELIMITER}smorgasbord`);
284285
t.true(originalSpan !== undefined);
285286
t.log(
286-
spans.map((span) => ({ name: span.name, parentSpanId: span.parentSpanId, spanId: span.spanContext().spanId }))
287+
spans.map((span) => ({
288+
name: span.name,
289+
parentSpanContext: span.parentSpanContext,
290+
spanId: span.spanContext().spanId,
291+
}))
287292
);
288293

289294
const firstExecuteSpan = spans.find(
290-
({ name, parentSpanId }) =>
295+
({ name, parentSpanContext }) =>
291296
name === `${SpanName.WORKFLOW_EXECUTE}${SPAN_DELIMITER}smorgasbord` &&
292-
parentSpanId === originalSpan?.spanContext().spanId
297+
parentSpanContext === originalSpan?.spanContext()
293298
);
294299
t.true(firstExecuteSpan !== undefined);
295300
t.true(firstExecuteSpan!.status.code === SpanStatusCode.OK);
296301

297302
const continueAsNewSpan = spans.find(
298-
({ name, parentSpanId }) =>
303+
({ name, parentSpanContext }) =>
299304
name === `${SpanName.CONTINUE_AS_NEW}${SPAN_DELIMITER}smorgasbord` &&
300-
parentSpanId === firstExecuteSpan?.spanContext().spanId
305+
parentSpanContext === firstExecuteSpan?.spanContext()
301306
);
302307
t.true(continueAsNewSpan !== undefined);
303308
t.true(continueAsNewSpan!.status.code === SpanStatusCode.OK);
304309

305310
const parentExecuteSpan = spans.find(
306-
({ name, parentSpanId }) =>
311+
({ name, parentSpanContext }) =>
307312
name === `${SpanName.WORKFLOW_EXECUTE}${SPAN_DELIMITER}smorgasbord` &&
308-
parentSpanId === continueAsNewSpan?.spanContext().spanId
313+
parentSpanContext === continueAsNewSpan?.spanContext()
309314
);
310315
t.true(parentExecuteSpan !== undefined);
311316
const firstActivityStartSpan = spans.find(
312-
({ name, parentSpanId }) =>
317+
({ name, parentSpanContext }) =>
313318
name === `${SpanName.ACTIVITY_START}${SPAN_DELIMITER}fakeProgress` &&
314-
parentSpanId === parentExecuteSpan?.spanContext().spanId
319+
parentSpanContext === parentExecuteSpan?.spanContext()
315320
);
316321
t.true(firstActivityStartSpan !== undefined);
317322

318323
const firstActivityExecuteSpan = spans.find(
319-
({ name, parentSpanId }) =>
324+
({ name, parentSpanContext }) =>
320325
name === `${SpanName.ACTIVITY_EXECUTE}${SPAN_DELIMITER}fakeProgress` &&
321-
parentSpanId === firstActivityStartSpan?.spanContext().spanId
326+
parentSpanContext === firstActivityStartSpan?.spanContext()
322327
);
323328
t.true(firstActivityExecuteSpan !== undefined);
324329

325330
const secondActivityStartSpan = spans.find(
326-
({ name, parentSpanId }) =>
331+
({ name, parentSpanContext }) =>
327332
name === `${SpanName.ACTIVITY_START}${SPAN_DELIMITER}queryOwnWf` &&
328-
parentSpanId === parentExecuteSpan?.spanContext().spanId
333+
parentSpanContext === parentExecuteSpan?.spanContext()
329334
);
330335
t.true(secondActivityStartSpan !== undefined);
331336

332337
const secondActivityExecuteSpan = spans.find(
333-
({ name, parentSpanId }) =>
338+
({ name, parentSpanContext }) =>
334339
name === `${SpanName.ACTIVITY_EXECUTE}${SPAN_DELIMITER}queryOwnWf` &&
335-
parentSpanId === secondActivityStartSpan?.spanContext().spanId
340+
parentSpanContext === secondActivityStartSpan?.spanContext()
336341
);
337342
t.true(secondActivityExecuteSpan !== undefined);
338343

339344
const childWorkflowStartSpan = spans.find(
340-
({ name, parentSpanId }) =>
345+
({ name, parentSpanContext }) =>
341346
name === `${SpanName.CHILD_WORKFLOW_START}${SPAN_DELIMITER}signalTarget` &&
342-
parentSpanId === parentExecuteSpan?.spanContext().spanId
347+
parentSpanContext === parentExecuteSpan?.spanContext()
343348
);
344349
t.true(childWorkflowStartSpan !== undefined);
345350

346351
const childWorkflowExecuteSpan = spans.find(
347-
({ name, parentSpanId }) =>
352+
({ name, parentSpanContext }) =>
348353
name === `${SpanName.WORKFLOW_EXECUTE}${SPAN_DELIMITER}signalTarget` &&
349-
parentSpanId === childWorkflowStartSpan?.spanContext().spanId
354+
parentSpanContext === childWorkflowStartSpan?.spanContext()
350355
);
351356
t.true(childWorkflowExecuteSpan !== undefined);
352357

353358
const signalChildWithUnblockSpan = spans.find(
354-
({ name, parentSpanId }) =>
359+
({ name, parentSpanContext }) =>
355360
name === `${SpanName.WORKFLOW_SIGNAL}${SPAN_DELIMITER}unblock` &&
356-
parentSpanId === parentExecuteSpan?.spanContext().spanId
361+
parentSpanContext === parentExecuteSpan?.spanContext()
357362
);
358363
t.true(signalChildWithUnblockSpan !== undefined);
359364

360365
const localActivityStartSpan = spans.find(
361-
({ name, parentSpanId }) =>
366+
({ name, parentSpanContext }) =>
362367
name === `${SpanName.ACTIVITY_START}${SPAN_DELIMITER}echo` &&
363-
parentSpanId === parentExecuteSpan?.spanContext().spanId
368+
parentSpanContext === parentExecuteSpan?.spanContext()
364369
);
365370
t.true(localActivityStartSpan !== undefined);
366371

367372
const localActivityExecuteSpan = spans.find(
368-
({ name, parentSpanId }) =>
373+
({ name, parentSpanContext }) =>
369374
name === `${SpanName.ACTIVITY_EXECUTE}${SPAN_DELIMITER}echo` &&
370-
parentSpanId === localActivityStartSpan?.spanContext().spanId
375+
parentSpanContext === localActivityStartSpan?.spanContext()
371376
);
372377
t.true(localActivityExecuteSpan !== undefined);
373378

374379
const activityStartedSignalSpan = spans.find(
375-
({ name, parentSpanId }) =>
380+
({ name, parentSpanContext }) =>
376381
name === `${SpanName.WORKFLOW_SIGNAL}${SPAN_DELIMITER}activityStarted` &&
377-
parentSpanId === firstActivityExecuteSpan?.spanContext().spanId
382+
parentSpanContext === firstActivityExecuteSpan?.spanContext()
378383
);
379384
t.true(activityStartedSignalSpan !== undefined);
380385

@@ -396,8 +401,8 @@ if (RUN_INTEGRATION_TESTS) {
396401
try {
397402
const oTelUrl = 'http://127.0.0.1:4317';
398403
const exporter = new OTLPTraceExporter({ url: oTelUrl });
399-
const staticResource = new opentelemetry.resources.Resource({
400-
[SemanticResourceAttributes.SERVICE_NAME]: 'ts-test-otel-worker',
404+
const staticResource = opentelemetry.resources.resourceFromAttributes({
405+
[ATTR_SERVICE_NAME]: 'ts-test-otel-worker',
401406
});
402407
const otel = new opentelemetry.NodeSDK({
403408
resource: staticResource,
@@ -440,8 +445,7 @@ if (RUN_INTEGRATION_TESTS) {
440445

441446
test('instrumentation: Error status includes message and records exception', async (t) => {
442447
const memoryExporter = new InMemorySpanExporter();
443-
const provider = new BasicTracerProvider();
444-
provider.addSpanProcessor(new SimpleSpanProcessor(memoryExporter));
448+
const provider = new NodeTracerProvider({ spanProcessors: [new SimpleSpanProcessor(memoryExporter)] });
445449
provider.register();
446450
const tracer = provider.getTracer('test-error-tracer');
447451

0 commit comments

Comments
 (0)