Prometheus入門:クラウドネイティブ時代の監視スタンダードを学ぶ

クラウド / インフラ

🚀 Prometheusへようこそ!クラウドネイティブ監視の世界へ

現代のITインフラ、特にコンテナやマイクロサービスを中心としたクラウドネイティブ環境では、システムの健全性を維持し、問題を迅速に特定・解決するための「監視」が不可欠です。その中でも、デファクトスタンダードとしての地位を確立しているのが Prometheus (プロメテウス) です。

Prometheusは、もともとSoundCloud社内で開発され、2016年にKubernetesに次いでCloud Native Computing Foundation (CNCF) に参加したオープンソースの監視およびアラートツールキットです。その強力な機能と柔軟性から、多くの組織で採用されています。

このブログ記事では、Prometheusの基本的な概念、アーキテクチャ、そしてどのように動作するのかを、初心者の方にもわかりやすく、順を追って丁寧に解説していきます。さあ、一緒にPrometheusの世界を探検しましょう!🗺️

🎯 Prometheusのコアコンセプト:監視の基礎を理解する

Prometheusを理解するためには、まずいくつかの重要な概念を知っておく必要があります。

1. メトリクス (Metrics) と時系列データ (Time Series)

Prometheusが収集・保存するデータの基本単位はメトリクスです。メトリクスは、システムの特定の側面を測定した数値データ(例: CPU使用率、メモリ使用量、リクエスト数など)です。

Prometheusはこれらのメトリクスを時系列データとして扱います。これは、特定のメトリクス名と、そのメトリクスを一意に識別するための一連のキーバリューペア(ラベルと呼ばれます)によって識別される、タイムスタンプ付きの値のストリームです。

  • メトリクス名 (Metric Name): 測定対象の一般的な特徴を示します (例: http_requests_total)。
  • ラベル (Labels): メトリクスをさらに詳細化・分類するためのキーバリューペアです (例: {method="POST", handler="/api/users"})。
  • タイムスタンプ (Timestamp): データが収集された時点の時刻 (通常はミリ秒単位のUnix時間)。
  • 値 (Value): 測定された数値 (常にfloat64)。

例えば、api_http_requests_total{method="GET", handler="/messages"} という時系列データは、「/messages エンドポイントへのGETリクエストの総数」を表します。

2. データモデル

Prometheusのデータモデルは、このメトリクス名とラベルの組み合わせに基づいています。これにより、多次元的なデータ分析が可能になります。同じメトリクス名でも、異なるラベルセットを持つことで、様々な角度からシステムの状態を捉えることができます。

🔑 キーポイント: ラベルはPrometheusの強力な機能の核心です。これにより、柔軟なクエリ、集計、アラート設定が可能になります。

3. メトリクスの種類

Prometheusは主に4つのメトリクスタイプを定義しています。

  • Counter (カウンター): 単調増加する累積値。リクエスト数、完了したタスク数、エラー数などに使用されます。リセットされることもありますが、減少することはありません (例: http_requests_total)。
  • Gauge (ゲージ): 任意に上下する単一の数値。現在のメモリ使用量、キュー内のジョブ数、CPU温度などに使用されます (例: memory_usage_bytes)。
  • Histogram (ヒストグラム): 観測値を設定可能なバケット(区間)に分類し、その度数をカウントします。また、全観測値の合計値も提供します。リクエストのレイテンシやレスポンスサイズなどの分布を把握するのに適しています (例: http_request_duration_seconds)。
  • Summary (サマリー): ヒストグラムと同様に観測値の分布を測定しますが、クライアントサイドで設定可能なクォンタイル(分位数、例: 0.5, 0.9, 0.99)を直接計算して提供します。全観測値の合計と観測回数も提供します (例: rpc_duration_seconds)。

🏗️ Prometheusのアーキテクチャ:構成要素を知る

Prometheusのエコシステムは、いくつかの主要なコンポーネントで構成されています。

