Cloudflare Tunnel は、トンネルの健全性を監視し、問題を解決するためのログ、メトリクス、診断ツールを提供します。
トンネルの接続状態は、Cloudflare ダッシュボード ↗ の Networking > Tunnels で確認するか、cloudflared tunnel list を実行して確認できます。
| ステータス | 意味 | 推奨される対応 |
|---|---|---|
| Healthy | トンネルは稼働中で、Cloudflare グローバルネットワークへの 4 本の接続経由でトラフィックを処理しています。 | 対応は不要です。トンネルは正常に動作しています。 |
| Inactive | トンネルは作成済み(API またはダッシュボード経由)ですが、接続を確立するために cloudflared コネクタが一度も実行されていません。 |
オリジンサーバーに cloudflared をインストールして実行し、トンネルを Cloudflare に接続します。インストールコマンドは、Cloudflare ダッシュボードの Networking > Tunnels で対象のトンネルを選び、Overview タブで Add a replica を選ぶと確認できます。API で設定する場合は、トンネルをインストールして実行する を参照してください。 |
| Down | 以前は接続されていましたが、cloudflared プロセスが停止したため、現在は切断されています。 |
1. サーバー上で cloudflared サービス またはプロセスが動いていることを確認します。 2. マシンの電源オフ、アプリケーションのクラッシュ、最近のネットワーク変更など、サーバー側の問題がないかを確認します。 |
| Degraded | cloudflared コネクタは動いており、トンネルはトラフィックを処理していますが、少なくとも 1 本の接続が失敗しています。トンネルの可用性 がさらに低下すると、トンネルがダウンしてトラフィックを処理できなくなるおそれがあります。 |
1. cloudflared の ログ で接続失敗やエラーメッセージを確認します。 2. ローカルネットワークとファイアウォールのルールを調べ、Cloudflare Tunnel の IP とポート への接続がブロックされていないことを確認します。 |
管理者は、トンネルの健全性やデプロイ状態が変わったときにアラートを受け取れます。通知は、メール、webhook、サードパーティサービスで配信できます。
トンネル通知を設定するには、通知を作成する を参照してください。
Tunnel Creation or Deletion Event
対象アカウント内で Cloudflare Tunnel が作成または削除されたときに通知を受け取りたいお客様向けです。
その他のオプション / フィルタなし。
含まれるプランすべての Cloudflare Zero Trust プラン。
受け取ったときの対応対応は不要です。
Tunnel Health Alert
対象Cloudflare Tunnel の健全性ステータスの変化を知りたいお客様向けです。
その他のオプション / フィルタなし。
含まれるプランすべての Cloudflare Zero Trust プラン。
受け取ったときの対応トンネルの健全性を継続的に監視し、cloudflared のレプリカまたはロードバランサー の導入を検討します。
取り得るトンネルステータス(Healthy、Inactive、Down、Degraded)は Tunnel status を参照してください。
トンネルログは、cloudflared と Cloudflare グローバルネットワーク間のすべてのアクティビティと、cloudflared とオリジンサーバー間のすべてのアクティビティを記録します。
オリジンサーバーにアクセスできる場合は、トンネル起動時に --loglevel フラグ でログを有効にできます。デフォルトでは、cloudflared はログを標準エラー(stderr)へ書き込み、サーバー上には保存しません。
各ログ行を JSON オブジェクトとして整形するには、run の前に --output json を追加します。
cloudflared tunnel --output json run <UUID>この形式は、Kubernetes のデプロイや、JSON を取り込むログ収集システムで便利です。
日常的な永続ログには、--log-directory <PATH> を付けて トンネルを実行 します。このフラグは、指定したディレクトリの cloudflared.log へログを書き込み、ファイルが 1 MB に達するとローテーションし、バックアップを最大 5 つ保持します。経過日数によるログ削除は行いません。
cloudflared tunnel --loglevel info --log-directory <PATH> run <UUID>短いトラブルシューティングや、別のツールがローテーションを管理している場合は、代わりに --logfile フラグ を使います。cloudflared は --logfile で指定したファイルをローテーションしません。両方のフラグを設定した場合は、--logfile が優先されます。
実行中のトンネルから、サーバーへの SSH アクセスなしでリアルタイムログをストリーミングできます。
cloudflared デーモンは、アカウント内の任意のトンネルのログをローカルのコマンドラインへストリーミングできます。ローカルマシンとオリジンサーバーの両方に cloudflared をインストールする必要があります。
-
ローカルマシンで、
cloudflaredを Cloudflare アカウントに認証します。cloudflared tunnel login -
特定のトンネルに対して
cloudflared tailを実行します。cloudflared tail <UUID>JSON メッセージをより構造化された形で見るには、出力を jq ↗ などのツールへパイプできます。
cloudflared tail --output=json <UUID> | jq .
- 複数の レプリカ を実行している場合は、ログをストリーミングするレプリカを指定できます:
レプリカ ID を確認するには、Networking > Tunnels を開き、トンネルを選択します。アクティブなレプリカはすべて、トンネル概要ページの Connectors リストに表示されます。レプリカ ID は Connector ID です。cloudflared tail --connector-id <REPLICA ID> <UUID>
ログのフィルターオプション
イベント種別(--event)、イベントレベル(--level)、またはサンプリングレート(-sampling)でログを絞り込むと、オリジンからストリーミングされるログ量を減らせます。オリジンへの負荷、とくに常時高負荷のオリジンへの影響を抑えられます。例:
cloudflared tail --level debug <UUID>| フラグ | 説明 | 指定できる値 | デフォルト値 |
|---|---|---|---|
--event |
イベント / リクエストの種別で絞り込みます。 | cloudflared, http, tcp, udp |
すべてのイベント |
--level |
このレベル以上のログを返します。サーバー側の --loglevel 設定とは独立して動作します。 |
debug, info, warn, error, fatal |
debug |
--sampling |
全ログのうち一部をサンプリングします。 | 0.0 から 1.0 の数値 |
1.0 |
ダッシュボードからトンネルログをストリーミングするには、次の手順を実行します。
-
Cloudflare ダッシュボードで Networking > Tunnels を開き、対象のトンネルを選択します。
Tunnels を開く ↗ -
Live logs タブを開きます。
-
Live を選択してストリーミングを開始します。
同じトンネルに対して複数の cloudflared インスタンス(レプリカ とも呼ばれます)を動かしている場合、接続中のすべてのレプリカのログが自動でストリーミングされ、ホスト名ごとにグループ化されます。どのホストマシンが各ログエントリを出したかを識別しやすくなります。
特定のレプリカにストリームを絞り込むには、Filter アイコンを選択し、Replicas セクションを展開します。Log Level と Event Type でも絞り込めます。
トンネルメトリクスは、Cloudflare Tunnel のスループットとリソース使用量の推移を示します。トンネルを起動すると、cloudflared は Prometheus メトリクスエンドポイント(Prometheus ↗ 形式でメトリクスを公開する HTTP サーバー)を立ち上げます。リモートマシン上の Prometheus ツールキットを使い、cloudflared サーバーからメトリクスデータをスクレイプできます。
コンテナ化していない環境では、cloudflared はメトリクスサーバーを 127.0.0.1:<PORT>/metrics で起動します。<PORT> は 20241 から 20245 の範囲で最初に使えるポートです。すべてのポートが使えない場合、cloudflared はランダムなポートにバインドします。コンテナ環境(Docker、Kubernetes)では、デフォルトのアドレスは 0.0.0.0:<PORT>/metrics です。
デフォルトのポートを確認するには、トンネル起動前後の トンネルログ を確認します。例:
2024-12-19T21:17:58Z INF Starting metrics server on 127.0.0.1:20241/metricsカスタムの IP アドレスとポートでメトリクスを公開するには、cloudflared ホストで次の手順を実行します。
-
トンネルを実行 し、
--metricsフラグを付けます。例:cloudflared tunnel --metrics 127.0.0.1:60123 run my-tunnel -
http://localhost:60123/metricsにアクセスし、メトリクスサーバーが動作していることを確認します。これは、localhost の IP(127.0.0.1または0.0.0.0)を設定した場合にだけ機能します。
これで、メトリクスを Prometheus と Grafana にエクスポートし、可視化とクエリができます。これらのツールの始め方は、Grafana チュートリアル を参照してください。
cloudflared のメトリクス
| 名前 | 説明 | 種類 | ラベル |
|---|---|---|---|
build_info |
ビルドとバージョンの情報です。 | GAUGE | goversion、revision、type、version |
cloudflared_config_local_config_pushes |
Cloudflare へのローカル設定プッシュ回数です。 | COUNTER | |
cloudflared_config_local_config_pushes_errors |
ローカル設定プッシュ中に発生したエラー回数です。 | COUNTER | |
cloudflared_orchestration_config_version |
設定のバージョンです。 | GAUGE | |
cloudflared_tcp_active_sessions |
いずれかのオリジンへプロキシ中の TCP セッションの同時数です。 | GAUGE | |
cloudflared_tcp_total_sessions |
いずれかのオリジンへプロキシした TCP セッションの合計数です。 | COUNTER | |
cloudflared_tunnel_active_streams |
アクティブなストリームの合計数です。 | GAUGE | |
cloudflared_tunnel_concurrent_requests_per_tunnel |
各トンネル経由でプロキシしているリクエストの同時数です。 | GAUGE | |
cloudflared_tunnel_ha_connections |
アクティブな HA 接続の数です。 | GAUGE | |
cloudflared_tunnel_request_errors |
オリジンへのプロキシ中に発生したエラー回数です。 | COUNTER | |
cloudflared_tunnel_server_locations |
各トンネルの接続先です。1 は現在のロケーション、0 は以前のロケーションを表します。 |
GAUGE | connection_id、edge_location |
cloudflared_tunnel_timer_retries |
未確認のハートビート数です。 | GAUGE | |
cloudflared_tunnel_total_requests |
すべてのトンネル経由でプロキシしたリクエスト数です。 | COUNTER | |
cloudflared_tunnel_tunnel_authenticate_success |
トンネル認証が成功した回数です。 | COUNTER | |
cloudflared_tunnel_tunnel_register_success |
トンネル登録が成功した回数です。 | COUNTER | rpcName |
cloudflared_udp_active_sessions |
いずれかのオリジンへプロキシ中の UDP セッションの同時数です。 | GAUGE | |
cloudflared_udp_total_sessions |
いずれかのオリジンへプロキシした UDP セッションの合計数です。 | COUNTER | |
coredns_panics_total |
パニックの回数です。 | COUNTER | |
quic_client_closed_connections |
閉じた接続の数です。 | COUNTER | |
quic_client_latest_rtt |
接続で計測した最新のラウンドトリップ時間(RTT)です。 | GAUGE | conn_index |
quic_client_lost_packets |
接続から失われたパケット数です。 | COUNTER | conn_index、reason |
quic_client_min_rtt |
接続で計測した最小 RTT(ミリ秒)です。 | GAUGE | conn_index |
quic_client_packet_too_big_dropped |
オリジンから受信したパケットのうち、Cloudflare へ送れず破棄した数です。 | COUNTER | |
quic_client_smoothed_rtt |
接続で算出した平滑化 RTT(ミリ秒)です。 | GAUGE | conn_index |
quic_client_total_connections |
開始した接続の数です。QUIC メトリクスでは、client は接続を開始した側を指します。 | COUNTER |
Prometheus のメトリクス
| 名前 | 説明 | タイプ | ラベル |
|---|---|---|---|
promhttp_metric_handler_requests_in_flight |
現在処理中のスクレイプ数です。 | GAUGE | |
promhttp_metric_handler_requests_total |
HTTP ステータスコード別のスクレイプ総数です。 | COUNTER | code |
Go ランタイムのメトリクス
| 名前 | 説明 | 種類 | ラベル |
|---|---|---|---|
go_gc_duration_seconds |
ガベージコレクションサイクルの一時停止時間のサマリーです。 | SUMMARY | |
go_goroutines |
現在存在する goroutine の数です。 | GAUGE | |
go_info |
Go 環境に関する情報です。 | GAUGE | version |
go_memstats_alloc_bytes |
割り当て済みで、まだ使用中のバイト数です。 | GAUGE | |
go_memstats_alloc_bytes_total |
解放済みを含む、割り当てたバイト数の合計です。 | COUNTER | |
go_memstats_buck_hash_sys_bytes |
プロファイリング用バケットハッシュテーブルが使うバイト数です。 | GAUGE | |
go_memstats_frees_total |
解放回数の合計です。 | COUNTER | |
go_memstats_gc_sys_bytes |
ガベージコレクションのシステムメタデータが使うバイト数です。 | GAUGE | |
go_memstats_heap_alloc_bytes |
割り当て済みで、まだ使用中のヒープバイト数です。 | GAUGE | |
go_memstats_heap_idle_bytes |
使用待ちのヒープバイト数です。 | GAUGE | |
go_memstats_heap_inuse_bytes |
使用中のヒープバイト数です。 | GAUGE | |
go_memstats_heap_objects |
割り当て済みオブジェクトの数です。 | GAUGE | |
go_memstats_heap_released_bytes |
OS へ解放したヒープバイト数です。 | GAUGE | |
go_memstats_heap_sys_bytes |
システムから取得したヒープバイト数です。 | GAUGE | |
go_memstats_last_gc_time_seconds |
前回のガベージコレクションの Unix 時刻(1970 年からの秒数)です。 | GAUGE | |
go_memstats_lookups_total |
ポインター参照回数の合計です。 | COUNTER | |
go_memstats_mallocs_total |
malloc 回数の合計です。 | COUNTER | |
go_memstats_mcache_inuse_bytes |
mcache 構造体が使用中のバイト数です。 | GAUGE | |
go_memstats_mcache_sys_bytes |
システムから取得した mcache 構造体のバイト数です。 | GAUGE | |
go_memstats_mspan_inuse_bytes |
mspan 構造体が使用中のバイト数です。 | GAUGE | |
go_memstats_mspan_sys_bytes |
システムから取得した mspan 構造体のバイト数です。 | GAUGE | |
go_memstats_next_gc_bytes |
次のガベージコレクションが実行されるヒープバイト数です。 | GAUGE | |
go_memstats_other_sys_bytes |
その他のシステム割り当てが使うバイト数です。 | GAUGE | |
go_memstats_stack_inuse_bytes |
スタックアロケーターが使用中のバイト数です。 | GAUGE |
Cloudflare Tunnel は、ローカルマシンで実行中の単一の cloudflared インスタンスからデータを収集する診断レポートを生成します。cloudflared バージョン 2024.12.2 以降が必要です。
-
(Linux のみ)ログにネットワーク診断を含めるには、
cloudflaredユーザーが root 権限なしで RAW ソケットと PACKET ソケットを作成できるようにします。sudo setcap cap_net_raw+ep /usr/bin/traceroute && sudo setcap cap_net_raw+ep /usr/bin/traceroutecap_net_rawを設定しない場合、traceroute のデータは利用できません。 -
診断ログを取得します。
cloudflared tunnel diag同じホストで複数の
cloudflaredインスタンスが動いている場合は、診断したいインスタンスの メトリクスサーバーの IP とポート を指定します。例:cloudflared tunnel diag --metrics 127.0.0.1:20241
このコマンドは各診断タスクのステータスを出力し、作業ディレクトリに cloudflared-diag-YYYY-MM-DDThh-mm-ss.zip ファイルを作成します。
Docker の診断
cloudflared は、診断データを トンネルメトリクスサーバー から読み取ります。診断ログを取得するには、メトリクスサーバーを Docker コンテナから公開し、ホストマシンから到達できる必要があります。
-
Docker で実行中の
cloudflaredインスタンスの メトリクスサーバーのポート を確認します。 -
コンテナをポート転送ありでデプロイします。診断機能はローカルポート
20241を使って Docker インスタンスから情報を取得するため、手順 1 で確認したコンテナポートへ20241を転送します。docker run -d -p 20241:<metrics_port> docker.io/cloudflare/cloudflared tunnel ... -
Docker ホスト環境からメトリクスサーバーのアドレスに到達できることを確認します。
curl localhost:20241/diag/tunnelこのコマンドは次のような JSON を返します。
{ "tunnelID": "ef96b330-a7f5-4bce-a00e-827ce5be077f", "connectorID": "d236670a-9f74-422f-adf1-030f5c5f0523", "connections": [ { "isConnected": true, "protocol": 1, "edgeAddress": "198.41.192.167"}, {"isConnected": true, "protocol": 1, "edgeAddress": "198.41.200.113", "index": 1}, {"isConnected": true, "protocol": 1, "edgeAddress": "198.41.192.47", "index": 2}, {"isConnected": true, "protocol": 1, "edgeAddress": "198.41.200.73", "index": 3} ], "icmp_sources": ["192.168.1.243", "fe80::c59:bd4a:e815:ed6"] } -
Docker コンテナ ID を指定して診断を実行します。
cloudflared tunnel diag --diag-container-id=<containerID>コンテナ ID の代わりにコンテナ名を指定することもできます。
cloudflared tunnel diag --diag-container-id=<containerName>コンテナ ID を指定して診断コマンドを実行すると、
cloudflaredはログやコンテナの詳細など、Docker 環境から情報を収集できます。
このコマンドは各診断タスクのステータスを出力し、作業ディレクトリに cloudflared-diag-YYYY-MM-DDThh-mm-ss.zip ファイルを作成します。
Kubernetes の診断
診断機能は、ポート 20241 から 20245 を使って トンネルメトリクスサーバー からデータを取得します。ローカルの cloudflared インスタンスがこれらのポートのいずれかでメトリクスサーバーに接続できるよう、ポート転送が必要です。
-
トンネルの メトリクスサーバーのポート を確認します。
-
ポート転送を有効にします。
kubectl port-forward <pod> <diagnostic_port>:<metrics_port><pod>: トンネルが動いている Pod の名前<diagnostic_port>は、20241から20245の範囲内の任意のローカルポートです。<metrics_port>は、診断対象のcloudflaredインスタンスの Kubernetes Pod ポートです(手順 1 で確認します)。
たとえば、メトリクスサーバーのアドレスを
0.0.0.0:12345に設定している場合:kubectl port-forward cloudflared-6d4897585b-r8kfz 20244:12345ローカルポート
20244への接続は、トンネルが動いている Pod のポート12345へ転送されます。 -
診断を実行します。
cloudflared tunnel diag --diag-pod-id=<podID>Pod で複数のアプリケーション/サービスが動いており、
cloudflaredが Pod 内の先頭でない場合は、コンテナ ID または名前を指定する必要があります。cloudflared tunnel diag --diag-pod-id=<podID> --diag-container-id=<containerName>
このコマンドは各診断タスクのステータスを出力し、作業ディレクトリに cloudflared-diag-YYYY-MM-DDThh-mm-ss.zip ファイルを作成します。
cloudflared-diag-YYYY-MM-DDThh-mm-ss.zip アーカイブには、次のファイルが含まれます。各ファイルのデータは、診断対象の cloudflared インスタンス(diagnosee)か、診断を開始したインスタンス(diagnoser)のどちらかに対応します。たとえば、トンネルが Docker コンテナで動作している場合、diagnosee は Docker インスタンス、diagnoser はホストインスタンスです。
| ファイル名 | 説明 | インスタンス |
|---|---|---|
cli-configuration.json |
トンネル起動時に使った トンネル実行パラメーター | diagnosee |
cloudflared_logs.txt |
トンネルログファイル1 | diagnosee |
configuration.json |
トンネル構成パラメーター | diagnosee |
goroutine.pprof |
pprof が提供する goroutine プロファイル |
diagnosee |
heap.pprof |
pprof が提供するヒーププロファイル |
diagnosee |
metrics.txt |
診断時点の トンネルメトリクス のスナップショット | diagnosee |
network.txt |
IPv4 と IPv6 を使った、Cloudflare グローバルネットワークへの JSON traceroute | diagnoser |
raw-network.txt |
IPv4 と IPv6 を使った、Cloudflare グローバルネットワークへの生の traceroute | diagnoser |
systeminformation.json |
OS 情報とリソース使用状況 | diagnosee |
task-result.json |
各診断タスクの結果 | diagnoser |
tunnelstate.json |
診断時点のトンネル接続 | diagnosee |
-
ログファイルが空の場合は、トンネル起動時に
--loglevelをdebugに設定 する必要があることがあります。--loglevelパラメーターが必要になるのは、CLI でcloudflared tunnel runコマンドを使ってトンネルを実行した場合だけです。Linux / macOS のサービスとして動作している場合や、Docker / Kubernetes で動作している場合は不要です。 ↩