コンテンツにスキップ

第28章: Tail Workers によるログのリアルタイム検閲

本番のWorkerにログ転送コード(SentryやDatadogへの送信処理)を直接埋め込むと、メインリクエストのレイテンシが悪化したり、ログ送信失敗でメイン処理が影響を受ける恐れがあります。 Tail Workers は、メインWorkerの実行完了後に 背後で非同期にログストリームを受け取って処理する専用Worker です。


本チュートリアルのゴール

  • メインWorkerの wrangler.jsonctail_consumers を設定
  • エラーログのみをフィルタリングしてSlackへ通知するTail Workerの実装

Step 1: Tail Worker の実装

tail-worker/src/index.ts
export default {
async tail(events: TraceItem[], env: Env, ctx: ExecutionContext) {
for (const event of events) {
// エラー(例外発生またはステータス500以上)をフィルタ
const isError = event.exceptions.length > 0 || (event.event?.response?.status ?? 0) >= 500;
if (isError) {
const errorLog = {
scriptName: event.scriptName,
timestamp: new Date(event.eventTimestamp).toISOString(),
url: event.event?.request?.url,
status: event.event?.response?.status,
exceptions: event.exceptions,
};
// Slack や外部監視サービスへ非同期送信
ctx.waitUntil(
fetch('https://hooks.slack.com/services/xxx/yyy/zzz', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
text: `🚨 本番エラー検知 [${event.scriptName}]\nURL: ${errorLog.url}\nStatus: ${errorLog.status}`,
}),
})
);
}
}
}
};

Step 2: メインWorkerの wrangler.jsonc で紐付け

{
"name": "my-main-api",
"main": "src/index.ts",
"tail_consumers": [
{
"service": "my-tail-worker"
}
]
}

メインAPIの処理速度に1ミリ秒の遅延も与えることなく、本番環境の完全な可観測性(Observability)が手に入ります。


💡 用語解説コラム

[!NOTE] Tail Sampling
全リクエストのログを保存するのではなく、「エラーが発生したログ」や「極端に遅かったリクエストのログ」だけを選択して保存・通知する高効率な監視手法。