Workers のトレースに自分だけの span が刺せるようになったよ!
やっほー、しぃちゃんだよ! 今日は Workers のオブザーバビリティがちょっと便利になるお話だよ。自分で書いたコードの「ここからここまで」を、トレースにそのまま乗せられるようになったの。
Cloudflare Changelogなにが発表されたの?
Cloudflare の Changelog で、Workers のトレーシングが custom span(カスタムスパン) に対応したって発表されたよ。tracing.enterSpan() を呼ぶだけで、自分のコードの区間を独自の span として記録できるようになったの。
しかもこの custom span は、fetch 呼び出しや KV の読み取り、D1 のクエリみたいにプラットフォームが自動で計測してくれる span と一緒に並んで表示されるんだよ。OpenTelemetry でエクスポートするときも、ちゃんと親子のネスト構造を保ったまま出てくるの。
今までどうだったの?
これまで Workers のトレースに出てくるのは、プラットフォームが自動で入れてくれる計測が中心だったの。fetch や KV、D1 みたいな操作は見えても、「自分の関数のこの処理に何ミリ秒かかってるか」みたいな、アプリ側の区間は自分では刻めなかったんだよね。
これで何が変わるの?
これからは、遅そうな処理や気になるロジックを自分で span として囲めるようになるよ。自動計測の span と混ぜて時系列で並ぶから、「プラットフォームの処理」と「自分のコードの処理」のどっちに時間がかかってるのかが一目で分かるの。ボトルネック探しがぐっと楽になるね。
深く潜ってみよう
API は import { tracing } from "cloudflare:workers" で読み込むか、ハンドラの context 経由で ctx.tracing として使えるよ。
import { tracing } from "cloudflare:workers";
export default {
async fetch(request, env, ctx) {
return tracing.enterSpan("handleRequest", async (span) => {
span.setAttribute("url.path", new URL(request.url).pathname);
const data = await env.MY_KV.get("key");
return new Response(data);
});
},
};
span は JavaScript の async コンテキストに沿って自動でネストされて、コールバックが返るか、返した promise が決着したタイミングで自動的に閉じられるの。だから手動で終了処理を書かなくていいんだよ。
Span オブジェクトには、メタデータを付ける setAttribute(key, value) と、今のリクエストがサンプリング対象かどうかを確認できる isTraced プロパティが用意されてるよ。
ひとつ注意なのが、span を記録するには トレーシングを有効化 しておく必要があること。Wrangler の設定で tracing をオンにしておいてね。もっと詳しい使い方は custom spans のドキュメント にまとまってるよ。
まとめ
- Cloudflare の Changelog で、Workers のトレーシングが custom span に対応したよ
tracing.enterSpan()で自分のコードの区間を計測できて、自動計測の span と一緒に並ぶよ- async コンテキストで自動ネスト&自動クローズ、
setAttributeとisTracedも使えるよ - 使うには Wrangler でトレーシングを有効化しておく必要があるの
Workers のパフォーマンスを本気でチューニングしたい人や、OpenTelemetry で計測を集めてる人にぴったりのアップデートだね!