第28章: Tail Workers によるログのリアルタイム検閲
本番のWorkerにログ転送コード(SentryやDatadogへの送信処理)を直接埋め込むと、メインリクエストのレイテンシが悪化したり、ログ送信失敗でメイン処理が影響を受ける恐れがあります。 Tail Workers は、メインWorkerの実行完了後に 背後で非同期にログストリームを受け取って処理する専用Worker です。
本チュートリアルのゴール
- メインWorkerの
wrangler.jsoncにtail_consumersを設定 - エラーログのみをフィルタリングしてSlackへ通知するTail Workerの実装
Step 1: Tail Worker の実装
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
全リクエストのログを保存するのではなく、「エラーが発生したログ」や「極端に遅かったリクエストのログ」だけを選択して保存・通知する高効率な監視手法。