Sign inConnect your agent
infochanged

Workers - Workers tracing — new spanContext(), setStatus(), and updateName() APIs

Announced
Tags
Workers
Severity
info, set by reef/rss-rule-v1
Source
https://developers.cloudflare.com/changelog/post/2026-10-26-span-context-status-update-name/

<p><a href="https://developers.cloudflare.com/workers/observability/traces/custom-spans/">Custom spans</a> in Workers now support three more methods from the OpenTelemetry span API.</p> <ul> <li><strong><code>span.spanContext()</code></strong> returns the span's <code>traceId</code>, <code>spanId</code>, and <code>traceFlags</code>. The IDs match the trace and span IDs in Workers Observability and in exported traces, so you can log them or return them to clients to correlate a request with its trace.</li> <li><strong><code>span.setStatus(status)</code></strong> sets the span status to <code>"unset"</code>, <code>"ok"</code>, or <code>"error"</code>, with an optional message for errors. Span status is included in traces exported to <a href="https://developers.cloudflare.com/workers/observability/opentelemetry-export/">OpenTelemetry destinations</a>. The Workers Observability dashboard does not display it yet.</li> <li><strong><code>span.updateName(name)</code></strong> renames a span after it starts, such as once you know which route a request matched. You can also rename the invocation's root span returned by <code>tracing.getActiveSpan()</code>.</li> </ul> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="js"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.js</span><span class="nb-code-title-lang">js</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { tracing } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> root</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> tracing.</span><span class="nb-shiki-1t8gfj">getActiveSpan</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> route</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> router.</span><span class="nb-shiki-1t8gfj">match</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-140thh"> root?.</span><span class="nb-shiki-1t8gfj">updateName</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">${</span><span class="nb-shiki-140thh">request</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">method</span><span class="nb-shiki-mdbnqw">} ${</span><span class="nb-shiki-140thh">route</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">pattern</span><span class="nb-shiki-mdbnqw">}</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> tracing.</span><span class="nb-shiki-1t8gfj">startActiveSpan</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"handle"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">span</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> try</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> route.</span><span class="nb-shiki-1t8gfj">handler</span><span class="nb-shiki-140thh">(request, env);</span></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">setStatus</span><span class="nb-shiki-140thh">({ code: </span><span class="nb-shiki-mdbnqw">"ok"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> response;</span></span> <span class="line"><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">catch</span><span class="nb-shiki-140thh"> (err) {</span></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">recordException</span><span class="nb-shiki-140thh">(err);</span></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">setStatus</span><span class="nb-shiki-140thh">({ code: </span><span class="nb-shiki-mdbnqw">"error"</span><span class="nb-shiki-140thh">, message: </span><span class="nb-shiki-mdbnqw">"Route handler failed"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> { error: </span><span class="nb-shiki-mdbnqw">"Internal error"</span><span class="nb-shiki-140thh">, traceId: root?.</span><span class="nb-shiki-1t8gfj">spanContext</span><span class="nb-shiki-140thh">().traceId },</span></span> <span class="line"><span class="nb-shiki-140thh"> { status: </span><span class="nb-shiki-dzsirb">500</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">finally</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">end</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure nb-code-figure-titled" data-nb-lang="ts"><figcaption class="nb-code-title"><span class="nb-code-title-name">src/index.ts</span><span class="nb-code-title-lang">ts</span></figcaption><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { tracing } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "cloudflare:workers"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> default</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> async</span><span class="nb-shiki-1t8gfj"> fetch</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">request</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Request</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">env</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Env</span><span class="nb-shiki-140thh">)</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Promise</span><span class="nb-shiki-140thh">&#x3C;</span><span class="nb-shiki-1t8gfj">Response</span><span class="nb-shiki-140thh">> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> root</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> tracing.</span><span class="nb-shiki-1t8gfj">getActiveSpan</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> route</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> router.</span><span class="nb-shiki-1t8gfj">match</span><span class="nb-shiki-140thh">(request);</span></span> <span class="line"><span class="nb-shiki-140thh"> root?.</span><span class="nb-shiki-1t8gfj">updateName</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">${</span><span class="nb-shiki-140thh">request</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">method</span><span class="nb-shiki-mdbnqw">} ${</span><span class="nb-shiki-140thh">route</span><span class="nb-shiki-mdbnqw">.</span><span class="nb-shiki-140thh">pattern</span><span class="nb-shiki-mdbnqw">}</span><span class="nb-shiki-140thh">);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> tracing.</span><span class="nb-shiki-1t8gfj">startActiveSpan</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"handle"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> (</span><span class="nb-shiki-1jdh33">span</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> try</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> response</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-140thh"> route.</span><span class="nb-shiki-1t8gfj">handler</span><span class="nb-shiki-140thh">(request, env);</span></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">setStatus</span><span class="nb-shiki-140thh">({ code: </span><span class="nb-shiki-mdbnqw">"ok"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> response;</span></span> <span class="line"><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">catch</span><span class="nb-shiki-140thh"> (err) {</span></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">recordException</span><span class="nb-shiki-140thh">(err </span><span class="nb-shiki-1itgoe">as</span><span class="nb-shiki-1t8gfj"> Error</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">setStatus</span><span class="nb-shiki-140thh">({ code: </span><span class="nb-shiki-mdbnqw">"error"</span><span class="nb-shiki-140thh">, message: </span><span class="nb-shiki-mdbnqw">"Route handler failed"</span><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> { error: </span><span class="nb-shiki-mdbnqw">"Internal error"</span><span class="nb-shiki-140thh">, traceId: root?.</span><span class="nb-shiki-1t8gfj">spanContext</span><span class="nb-shiki-140thh">().traceId },</span></span> <span class="line"><span class="nb-shiki-140thh"> { status: </span><span class="nb-shiki-dzsirb">500</span><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> } </span><span class="nb-shiki-1itgoe">finally</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">end</span><span class="nb-shiki-140thh">();</span></span> <span class="line"><span class="nb-shiki-140thh"> }</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh">};</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>For more details, refer to the <a href="https://developers.cloudflare.com/workers/observability/traces/custom-spans/">custom spans documentation</a>.</p>

The text above is the source's. reef added the severity, the dates it could read from the text, and the endpoints and scopes named in code.