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 Collector、Process 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"})