From 550e20d18b04c18f8960f567fdd7a8dd6d2a97ad Mon Sep 17 00:00:00 2001 From: Luca Casonato Date: Thu, 27 Feb 2025 15:43:33 +0100 Subject: [PATCH 1/2] fix(otel): don't throw when calling setActiveSpan at root When calling `setActiveSpan` at the module root, or with `options.root = true`, the function would internally throw. --- ext/telemetry/telemetry.ts | 6 +-- tests/specs/cli/otel_basic/__test__.jsonc | 4 ++ .../cli/otel_basic/start_active_span.out | 48 +++++++++++++++++++ .../specs/cli/otel_basic/start_active_span.ts | 12 +++++ 4 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 tests/specs/cli/otel_basic/start_active_span.out create mode 100644 tests/specs/cli/otel_basic/start_active_span.ts diff --git a/ext/telemetry/telemetry.ts b/ext/telemetry/telemetry.ts index 139affbf47e36e..50983def638004 100644 --- a/ext/telemetry/telemetry.ts +++ b/ext/telemetry/telemetry.ts @@ -145,7 +145,7 @@ function hrToMs(hr: [number, number]): number { export function enterSpan(span: Span): Context | undefined { if (!span.isRecording()) return undefined; - const context = (CURRENT.get() || ROOT_CONTEXT).setValue(SPAN_KEY, span); + const context = (CURRENT.get() ?? ROOT_CONTEXT).setValue(SPAN_KEY, span); return CURRENT.enter(context); } @@ -254,9 +254,9 @@ class Tracer { throw new Error("startActiveSpan requires a function argument"); } if (options?.root) { - context = undefined; + context = ROOT_CONTEXT; } else { - context = context ?? CURRENT.get(); + context = context ?? CURRENT.get() ?? ROOT_CONTEXT; } const span = this.startSpan(name, options, context); const ctx = CURRENT.enter(context.setValue(SPAN_KEY, span)); diff --git a/tests/specs/cli/otel_basic/__test__.jsonc b/tests/specs/cli/otel_basic/__test__.jsonc index d538eac736fccb..18d5e668cef868 100644 --- a/tests/specs/cli/otel_basic/__test__.jsonc +++ b/tests/specs/cli/otel_basic/__test__.jsonc @@ -33,6 +33,10 @@ "links": { "args": "run -A main.ts links.ts", "output": "links.out" + }, + "start_active_span": { + "args": "run -A main.ts start_active_span.ts", + "output": "start_active_span.out" } } } diff --git a/tests/specs/cli/otel_basic/start_active_span.out b/tests/specs/cli/otel_basic/start_active_span.out new file mode 100644 index 00000000000000..1b19ee5d448bd2 --- /dev/null +++ b/tests/specs/cli/otel_basic/start_active_span.out @@ -0,0 +1,48 @@ +{ + "spans": [ + { + "traceId": "00000000000000000000000000000001", + "spanId": "0000000000000001", + "traceState": "", + "parentSpanId": "", + "flags": 1, + "name": "top level span", + "kind": 1, + "startTimeUnixNano": "[WILDCARD]", + "endTimeUnixNano": "[WILDCARD]", + "attributes": [], + "droppedAttributesCount": 0, + "events": [], + "droppedEventsCount": 0, + "links": [], + "droppedLinksCount": 0, + "status": { + "message": "", + "code": 0 + } + }, + { + "traceId": "00000000000000000000000000000002", + "spanId": "0000000000000002", + "traceState": "", + "parentSpanId": "", + "flags": 1, + "name": "root span", + "kind": 1, + "startTimeUnixNano": "[WILDCARD]", + "endTimeUnixNano": "[WILDCARD]", + "attributes": [], + "droppedAttributesCount": 0, + "events": [], + "droppedEventsCount": 0, + "links": [], + "droppedLinksCount": 0, + "status": { + "message": "", + "code": 0 + } + } + ], + "logs": [], + "metrics": [] +} diff --git a/tests/specs/cli/otel_basic/start_active_span.ts b/tests/specs/cli/otel_basic/start_active_span.ts new file mode 100644 index 00000000000000..8b250c16826c55 --- /dev/null +++ b/tests/specs/cli/otel_basic/start_active_span.ts @@ -0,0 +1,12 @@ +// Copyright 2018-2025 the Deno authors. MIT license. + +import { trace } from "npm:@opentelemetry/api@1.9.0"; + +const tracer = trace.getTracer("example-tracer"); + +tracer.startActiveSpan("top level span", (span) => { + span.end(); +}); +tracer.startActiveSpan("root span", { root: true }, (span) => { + span.end(); +}); \ No newline at end of file From d0254b0071cbe1a9122a2eb9881f7245ac6ed288 Mon Sep 17 00:00:00 2001 From: Luca Casonato Date: Thu, 27 Feb 2025 15:47:16 +0100 Subject: [PATCH 2/2] fmt --- tests/specs/cli/otel_basic/start_active_span.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/specs/cli/otel_basic/start_active_span.ts b/tests/specs/cli/otel_basic/start_active_span.ts index 8b250c16826c55..8dd91df8d00987 100644 --- a/tests/specs/cli/otel_basic/start_active_span.ts +++ b/tests/specs/cli/otel_basic/start_active_span.ts @@ -9,4 +9,4 @@ tracer.startActiveSpan("top level span", (span) => { }); tracer.startActiveSpan("root span", { root: true }, (span) => { span.end(); -}); \ No newline at end of file +});