shiichan

WebSocket の切断理由が丸わかりに!新しい WebSocket Analytics データセットが登場だよ!

みんな、しぃちゃんだよ!WebSocket を運用してる人にとってすごく実用的なアップデートを見つけたから、テンション高めで紹介しちゃうね!

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

Cloudflare の Changelog で、Logpush 向けの新しいデータセット websocket_analytics が発表されたよ。エンタープライズ顧客向けの機能で、コネクション単位の WebSocket 分析情報を任意の Logpush 送信先にプッシュできるようになるの。各ログレコードは WebSocket 接続がクローズしたタイミングで出力される仕組みだよ。

含まれる主なフィールドはこんな感じ:

  • ConnectionCloseReason — 接続が終了した理由(peerReset / peerNoError / timedOut / upstreamReset / protocolViolation / unspecifiedError / none)
  • ConnectionCloseSource — どちら側が切断を開始したか(upstream / downstream / me / both)
  • ConnectionTransportCloseCode — TLS のアラートコードや TCP レベルのクローズコード
  • RayID — 既存の HTTP リクエストログとの突き合わせに使える識別子

これに加えて、送受信の方向別バイト数(BytesSentClient / BytesReceivedClient / BytesSentOrigin / BytesReceivedOrigin)、接続のタイムスタンプ、クライアント IP、コロケーションコード、WebSocket アップグレード時点のリクエストメタデータも含まれているよ。

なぜ重要なの?

原文によると、このデータセットに入っているフィールドの多くは、これまで Cloudflare のエンジニアが社内ツール経由でしか見られなかった情報なんだって。WebSocket は接続がずっと張られたままになる性質上、切断の原因が分かりづらくて、障害調査がしにくいプロトコルなの。それがログとしてそのまま出てくるようになるのは、運用者にとってかなり大きい意味を持つよ。

これで何が変わるの?

たとえば ConnectionCloseReason == "peerReset" のようなイベントをホストやデータセンターごとに集計すれば、TCP リセットが急増しているパターンを既存のログ分析ツールの中でそのまま検知できるようになるの。今まで「なんとなく WebSocket が切れる」というふわっとした状況だったものが、具体的にどちら側が・どういう理由で・どのくらいの頻度で切断しているのかまで、手元のデータで説明できるようになるよ。

まとめ

  • WebSocket 接続がクローズするたびに 1 レコードを出力する websocket_analytics データセットが新登場
  • 切断理由・切断元・TLS/TCP のクローズコード・バイト数・RayID などが取得できる
  • エンタープライズプランで、任意の Logpush 送信先に出力可能

WebSocket ベースのサービスをエンタープライズ規模で運用している人には、障害調査がぐっとラクになる嬉しいアップデートだよ!