メトリクス

数値データの時系列監視

メトリクスの種類

タイプ説明
Counter単調増加する値リクエスト数、エラー数
Gauge増減する現在値CPU使用率、メモリ使用量
Histogram値の分布(バケット)レスポンスタイムの分布
Summaryパーセンタイル計算済みp50, p90, p99レイテンシ

Prometheus

オープンソースの監視システム。Pull型でメトリクスを収集。PromQLで柔軟なクエリ。

prometheus.yml
yaml
1global:
2 scrape_interval: 15s
3
4scrape_configs:
5 - job_name: 'app'
6 static_configs:
7 - targets: ['app:8080']
8 metrics_path: /metrics

PromQL

1# 現在値
2http_requests_total
3
4# レート(1秒あたりの増加率)
5rate(http_requests_total[5m])
6
7# ステータスコード別
8sum by (status) (rate(http_requests_total[5m]))
9
10# エラー率
11sum(rate(http_requests_total{status=~"5.."}[5m]))
12/ sum(rate(http_requests_total[5m])) * 100
13
14# パーセンタイル(ヒストグラム)
15histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))

アプリケーション計装

metrics.go
go
1import "github.com/prometheus/client_golang/prometheus"
2
3var (
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
22func init() {
23 prometheus.MustRegister(requestsTotal, requestDuration)
24}

カーディナリティ

カーディナリティ = ラベルの組み合わせ数。高すぎるとメモリ・ストレージを圧迫。

  • • ❌ ユーザーID、リクエストIDをラベルにしない
  • • ❌ 無制限の値を取るラベルを避ける
  • • ✅ 有限の値(method, status, endpoint)を使用