Sign inConnect your agent
infochanged

Workers - Workers tracing — new getActiveSpan(), recordException(), startSpan(), and setAttributes() APIs

Announced
Tags
Workers
Severity
info, set by reef/rss-rule-v1
Source
https://developers.cloudflare.com/changelog/post/2026-09-25-custom-span-apis/

<p><a href="https://developers.cloudflare.com/workers/observability/traces/custom-spans/">Custom spans</a> in Workers now support more of the OpenTelemetry span API, so you can instrument more of your code and record errors directly on your spans.</p> <ul> <li><strong><code>tracing.startSpan(name)</code></strong> creates a span without making it the active span, and returns it. Other spans do not nest under it. Call <code>span.end()</code> when the operation is complete.</li> <li><strong><code>tracing.getActiveSpan()</code></strong> returns the currently active span. Use it to annotate the current span from helper functions and libraries without passing the span object through your code. Outside any custom span, it returns the invocation's root span.</li> <li><strong><code>span.recordException(exception)</code></strong> records an exception event on a span. It accepts an <code>Error</code>, a string, or an object with a <code>code</code>, <code>name</code>, or <code>message</code>.</li> <li><strong><code>span.setAttributes(attributes)</code></strong> sets multiple attributes at once. <code>setAttribute()</code> and <code>setAttributes()</code> now return the span, so you can chain calls.</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"> user</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> authenticate</span><span class="nb-shiki-140thh">(request, env);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Annotate the invocation's root span</span></span> <span class="line"><span class="nb-shiki-140thh"> tracing.</span><span class="nb-shiki-1t8gfj">getActiveSpan</span><span class="nb-shiki-140thh">()?.</span><span class="nb-shiki-1t8gfj">setAttributes</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "user.id"</span><span class="nb-shiki-140thh">: user.id,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "user.plan"</span><span class="nb-shiki-140thh">: user.plan,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> span</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> tracing.</span><span class="nb-shiki-1t8gfj">startSpan</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"load-profile"</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"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-1t8gfj"> loadProfile</span><span class="nb-shiki-140thh">(env, user.id));</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-1itgoe"> throw</span><span class="nb-shiki-140thh"> err;</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></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"> user</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> await</span><span class="nb-shiki-1t8gfj"> authenticate</span><span class="nb-shiki-140thh">(request, env);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // Annotate the invocation's root span</span></span> <span class="line"><span class="nb-shiki-140thh"> tracing.</span><span class="nb-shiki-1t8gfj">getActiveSpan</span><span class="nb-shiki-140thh">()?.</span><span class="nb-shiki-1t8gfj">setAttributes</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "user.id"</span><span class="nb-shiki-140thh">: user.id,</span></span> <span class="line"><span class="nb-shiki-mdbnqw"> "user.plan"</span><span class="nb-shiki-140thh">: user.plan,</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> span</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-140thh"> tracing.</span><span class="nb-shiki-1t8gfj">startSpan</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"load-profile"</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"> return</span><span class="nb-shiki-140thh"> Response.</span><span class="nb-shiki-1t8gfj">json</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1itgoe">await</span><span class="nb-shiki-1t8gfj"> loadProfile</span><span class="nb-shiki-140thh">(env, user.id));</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-1itgoe"> throw</span><span class="nb-shiki-140thh"> err;</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></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.