メトリクス
数値データの時系列監視
メトリクスの種類
| タイプ | 説明 | 例 |
|---|---|---|
| Counter | 単調増加する値 | リクエスト数、エラー数 |
| Gauge | 増減する現在値 | CPU使用率、メモリ使用量 |
| Histogram | 値の分布(バケット) | レスポンスタイムの分布 |
| Summary | パーセンタイル計算済み | p50, p90, p99レイテンシ |
Prometheus
オープンソースの監視システム。Pull型でメトリクスを収集。PromQLで柔軟なクエリ。
prometheus.yml
yaml
1 global: 2 scrape_interval: 15s 3 4 scrape_configs: 5 - job_name: 'app' 6 static_configs: 7 - targets: ['app:8080'] 8 metrics_path: /metrics
PromQL
1 # 現在値 2 http_requests_total 3 4 # レート(1秒あたりの増加率) 5 rate(http_requests_total[5m]) 6 7 # ステータスコード別 8 sum by (status) (rate(http_requests_total[5m])) 9 10 # エラー率 11 sum(rate(http_requests_total{status=~"5.."}[5m])) 12 / sum(rate(http_requests_total[5m])) * 100 13 14 # パーセンタイル(ヒストグラム) 15 histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
アプリケーション計装
metrics.go
go
1 import "github.com/prometheus/client_golang/prometheus" 2 3 var ( 4 requestsTotal = prometheus.NewCounterVec( 5 prometheus.CounterOpts{ 6 Name: "http_requests_total", 7 Help: "Total HTTP requests", 8 }, 9 []string{"method", "path", "status"}, 10 ) 11 12 requestDuration = prometheus.NewHistogramVec( 13 prometheus.HistogramOpts{ 14 Name: "http_request_duration_seconds", 15 Help: "HTTP request latency", 16 Buckets: []float64{.005, .01, .025, .05, .1, .25, .5, 1}, 17 }, 18 []string{"method", "path"}, 19 ) 20 ) 21 22 func init() { 23 prometheus.MustRegister(requestsTotal, requestDuration) 24 }
カーディナリティ
カーディナリティ = ラベルの組み合わせ数。高すぎるとメモリ・ストレージを圧迫。
- • ❌ ユーザーID、リクエストIDをラベルにしない
- • ❌ 無制限の値を取るラベルを避ける
- • ✅ 有限の値(method, status, endpoint)を使用