主要コンポーネント

  1. Prometheus Server:
    • メトリクスを収集 (Scraping) し、ローカルの時系列データベース (TSDB) に保存します。
    • PromQL (Prometheus Query Language) を使用してデータをクエリできます。
    • 設定されたアラートルールに基づいてアラートを生成します。
  2. Client Libraries:
    • アプリケーションコードに計装 (instrumentation) を追加し、カスタムメトリクスを公開するためのライブラリです (Go, Java, Python, Rubyなど多数の言語に対応)。
  3. Exporters:
    • 既存のサードパーティシステム (例: Linux OS, HAProxy, MySQL, Kafka) のメトリクスをPrometheusが取得できる形式に変換して公開 (expose) するためのソフトウェアです。
    • 多種多様なExporterがコミュニティによって開発・提供されています (例: node_exporter, mysqld_exporter)。
  4. Pushgateway:
    • 通常PrometheusはPull型でメトリクスを収集しますが、短命なジョブなど、Pullが難しいケースのために、メトリクスをPushで受け付けるためのコンポーネントです。
    • ただし、利用は特定のケースに限定することが推奨されています。
  5. Alertmanager:
    • Prometheus Serverが生成したアラートを受け取り、重複排除、グルーピング、ルーティングを行い、適切な通知チャネル (Email, Slack, PagerDutyなど) に送信します。
    • サイレンシング (一時的な通知抑制) や抑制 (inhibition) などの高度な機能も提供します。
  6. Visualization Tools:
    • Prometheus自体にも基本的なグラフ表示機能がありますが、一般的には Grafana などのダッシュボードツールと連携して、より高度でインタラクティブなデータの可視化を行います。

これらのコンポーネントが連携することで、包括的な監視システムが構築されます。

⚙️ Prometheusの動作原理:Pullモデルとサービスディスカバリ

Prometheusの最大の特徴の一つは、Pull (プル) モデルに基づいたメトリクス収集です。

Pullモデルとは?

Prometheus Serverが、設定された間隔で、監視対象のHTTPエンドポイント (通常は /metrics) にアクセスし、メトリクスデータを「取得 (scrape)」しに行きます。監視対象側 (アプリケーションやExporter) は、このエンドポイントに現在のメトリクス値を特定のテキスト形式 (Prometheus exposition format) で公開しておく必要があります。

👍 Pullモデルの利点:

  • 中央集権的な制御: 監視対象や収集間隔をPrometheus側で一元管理できます。
  • 耐障害性: 監視対象が一時的にダウンしても、Prometheus Serverは次の収集タイミングで再度試行します。Pushモデルのようにデータ消失のリスクが低減されます。
  • 状態確認: エンドポイントへのアクセス自体が、監視対象のヘルスチェックにもなります。

🤔 Pullモデルの考慮点:

  • ネットワーク: Prometheus Serverから監視対象へのネットワーク到達性が必要です。
  • 短命ジョブ: バッチジョブのように短時間で終了するものは、収集タイミングを逃す可能性があります (Pushgatewayが選択肢)。

サービスディスカバリ (Service Discovery)

クラウド環境のように、インスタンスが動的に増減する状況では、監視対象のリストを手動で管理するのは現実的ではありません。そこでPrometheusはサービスディスカバリ機能を備えています。

これにより、Kubernetes API, AWS EC2, Azure VM, Consul, DNSなど、様々なメカニズムを通じて監視対象のターゲットを自動的に発見し、設定ファイルに動的に反映させることができます。これにより、インフラの変動に自動で追従する監視が可能になります。✨

🛠️ 基本的なセットアップと設定:Prometheusを動かしてみる

Prometheusを実際に動かすのは比較的簡単です。ここでは基本的な流れを紹介します。

1. インストール

最も簡単な方法は、公式サイトから自分のOS用のバイナリをダウンロードして展開することです。Dockerイメージも提供されています。

# 例: Linux (amd64) の場合
wget https://github.com/prometheus/prometheus/releases/download/v2.XX.Y/prometheus-2.XX.Y.linux-amd64.tar.gz
tar xvfz prometheus-2.XX.Y.linux-amd64.tar.gz
cd prometheus-2.XX.Y.linux-amd64

