LESSON 25分

ストーリー

高橋アーキテクト
ログは”何が起きたか”を教えてくれる。メトリクスは”どれだけ起きているか”を教えてくれる

高橋アーキテクトがダッシュボード画面を見せた。

高橋アーキテクト
リクエスト数の推移、エラー率、レスポンスタイムの分布。メトリクスを正しく設計すれば、システムの健康状態が一目でわかるようになる。まずはメトリクスの種類を理解しよう

メトリクスとは

メトリクスは、時間とともに変化する数値データを定期的に記録したものです。ログが個別のイベントを記録するのに対し、メトリクスは集計された数値を記録します。

ログ:  「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分