メトリクスのクエリと分析パターン ​

メトリクスの価値は、収集するだけでは顕在化しません。これらのデータから有意な情報を引き出すには、適切なクエリと分析が不可欠です。特にPrometheusのようなTSDBでは、PromQL(Prometheus Query Language)というクエリ言語を使用して、複雑なデータ分析を実現できます。

メトリクスのクエリの役割 ​

メトリクスクエリは、生のメトリクスデータを有用な情報に変換するプロセスです。例えば、CPUの使用率の瞬間値が必要な場合もあれば、過去1時間の平均値が必要な場合もあります。また、複数のメトリクスを組み合わせて、システム全体の健全性を評価することもあります。

一般的なクエリの用途 ​

現在値の確認: 「このサービスのメモリ使用量は現在いくらか」といった、最新の値を取得するクエリ。

時間範囲での集計: 「過去1時間のリクエスト数の合計はいくらか」といった、期間内での集計値を求めるクエリ。

トレンド分析: 「この1週間でCPU使用率はどう推移しているか」という傾向を把握するクエリ。

多次元分析: 「エンドポイント別、ステータスコード別にリクエスト数を集計する」といった、複数の軸での分析。

PromQL(Prometheus Query Language)の基本 ​

PromQLは、時系列データを効率的に検索・加工するために設計されたクエリ言語です。構文はシンプルですが、習熟すれば複雑な分析が可能になります。

メトリクス名による検索 ​

最も基本的なクエリは、メトリクス名だけを指定するものです。例えば cpu_usage_percent というメトリクスであれば、その名前を指定すると、そのメトリクスのすべての現在値が取得できます。

cpu_usage_percent

ラベルフィルタリング ​

メトリクスには複数のラベルが付与されています。特定のラベル値を持つメトリクスだけを抽出する場合は、ラベルマッチャーを使用します。

http_requests_total{method="GET",status="200"}

この例では、GETメソッドで、ステータスコードが200のHTTPリクエストだけを対象にします。

範囲ベクトルと範囲指定 ​

メトリクスの過去の値を取得するには、範囲指定を使用します。[5m] は過去5分間のデータを、[1h] は過去1時間のデータを指します。

cpu_usage_percent{instance="server1"}[5m]

この例では、server1の過去5分間のCPU使用率の推移が得られます。

典型的な分析パターン ​

パターン1: 移動平均による平滑化 ​

メトリクスデータには常にノイズが含まれます。短期的な変動を除去し、トレンドを見やすくするには、移動平均を計算します。

avg_over_time(http_response_time_ms[5m])

この例では、HTTPレスポンス時間の過去5分間の平均を計算しています。ノイズの多いメトリクスでも、移動平均を使えばトレンドが見えやすくなります。

パターン2: 複数メトリクスの組み合わせ ​

システムの状態を多角的に評価するには、複数のメトリクスを組み合わせることが有効です。例えば、利用可能メモリと総メモリから、メモリ使用量をパーセンテージで計算できます。

(1 - (available_memory_bytes / total_memory_bytes)) * 100

このように、四則演算を使用してメトリクスを組み合わせると、新しい指標を作成できます。

パターン3: 率の計算 ​

メトリクスがCounterの場合(例えば、処理されたリクエスト総数)、その変化率を計算することで、単位時間あたりのスループットが得られます。

rate(http_requests_total[1m])

この例では、HTTPリクエスト総数の1分あたりの変化率(つまり、1秒あたりのリクエスト数)が計算されます。

パターン4: パーセンタイル分析 ​

Histogramメトリクスから、パーセンタイルを抽出すると、レスポンス時間の分布を理解できます。

histogram_quantile(0.95, sum(rate(http_response_time_ms_bucket[5m])) by (le))

このクエリは、95パーセンタイルのレスポンス時間を計算しています。つまり、リクエストの95%がこの時間以内に完了したことを意味します。

パターン5: グループ化と集計 ​

複数の系統のメトリクスを、特定のラベル単位でグループ化して集計することは、多くの分析で必要になります。

sum by (endpoint) (http_requests_total)

この例では、HTTPリクエスト総数をエンドポイント別に集計しています。

クエリの最適化 ​

1. 範囲指定の選択 ​

短い範囲(例えば1分)は詳細な分析ができますが、データ量が多くなりクエリが遅くなります。分析の目的に応じて適切な範囲を選択することが重要です。

2. ダウンサンプリングの活用 ​

長期的なトレンドを見る際に、高精度のデータは不要な場合があります。あらかじめダウンサンプリングしたメトリクスを用意すれば、クエリ性能が向上します。

3. 正規表現マッチングの使用 ​

複数のメトリクスを同時に検索したい場合、正規表現マッチングが便利です。ただし、正規表現マッチングはワイルドカード指定より計算コストが高いため、避けられない場合以外は使用を控えます。

クエリ結果の解釈 ​

PromQLのクエリ結果には、瞬時ベクトル(単一の値)、範囲ベクトル(時系列データ)、スカラー値など複数の形式があります。取得したデータの形式を理解しておくと、その後の処理や可視化が適切に行えます。

実装上の注意点 ​

1. データ欠落への対応 ​

メトリクス送信に一時的な遅延やエラーが発生すると、タイムシリーズにギャップが生じます。このようなケースでの分析をどのように行うかは、事前に定めておく必要があります。

2. ラベル値の変化への対応 ​

アプリケーションのバージョンアップなどでラベル値が変わると、新しいシリーズが作成されます。複数のバージョンをまたいだ分析をする際は、このラベル値の変化を考慮する必要があります。

3. クエリキャッシュの活用 ​

同じクエリを繰り返し実行する場合、キャッシュを活用することでTSDBへの負荷を軽減できます。ただし、キャッシュの鮮度とクエリの用途のバランスを考慮する必要があります。

まとめ ​

メトリクスから価値ある情報を引き出すには、適切なクエリと分析手法が不可欠です。PromQLの基本を理解し、典型的なパターンに習熟すると、メトリクスベースの監視がより効果的になります。

クエリの最適化や、複雑な分析パターンは、実際の運用経験を通じて習得される部分が大きいため、まずは基本パターンを確実に理解することから始めることをお勧めします。