(※ バージョン番号 2.XX.Y は最新のものに置き換えてください)

2. 設定ファイル (prometheus.yml)

Prometheusの動作は prometheus.yml というYAML形式の設定ファイルで制御します。最低限必要な設定は以下の通りです。

# グローバル設定
global:
  scrape_interval: 15s # デフォルトの収集間隔 (15秒)
  evaluation_interval: 15s # ルール評価の間隔 (15秒)
  # scrape_timeout はデフォルトで10s

# アラートルールファイルの読み込み場所
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# メトリクス収集の設定
scrape_configs:
  # 'prometheus' というジョブ名で、自分自身 (Prometheus) を監視する設定
  - job_name: 'prometheus'
    # scrape_interval と scrape_timeout は global 設定を継承

    # サービスディスカバリを使わず、静的にターゲットを指定
    static_configs:
      - targets: ['localhost:9090'] # Prometheus Serverのデフォルトポート

この設定では、Prometheus Server自体が公開しているメトリクス (自身の状態やパフォーマンスに関するもの) を15秒ごとに収集します。

監視対象を追加するには、scrape_configs セクションに新しいジョブを追加します。例えば、ローカルホストの9100番ポートで動作している node_exporter (OSメトリクスを公開) を監視対象に追加する場合は、以下のように追記します。

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100'] # node_exporter のデフォルトポート

3. 起動

設定ファイルを用意したら、以下のコマンドでPrometheus Serverを起動します。

./prometheus --config.file=prometheus.yml

起動に成功すると、デフォルトでは http://localhost:9090 でPrometheusのWeb UIにアクセスできます。🎉

Web UIでは、設定の確認、ターゲットの状態確認、そしてPromQLを使ったデータのクエリやグラフ表示が可能です。

🔍 PromQL入門:データを問い合わせる言語

Prometheusの真価を発揮するのが、PromQL (Prometheus Query Language) です。これを使って、収集した時系列データを柔軟に選択、集計、操作できます。

PrometheusのWeb UIの “Graph” タブで、Expression入力フィールドにPromQLクエリを入力して実行できます。

基本的なクエリ

  • 特定のメトリクス名の最新の値を取得:
    node_memory_MemAvailable_bytes

    これは、node_memory_MemAvailable_bytes という名前のすべての時系列データの最新の値を返します。

  • ラベルでフィルタリング:
    http_requests_total{job="prometheus", group="canary"}

    job ラベルが “prometheus” で、かつ group ラベルが “canary” である http_requests_total メトリクスの最新値を返します。

  • 範囲ベクトル (Range Vector): 過去の一定期間のデータを取得します。[ ] 内に期間を指定します (例: 5m = 5分間)。
    http_requests_total{job="prometheus"}[5m]

    これは、過去5分間のすべてのサンプルデータを返します。単体ではグラフ化できませんが、関数と組み合わせて使います。

関数と集計

PromQLには多くの関数や集計演算子が用意されています。

  • rate(): カウンターメトリクスの秒間平均増加率を計算します。範囲ベクトルと組み合わせて使います。
    rate(http_requests_total{job="prometheus"}[5m])

    過去5分間の秒間平均リクエスト数を計算します。

  • sum(): ラベルに基づいて値を集計します。
    sum(rate(http_requests_total[5m]))

    すべての http_requests_total の秒間平均増加率を合計します。

  • sum by (label1, label2) (...): 指定したラベルの組み合わせごとに集計します。
    sum by (job) (rate(node_cpu_seconds_total{mode="idle"}[1m]))

    job ごとに、CPUのアイドル時間の秒間平均増加率 (≒ CPU使用率の逆数のようなもの) を合計します。

  • topk(k, ...): 値が大きい方からk個の時系列データを返します。
    topk(5, node_memory_Usage_bytes)

    メモリ使用量が上位5つのインスタンスのデータを返します。

📖 学習リソース: PromQLは非常に強力ですが、習得には少し時間がかかるかもしれません。公式ドキュメントの Querying basicsOperators, Functions を参照することをお勧めします。

