Gemcook Tech Blog
😸

Cloudflare Builder Day 2024で追加されたWorkers Logsを試してみる

2024/10/08に公開

はじめに

こんにちは、あさひです!
Cloudflare の Birthday Week イベントで Builder Day 2024 が 2024/09/26 に行われていました。
今回はその中で発表された Workers Logs を試してみたいと思います。以下は Cloudflare の紹介ブログです。

https://blog.cloudflare.com/builder-day-2024-announcements/

本記事は Workers Logs の機能を試すことをメインとするので、Cloudflare アカウントの作成や Workers の詳細などについては扱いません。

Cloudflare Workers Logs とは

Workers Logs を使用すると、Cloudflare Workers から出力されるログデータを自動的に収集、保存、フィルタリング、分析できます。データは Cloudflare アカウントに書き込まれ、各 Workers のダッシュボードでクエリできます。新しく作成された Workers はすべて、デフォルトで observability 設定が有効になっています。

Workers のログに関しては、今までは Baselime を統合して管理する方法はありましたが、Cloudflare のダッシュボードと機能だけで永続的なログを保存できる仕組みはありませんでした。Workers Logs はその課題を解決する機能です。

https://developers.cloudflare.com/workers/observability/logs/workers-logs

制限

オープンベータ中は、1 アカウントあたり 1 日 50 億件までという制限があります。制限を超えると、その日の残りの時間は後述のhead_sampling_rate = 1のサンプリングが適用されます。
またログの制限は 128KB でこれを超えるログは切り捨てられてログの$cloudflare.truncatedフィールドがtrueで記録されます。

項目 制限
最大ログ保存期間 7 日間
1 アカウントあたりの 1 日最大ログ数 50 億件
最大ログサイズ 128 KB

価格

価格を以下にまとめておきます。

プラン 書き込み可能なログ行数 保存期間 追加コスト
Workers Free 20 万行 / 日 7 日間 追加の料金なし
Workers Paid 2,000 万行 / 月まで含まれる 7 日間 追加の 100 万行ごとに+$0.60

Cloudflare Workers の準備

プロジェクトの初期化とデプロイ

まずはプロジェクトを作成します。

npm create cloudflare@latest -- workers-logs --framework=hono

上記コマンドを実行すると、いくつか質問されますが、すべてエンターで進めて問題ありません。
(私は Hono が好きなので framework には Hono を指定して作成します)

以下のコマンドで初回のデプロイを行っておきます。

npm run deploy

Logs の設定

実は最新の C3 コマンド(create cloudflare cli)でセットアップをした場合、wrangler.tomlに以下の設定が追加されているはずです。なのでここまで同じように進めている方は特に何もすることはありません。
別の方法でプロジェクトを作成し、wrangler.tomlに記述がない場合は追加して再度デプロイしてください。

[observability]
enabled = true

ログのサンプリング

あとはオプショナルなものですが、以下のようにhead_sampling_rateを追加するとログに記録されるリクエストの割合を制御できます。
特に何も書かなければデフォルトは1になっています。 0 から 1 まで、0.01 単位で設定できます。
1 が 100%、0.01 が 1% です。もしhead_sampling_rate = 0.01のように設定すると 100 リクエストに 1 つのログが記録されます。

[observability]
enabled = true
+ head_sampling_rate = 1

Logs の動作確認

動作確認

上記のコードがデプロイされているので以下のcurlコマンドで動作確認を行います。サブドメインをexampleにしていますが各々の設定に書き換えて試してください。Hello Hono!とレスポンスが確認できればうまく動いています。
ログを後ほど確認しますので何度かアクセスしておきます。

curl https://workers-logs.example.workers.dev

ログの確認

ダッシュボードで確認したいログをクリックすると以下の json 形式のログを確認できます。

