ドキュメント
a プロジェクト

Prometheus メトリクスによる Caddy のモニタリング

クラウドで何千もの Caddy インスタンスを実行している場合でも、組み込みデバイスで単一の Caddy サーバーを実行している場合でも、Caddy の動作状況と処理時間に関する全体像を把握したいと思うことはよくあるでしょう。つまり、Caddy を *モニタリング* する必要があるということです。

メトリクスの有効化

メトリクスを有効にする必要があります。

Caddyfile を使用している場合は、グローバルオプションでメトリクスを有効にします グローバルオプション

{
    servers {
        metrics
    }
}

JSON を使用している場合は、"metrics": {}apps > http > servers 構成 に追加します。

Prometheus

Prometheus は、監視対象のターゲット上のメトリクス HTTP エンドポイントをスクレイピングすることで、メトリクスを収集するモニタリングプラットフォームです。 Grafana などのダッシュボードツールでメトリクスを表示するのに役立つだけでなく、Prometheus は アラート にも使用されます。

Caddy と同様に、Prometheus は Go で記述されており、単一のバイナリとして配布されています。インストールするには、Prometheus インストールドキュメント を参照するか、MacOS では brew install prometheus を実行するだけです。

Prometheus を初めて使用する場合は、Prometheus ドキュメント を読んでください。そうでない場合は、読み進めてください!

Prometheus が Caddy からスクレイピングするように構成するには、次のような YAML 構成ファイルが必要です。

# prometheus.yaml
global:
  scrape_interval: 15s # default is 1 minute

scrape_configs:
  - job_name: caddy
    static_configs:
      - targets: ['localhost:2019']

その後、次のようにして Prometheus を起動できます。

$ prometheus --config.file=prometheus.yaml

Caddy のメトリクス

Prometheus で監視される他のプロセスと同様に、Caddy は Prometheus エクスポジション形式 で応答する HTTP エンドポイントを公開します。Caddy の Prometheus クライアントは、ネゴシエートされた場合(つまり、Accept ヘッダーが application/openmetrics-text; version=0.0.1 に設定されている場合)、OpenMetrics エクスポジション形式 で応答するように構成されています。

