Cloudflare Workers のログの枠は 12月から件数に直すと半分以下
Cloudflare がオブザーバビリティの新しい料金を発表し、12月から Workers Logs の枠が件数ではなく容量(GB)で決まるようになります。Workers Logs の今の枠は Free が 1日 20 万件、Paid が月 2,000 万件と件数で決まっていて、新しい枠の GB が何件分に当たるのかは料金表を見ても分からないので、実際の Worker のログのサイズを測って件数に直してみました。
Workers Logs に残るログは、自分のコードの console.log で出すログと、Cloudflare がリクエスト 1回につき 1件、コードが何も出力しなくても自動で書く invocation logs の 2種類です。invocation logs は URL やステータス、CPU 時間、リクエストヘッダーなどを持ち、既定のままだとこのログだけで 1 リクエスト約 5KB になります。12月からの枠を件数に直すと次のようになります。
- Free: 1日約 10 万リクエスト分
- Paid: 月約 840 万リクエスト分
どちらも今の件数の枠の半分以下ですが、invocation logs を既定のまま残している Worker で、リクエスト数がこの件数に届かないなら、設定はそのままで問題ないはずです。
invocation logs は 1 リクエストで約 5KB
約 5KB という数字は、Free プランで動かしている 10個の Worker のログから出したものです。Astro 製の CMS「EmDash」のサイトと監視用の Worker で、どれも Workers Logs を既定のまま有効にして全リクエストを記録しています。ログの $metadata には eventSize としてバイト数が出ていて、Workers Observability のクエリ API でこれを集めると、invocation logs は平均 5,082 バイトで、console.log で出したログはこれよりずっと小さいものでした。
Cloudflare のログのデータセットの説明も Workers のログの平均を 4.84KB としていて、測った値とほぼ同じです。このサイズの半分強は Cloudflare が付ける request.cf(接続元の国や TLS の情報)とリクエストヘッダーが占めていて、自分のコードの console.log を減らしても小さくなりません。
ただ、請求で数える量が eventSize なのかは公式に書かれておらず、12月以降はダッシュボードの Billable Usage で実際に数えられた量を確かめられます。
私の Worker では、ダッシュボードや GraphQL で見るリクエスト数と invocation logs の件数がほぼ同じだったので、ログの量はリクエスト数に約 5KB を掛ければ見積もれます。
この見積もりが当てはまるのは、ログのほとんどが invocation logs の Worker です。console.log をたくさん出す Worker では、console.log のログ(1件数百バイト)の分だけ量が増えます。
12月からの枠を件数に直すと Free も Paid も今の半分以下
Cloudflare の料金表によると Free の枠は 1日 0.5GB で、件数に直すと 1日約 10 万リクエスト分と、今の 20 万件の半分以下です。料金は今と同じくかからず、枠を超えると日本時間の朝 9 時までのリクエストのログが記録されなくなるだけでサイトは止まりません。平均の 5,082 バイトで見積もると、たとえば次のようになります。
- 1日 3 万リクエストのサイト: 約 0.15GB で、枠の 3 割ほど
- 1日 15 万リクエストのサイト: 約 0.76GB で枠を超える(今の 20 万件の枠なら収まっていた量)
Paid は取り込み(ingest)が月 50GB、保存(storage)が 10GB-月まで料金に含まれます。1GB を 30日置くと 1GB-月で、Paid のログは 7日残るので、保存量は月の取り込みのおよそ 4分の1 になり、取り込みより保存の枠の方が先に尽きます。件数に直すと、今の月 2,000 万件に対して次のとおりです。
- 保存の枠: 月約 840 万リクエスト分
- 取り込みの枠: 月約 980 万リクエスト分
保存の枠が先に尽きても、超過料金は取り込みの分が大半で、保存の超過は小さく済みます。たとえば月 1,500 万リクエストの Worker なら、今はログの超過料金はかかりませんが、12月からは取り込みの超過が約 $6.6、保存の超過が約 $0.8 で、超過料金が月約 $7 になります。この額は公式の定価と私が測った平均サイズから出した見積もりで、実際の請求額ではありません。
Free も Paid も、ログの分析やクエリ、ダッシュボード、通知には料金がかからず、Free のログの保持は 3日から 7日に延びます。どちらの枠も Cloudflare Traces と共有で、Traces が使う分は見積もりに入っていません。
枠を超えるならログを残す割合を下げるか、料金を払って枠を広げる
枠を超えるなら、できることは次の 2つです。
- Workers Logs の設定の
observability.head_sampling_rateで、ログを残すリクエストの割合を下げる(既定は 1 で全リクエストを残し、0.1 なら 10件に 1件だけ残す) - Free なら Paid(月 5 ドル)に移って枠を広げ、Paid で枠を超える分は超過料金を払う
head_sampling_rate で実際にどこまで減るかは試していません。
このほかに、observability.logs.invocation_logs を false にして invocation logs を止めれば量はほぼ 0 にできるはずですが、CPU の上限で止まったかを示す outcome の exceededCpu と CPU 時間は、私の Worker で見た限りでは invocation logs にしか入っていませんでした。
障害を調べるときに exceededCpu と CPU 時間を見るなら、invocation logs は止められません。CPU の上限で止まったことを Workers Logs で見る例は、Cloudflare Workers の無料プランで 503 が出る原因が CPU 上限だった話に書きました。