{
  "message": "GET https://workers-logs.example.workers.dev/",
  "level": "info",
  "$cloudflare": {
    "diagnosticsChannelEvents": [],
    "truncated": false,
    "event": {
      "request": {
        "url": "https://workers-logs.example.workers.dev/",
        "method": "GET",
        "headers": {
          "accept": "*/*",
          "accept-encoding": "gzip, br",
          "cf-connecting-ip": "XXXXXX",
          "cf-ipcountry": "JP",
          "cf-ray": "XXXXXX",
          "cf-visitor": "{\"scheme\":\"https\"}",
          "connection": "Keep-Alive",
          "host": "workers-logs.example.workers.dev",
          "user-agent": "curl/8.1.2",
          "x-forwarded-proto": "https",
          "x-real-ip": "XXXXXX"
        },
        "cf": {
          "longitude": "XXXXXX",
          "httpProtocol": "HTTP/2",
          "tlsCipher": "AEAD-CHACHA20-POLY1305-SHA256",
          "continent": "AS",
          "country": "JP",
          "verifiedBotCategory": "",
          "tlsClientAuth": {
            "certIssuerDNLegacy": "",
            "certIssuerSKI": "",
            "certSubjectDNRFC2253": "",
            "certSubjectDNLegacy": "",
            "certFingerprintSHA256": "",
            "certNotBefore": "",
            "certSKI": "",
            "certSerial": "",
            "certIssuerDN": "",
            "certVerified": "NONE",
            "certNotAfter": "",
            "certSubjectDN": "",
            "certPresented": "0",
            "certRevoked": "0",
            "certIssuerSerial": "",
            "certIssuerDNRFC2253": "",
            "certFingerprintSHA1": ""
          },
          "tlsExportedAuthenticator": {
            "clientFinished": "XXXXXX",
            "clientHandshake": "XXXXXX",
            "serverHandshake": "XXXXXX",
            "serverFinished": "XXXXXX"
          },
          "tlsVersion": "TLSv1.3",
          "city": "XXXXXX",
          "timezone": "Asia/Tokyo",
          "colo": "KIX",
          "tlsClientHelloLength": "333",
          "postalCode": "XXXXXX",
          "region": "XXXXXX",
          "latitude": "XXXXXX",
          "requestPriority": "weight=16;exclusive=0;group=0;group-weight=0",
          "regionCode": "XXXXXX",
          "asOrganization": "XXXXXX",
          "tlsClientExtensionsSha1": "XXXXXX",
          "tlsClientRandom": "XXXXXX",
          "clientTcpRtt": 11,
          "asn": 4713,
          "edgeRequestKeepAliveStatus": 1
        },
        "path": "/"
      },
      "rayId": "XXXXXX",
      "response": {
        "status": 200
      }
    },
    "scriptName": "workers-logs",
    "outcome": "ok",
    "eventType": "fetch",
    "scriptVersion": {
      "id": "XXXXXX"
    },
    "$metadata": {
      "requestId": "XXXXXX",
      "id": "XXXXXX",
      "type": "cf-worker-event"
    }
  }
}

ライブ機能

上記のダッシュボードだとログの保存に時間がかかるためリクエストを送ってからログが表示されるまでに 2〜3 分ほどかかってしまいます。
右上の「▶️ ライブ」のボタンを押すと以下のような画面になるのでここからリアルタイムにログを確認することも可能です。

まとめ

今回は Workers Logs を試してみました。
この機能があれば、皆さんが望んでいたログの永続化が簡単にできそうで、非常に良かったです。
ただ現状は、ログの保存期間が 7 日間で延長できなかったり、エラーなどの際にアラートで通知する機能がないので、Logs 機能自体は待望だったものの、今後のアップデートに期待したいなと感じました 🤔(Cloudflare の Discord では、すでに保存期間の延長やアラート機能も予定していると言及されています。)
ぜひ、皆さんもすでに運用している Workers で試してみてください 🙌

参考資料

https://developers.cloudflare.com/workers/observability/logs/workers-logs

Gemcook Tech Blog
Gemcook Tech Blog

Discussion