デフォルトでは、管理 API (つまり https://:2019/metrics)で /metrics エンドポイントが使用できます。しかし、管理 API が無効になっている場合、または別のポートやパスでリッスンしたい場合は、metrics ハンドラー を使用してこれを構成できます。

ブラウザまたは curl などの HTTP クライアントを使用してメトリクスを確認できます。

$ curl https://:2019/metrics
# HELP caddy_admin_http_requests_total Counter of requests made to the Admin API's HTTP endpoints.
# TYPE caddy_admin_http_requests_total counter
caddy_admin_http_requests_total{code="200",handler="metrics",method="GET",path="/metrics"} 2
# HELP caddy_http_request_duration_seconds Histogram of round-trip request durations.
# TYPE caddy_http_request_duration_seconds histogram
caddy_http_request_duration_seconds_bucket{code="308",handler="static_response",method="GET",server="remaining_auto_https_redirects",le="0.005"} 1
caddy_http_request_duration_seconds_bucket{code="308",handler="static_response",method="GET",server="remaining_auto_https_redirects",le="0.01"} 1
caddy_http_request_duration_seconds_bucket{code="308",handler="static_response",method="GET",server="remaining_auto_https_redirects",le="0.025"} 1
...

表示されるメトリクスは多数あり、大きく分けて 4 つのカテゴリに分類されます。

  • ランタイムメトリクス
  • 管理 API メトリクス
  • HTTP ミドルウェアメトリクス
  • リバースプロキシメトリクス

ランタイムメトリクス

これらのメトリクスは、Caddy プロセスの内部をカバーしており、Prometheus Go クライアントによって自動的に提供されます。これらは go_*process_* で接頭辞が付けられています。

process_* メトリクスは、Linux と Windows でのみ収集されることに注意してください。

Go CollectorProcess Collector、および BuildInfo Collector のドキュメントを参照してください。

管理 API メトリクス

これらは、Caddy 管理 API の監視に役立つメトリクスです。各管理エンドポイントは、リクエスト数とエラーを追跡するためにインストルメント化されています。

これらのメトリクスは、caddy_admin_* で接頭辞が付けられています。

例えば

$ curl -s https://:2019/metrics | grep ^caddy_admin
caddy_admin_http_requests_total{code="200",handler="admin",method="GET",path="/config/"} 1
caddy_admin_http_requests_total{code="200",handler="admin",method="GET",path="/debug/pprof/"} 2
caddy_admin_http_requests_total{code="200",handler="admin",method="GET",path="/debug/pprof/cmdline"} 1
caddy_admin_http_requests_total{code="200",handler="load",method="POST",path="/load"} 1
caddy_admin_http_requests_total{code="200",handler="metrics",method="GET",path="/metrics"} 3

caddy_admin_http_requests_total

admin.api.* 名前空間内のモジュールを含む、管理エンドポイントによって処理されたリクエスト数のカウンターです。

ラベル 説明
code HTTP ステータスコード
handler ハンドラーまたはモジュール名
method HTTP メソッド
path 管理エンドポイントがマウントされた URL パス

caddy_admin_http_request_errors_total

admin.api.* 名前空間内のモジュールを含む、管理エンドポイントで発生したエラー数のカウンターです。

ラベル 説明
handler ハンドラーまたはモジュール名
method HTTP メソッド
path 管理エンドポイントがマウントされた URL パス

HTTP ミドルウェアメトリクス

すべての Caddy HTTP ミドルウェアハンドラーは、リクエストのレイテンシ、最初のバイトまでの時間、エラー、およびリクエスト/レスポンス本文のサイズを決定するために自動的にインストルメント化されます。

以下のヒストグラムメトリクスのバケットは、現在構成できません。期間については、デフォルトの (prometheus.DefBuckets のバケットセット(5ms、10ms、25ms、50ms、100ms、250ms、500ms、1s、2.5s、5s、および 10s)が使用されます。サイズについては、バケットは 256b、1kiB、4kiB、16kiB、64kiB、256kiB、1MiB、および 4MiB です。

caddy_http_requests_in_flight

このサーバーで現在処理されているリクエスト数のゲージです。

ラベル 説明
server サーバー名
handler ハンドラーまたはモジュール名

caddy_http_request_errors_total

リクエストの処理中に発生したミドルウェアエラーのカウンターです。

ラベル 説明
server サーバー名
handler ハンドラーまたはモジュール名

caddy_http_requests_total

行われた HTTP(S) リクエストのカウンターです。

ラベル 説明
server サーバー名
handler ハンドラーまたはモジュール名

caddy_http_request_duration_seconds

ラウンドトリップリクエスト期間のヒストグラムです。

ラベル 説明
server サーバー名
handler ハンドラーまたはモジュール名
code HTTP ステータスコード
method HTTP メソッド

caddy_http_request_size_bytes

リクエストの合計(推定)サイズのヒストグラムです。本文を含みます。

ラベル 説明
server サーバー名
handler ハンドラーまたはモジュール名
code HTTP ステータスコード
method HTTP メソッド

caddy_http_response_size_bytes

返されたレスポンス本文サイズのヒストグラムです。

ラベル 説明
server サーバー名
handler ハンドラーまたはモジュール名
code HTTP ステータスコード
method HTTP メソッド

caddy_http_response_duration_seconds

レスポンスの最初のバイトまでの時間のヒストグラムです。

ラベル 説明
server サーバー名
handler ハンドラーまたはモジュール名
code HTTP ステータスコード
method HTTP メソッド

リバースプロキシメトリクス

caddy_reverse_proxy_upstreams_healthy

リバースプロキシアップストリームの正常性のゲージです。

0 はアップストリームが正常でないことを意味し、1 はアップストリームが正常であることを意味します。

ラベル 説明
upstream アップストリームのアドレス

サンプルクエリ

Prometheus が Caddy のメトリクスをスクレイピングしたら、Caddy のパフォーマンスに関する興味深いメトリクスを確認できるようになります。

たとえば、5 分間にわたる平均として、毎秒のリクエストレートを表示するには

rate(caddy_http_requests_total{handler="file_server"}[5m])

100ms のレイテンシしきい値を超えるレートを確認するには

sum(rate(caddy_http_request_duration_seconds_count{server="srv0"}[5m])) by (handler)
-
sum(rate(caddy_http_request_duration_seconds_bucket{le="0.100", server="srv0"}[5m])) by (handler)

file_server ハンドラーでの 95 パーセンタイルのリクエスト期間を確認するには、次のようなクエリを使用できます。

histogram_quantile(0.95, sum(caddy_http_request_duration_seconds_bucket{handler="file_server"}) by (le))

または、file_server ハンドラーでの正常な GET リクエストのメディアンレスポンスサイズ(バイト単位)を確認するには

histogram_quantile(0.5, caddy_http_response_size_bytes_bucket{method="GET", handler="file_server", code="200"})