🚨 アラート設定:Alertmanagerとの連携

監視システムの重要な役割は、問題が発生したときに通知することです。Prometheusでは、PromQL式に基づいてアラートルールを定義し、条件が満たされたときにアラートを生成します。

アラートルールは、Prometheusの設定ファイル (prometheus.yml) の rule_files で指定されたファイルに記述します。

# alert.rules.yml の例
groups:
- name: example
  rules:
  - alert: HighRequestLatency # アラート名
    expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5 # アラートを発火させるPromQL式 (例: 5分間の平均レイテンシが0.5秒を超えたら)
    for: 10m # 条件が10分間継続したらアラート状態 (Pending -> Firing)
    labels: # アラートに追加するラベル
      severity: page
    annotations: # アラートに付加する追加情報 (通知メッセージなどで利用)
      summary: High request latency on {{ $labels.instance }}
      description: "{{ $labels.instance }} has high request latency ({{ $value }}s)"

Prometheus Serverはこのルールを定期的に評価し、expr の条件が満たされるとアラートを “Pending” 状態にします。for で指定された期間、条件が継続すると、アラートは “Firing” 状態になり、設定されたAlertmanagerに送信されます。

Alertmanager は、受け取ったアラートを処理し、設定に基づいて通知を送信します。グルーピング機能により、関連する多くのアラートを1つの通知にまとめたり、抑制機能により、特定のアラートが発生している間は、それに関連する他のアラートを抑制したりすることができます。これにより、アラート疲れを防ぎ、重要な問題に集中できます。😌

📊 可視化:Grafanaとの連携

PrometheusのWeb UIでも基本的なグラフ表示は可能ですが、より高度でインタラクティブなダッシュボードを作成するには、Grafana と連携するのが一般的です。

Grafanaは、Prometheusをデータソースとして簡単に追加でき、PromQLクエリを使って様々な形式のグラフやパネル(表、ゲージ、ヒートマップなど)を作成できます。Grafana Labsやコミュニティによって、一般的なアプリケーションやExporterに対応したダッシュボードのテンプレートも多数公開されており、すぐに活用を始めることができます。📈

Prometheus + Grafana の組み合わせは、クラウドネイティブ環境における監視・可視化の鉄板構成と言えるでしょう。

🌟 Prometheusのメリットとユースケース

Prometheusを採用することには多くのメリットがあります。

多次元データモデル 強力なクエリ言語 (PromQL) Pullモデルによるシンプルさ 容易な運用 サービスディスカバリ 大規模なコミュニティとエコシステム CNCF Graduated Projectとしての信頼性

これらの特徴から、Prometheusは以下のようなユースケースで特に力を発揮します。

  • マイクロサービスアーキテクチャの監視
  • コンテナ環境 (Kubernetes, Docker Swarmなど) の監視
  • 動的なクラウドインフラストラクチャの監視
  • 信頼性工学 (SRE) プラクティスにおけるSLO/SLIの計測とアラート
  • アプリケーションパフォーマンスモニタリング (APM) の基礎データ収集

🏁 まとめ

今回は、クラウドネイティブ時代の監視ツールとして広く使われているPrometheusの基本について解説しました。メトリクスとラベルに基づく強力なデータモデル、Pull型の収集、PromQLによる柔軟なクエリ、Alertmanagerによる高度なアラート、そしてGrafanaとの連携による可視化など、Prometheusがなぜこれほど支持されているのか、その一端を感じていただけたでしょうか。

Prometheusは非常に奥が深く、今回紹介したのはほんの入り口に過ぎません。Exporterの活用、サービスディスカバリの詳細設定、高度なPromQLテクニック、高可用性構成、長期ストレージ連携など、さらに学ぶべきトピックはたくさんあります。

ぜひ、公式ドキュメントなどを参考に、実際にPrometheusを触ってみてください。きっと、あなたのシステムの安定運用に大きく貢献してくれるはずです。🚀

コメント

タイトルとURLをコピーしました