ストーリー
高橋アーキテクトがダッシュボード画面を見せた。
メトリクスとは
メトリクスは、時間とともに変化する数値データを定期的に記録したものです。ログが個別のイベントを記録するのに対し、メトリクスは集計された数値を記録します。
ログ: 「10:30:45 ユーザーAが注文を作成した」(個別イベント)
メトリクス: 「10:30 の1分間に注文が42件作成された」(集計値)
メトリクスの4つの種類
1. Counter(カウンター)
単調に増加する累積値です。リセットされるのはプロセス再起動時のみ。
import { metrics } from '@opentelemetry/api';
const meter = metrics.getMeter('order-service');
// Counter: リクエストの総数
const requestCounter = meter.createCounter('http_requests_total', {
description: 'Total number of HTTP requests',
});
// 使用例
function handleRequest(method: string, status: number) {
requestCounter.add(1, {
method,
status: String(status),
path: '/api/orders',
});
}
// http_requests_total{method="GET", status="200", path="/api/orders"} = 15234
// http_requests_total{method="POST", status="201", path="/api/orders"} = 3421
// http_requests_total{method="POST", status="500", path="/api/orders"} = 12
用途: リクエスト数、エラー数、処理件数など
2. Gauge(ゲージ)
増減する瞬間的な値です。
// Gauge: 現在のアクティブ接続数
const activeConnections = meter.createUpDownCounter('active_connections', {
description: 'Number of active connections',
});
// 接続時に+1、切断時に-1
function onConnect() { activeConnections.add(1); }
function onDisconnect() { activeConnections.add(-1); }
// active_connections{service="api"} = 42
用途: CPU使用率、メモリ使用量、キュー長、アクティブ接続数など
3. Histogram(ヒストグラム)
値の分布を記録します。パーセンタイル計算に使用します。
// Histogram: レスポンスタイムの分布
const responseTime = meter.createHistogram('http_request_duration_ms', {
description: 'HTTP request duration in milliseconds',
unit: 'ms',
});
// 使用例
function measureRequest(duration: number, method: string, path: string) {
responseTime.record(duration, { method, path });
}
// バケット(区間)ごとの集計結果
// http_request_duration_ms_bucket{le="50"} = 8000 (50ms以下が8000件)
// http_request_duration_ms_bucket{le="100"} = 9200 (100ms以下が9200件)
// http_request_duration_ms_bucket{le="250"} = 9800 (250ms以下が9800件)
// http_request_duration_ms_bucket{le="500"} = 9950
// http_request_duration_ms_bucket{le="1000"} = 9990
// http_request_duration_ms_bucket{le="+Inf"} = 10000
用途: レスポンスタイム、ペイロードサイズ、処理時間の分布
4. Summary(サマリー)
クライアント側でパーセンタイルを計算する方式です。
// Summary: P50, P90, P99を直接計算
// http_request_duration_summary{quantile="0.5"} = 85 (P50 = 85ms)
// http_request_duration_summary{quantile="0.9"} = 210 (P90 = 210ms)
// http_request_duration_summary{quantile="0.99"} = 480 (P99 = 480ms)
用途: パーセンタイルの直接表示(ただしHistogramの方が推奨される場合が多い)
メトリクスの種類比較
| 種類 | 値の動き | 用途 | 例 |
|---|---|---|---|
| Counter | 単調増加 | 累積カウント | リクエスト数、エラー数 |
| Gauge | 増減 | 瞬間値 | CPU使用率、接続数 |
| Histogram | 分布 | パーセンタイル | レスポンスタイム |
| Summary | 分布 | パーセンタイル(クライアント計算) | レスポンスタイム |
REDメソッドとUSEメソッド
REDメソッド(サービス向け)
| 指標 | 説明 | メトリクス例 |
|---|---|---|
| Rate | リクエスト率 | http_requests_total の rate |
| Errors | エラー率 | http_errors_total / http_requests_total |
| Duration | 処理時間 | http_request_duration_ms のP99 |
USEメソッド(インフラ向け)
| 指標 | 説明 | メトリクス例 |
|---|---|---|
| Utilization | 使用率 | cpu_usage_percent, memory_usage_percent |
| Saturation | 飽和度 | queue_length, thread_pool_pending |
| Errors | エラー数 | disk_errors_total, network_errors_total |
// REDメトリクスの実装例
const redMetrics = {
rate: meter.createCounter('http_requests_total'),
errors: meter.createCounter('http_errors_total'),
duration: meter.createHistogram('http_request_duration_ms'),
};
function recordRequest(method: string, path: string, status: number, duration: number) {
const labels = { method, path };
redMetrics.rate.add(1, labels);
if (status >= 500) {
redMetrics.errors.add(1, labels);
}
redMetrics.duration.record(duration, labels);
}
まとめ
| ポイント | 内容 |
|---|---|
| Counter | 累積カウント(リクエスト数、エラー数) |
| Gauge | 瞬間値(CPU使用率、接続数) |
| Histogram | 値の分布(レスポンスタイム) |
| REDメソッド | サービスの健全性を Rate, Errors, Duration で監視 |
| USEメソッド | インフラの健全性を Utilization, Saturation, Errors で監視 |
チェックリスト
- Counter, Gauge, Histogram, Summaryの違いを説明できる
- OpenTelemetryでメトリクスを実装できる
- REDメソッドとUSEメソッドを理解した
- 適切なメトリクスの種類を選択できる
次のステップへ
次は「Prometheusによるメトリクス収集」を学びます。業界標準のメトリクス収集ツールの使い方を見ていきましょう。
推定読了時間: 25分