Workers - Workers tracing — write custom spans with new startActiveSpan() and span.end() runtime APIs
- Announced
- Tags
- Workers
- Severity
- info, set by
reef/rss-rule-v1 - Source
- https://developers.cloudflare.com/changelog/post/2026-07-28-start-active-span/
<p>The Workers runtime now provides built-in <code>tracing.startActiveSpan()</code> and <code>span.end()</code> APIs, allowing you to write custom spans for operations that last beyond a single callback — for example, instrumenting a stream pipeline where the span should stay open until the stream is fully consumed.</p> <p>This augments the <a href="https://developers.cloudflare.com/changelog/post/2026-06-16-custom-spans/">existing API for writing custom spans</a>, <code>tracing.enterSpan()</code>, which automatically ends a span when its callback is returned. With <code>startActiveSpan()</code>, the span remains open after the callback returns, and you call <code>span.end()</code> when the work is complete:</p> <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">const</span><span class="nb-shiki-dzsirb"> encoder</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> TextEncoder</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-1t8gfj"> fetch</span><span class="nb-shiki-140thh">() {</span></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">"stream-response"</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"> let</span><span class="nb-shiki-140thh"> timer;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> const</span><span class="nb-shiki-dzsirb"> body</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> ReadableStream</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> start</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">controller</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> controller.</span><span class="nb-shiki-1t8gfj">enqueue</span><span class="nb-shiki-140thh">(encoder.</span><span class="nb-shiki-1t8gfj">encode</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Starting...</span><span class="nb-shiki-dzsirb">\n</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-140thh"> timer </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1t8gfj"> setTimeout</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-140thh"> controller.</span><span class="nb-shiki-1t8gfj">enqueue</span><span class="nb-shiki-140thh">(encoder.</span><span class="nb-shiki-1t8gfj">encode</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Complete.</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-140thh">));</span></span> <span class="line"><span class="nb-shiki-140thh"> controller.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">setAttribute</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"stream.status"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"complete"</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 class="nb-shiki-dzsirb">1000</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj"> cancel</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (timer </span><span class="nb-shiki-1itgoe">!==</span><span class="nb-shiki-dzsirb"> undefined</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1t8gfj">clearTimeout</span><span class="nb-shiki-140thh">(timer);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">setAttribute</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"stream.status"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"cancelled"</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> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(body, {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: { </span><span class="nb-shiki-mdbnqw">"content-type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"text/plain"</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">const</span><span class="nb-shiki-dzsirb"> encoder</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> TextEncoder</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-1t8gfj"> fetch</span><span class="nb-shiki-140thh">()</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh"> {</span></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">"stream-response"</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"> let</span><span class="nb-shiki-140thh"> timer</span><span class="nb-shiki-1itgoe">:</span><span class="nb-shiki-1t8gfj"> ReturnType</span><span class="nb-shiki-140thh"><</span><span class="nb-shiki-1itgoe">typeof</span><span class="nb-shiki-140thh"> setTimeout> </span><span class="nb-shiki-1itgoe">|</span><span class="nb-shiki-dzsirb"> undefined</span><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"> body</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> ReadableStream</span><span class="nb-shiki-140thh"><</span><span class="nb-shiki-1t8gfj">Uint8Array</span><span class="nb-shiki-140thh">>({</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> start</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-1jdh33">controller</span><span class="nb-shiki-140thh">) {</span></span> <span class="line"><span class="nb-shiki-140thh"> controller.</span><span class="nb-shiki-1t8gfj">enqueue</span><span class="nb-shiki-140thh">(encoder.</span><span class="nb-shiki-1t8gfj">encode</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Starting...</span><span class="nb-shiki-dzsirb">\n</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-140thh"> timer </span><span class="nb-shiki-1itgoe">=</span><span class="nb-shiki-1t8gfj"> setTimeout</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-140thh"> controller.</span><span class="nb-shiki-1t8gfj">enqueue</span><span class="nb-shiki-140thh">(encoder.</span><span class="nb-shiki-1t8gfj">encode</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"Complete.</span><span class="nb-shiki-dzsirb">\n</span><span class="nb-shiki-mdbnqw">"</span><span class="nb-shiki-140thh">));</span></span> <span class="line"><span class="nb-shiki-140thh"> controller.</span><span class="nb-shiki-1t8gfj">close</span><span class="nb-shiki-140thh">();</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">setAttribute</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"stream.status"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"complete"</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 class="nb-shiki-dzsirb">1000</span><span class="nb-shiki-140thh">);</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1t8gfj"> cancel</span><span class="nb-shiki-140thh">() {</span></span> <span class="line"><span class="nb-shiki-1itgoe"> if</span><span class="nb-shiki-140thh"> (timer </span><span class="nb-shiki-1itgoe">!==</span><span class="nb-shiki-dzsirb"> undefined</span><span class="nb-shiki-140thh">) </span><span class="nb-shiki-1t8gfj">clearTimeout</span><span class="nb-shiki-140thh">(timer);</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-140thh"> span.</span><span class="nb-shiki-1t8gfj">setAttribute</span><span class="nb-shiki-140thh">(</span><span class="nb-shiki-mdbnqw">"stream.status"</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-mdbnqw">"cancelled"</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> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> Response</span><span class="nb-shiki-140thh">(body, {</span></span> <span class="line"><span class="nb-shiki-140thh"> headers: { </span><span class="nb-shiki-mdbnqw">"content-type"</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-mdbnqw">"text/plain"</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.