Prometheus の入門

Prometheus とは?

Prometheus はシステム監視およびアラートシステムです。2012 年に SoundCloud によってオープンソース化され、Kubernetes に次いで Cloud Native Computing Foundation に参加し、卒業した 2 番目のプロジェクトです。Prometheus はすべてのメトリックデータを時系列データとして保存します。つまり、メトリック情報は、記録されたタイムスタンプとともに、オプションでラベルと呼ばれるキーと値のペアもメトリックとともに保存できます。

メトリックとは何で、なぜ重要なのでしょうか?

素人向けの言葉で言えば、メトリックとは測定の標準です。何を測定したいかは、アプリケーションによって異なります。Web サーバーの場合はリクエスト時間、データベースの場合は CPU 使用率やアクティブな接続数などが考えられます。

メトリックは、アプリケーションが特定の動作をする理由を理解する上で重要な役割を果たします。Web アプリケーションを実行していて、誰かが「アプリケーションが遅い」と言ってきた場合、アプリケーションで何が起こっているのかを把握するために情報が必要になります。たとえば、リクエスト数が多いときにアプリケーションが遅くなることがあります。リクエスト数メトリックがあれば、その原因を特定し、負荷に対応するためにサーバーを増やすことができます。アプリケーションのメトリックを定義するときは、探偵の帽子をかぶって、アプリケーションで問題が発生した場合にデバッグするために、どのような情報が重要になるだろうか?という質問を自問自答する必要があります。

Prometheus の基本アーキテクチャ

Prometheus セットアップの基本コンポーネントは以下のとおりです。

  • Prometheus Server(メトリックデータをスクレイプして保存するサーバー)。
  • スクレイプ対象のターゲット。たとえば、メトリックを公開するインストルメント化されたアプリケーションや、他のアプリケーションのメトリックを公開するエクスポーターなど。
  • 設定されたルールに基づいてアラートを発生させる Alertmanager。

(注: これ以外に Prometheus には push_gateway がありますが、ここでは取り上げません)。

Architecture

Web サーバーを例として、Web サーバーによって処理された API コール数などの特定のメトリックを抽出したいとします。そこで、Prometheus クライアントライブラリを使用してインストルメンテーションコードを追加し、メトリック情報を公開します。Web サーバーがメトリックを公開しているので、Prometheus がそれをスクレイプするように設定できます。Prometheus は、xyz IP アドレスのポート 7500 から、たとえば 1 分ごとといった特定の時間間隔でメトリックを取得するように設定されます。

11:00:00 にサーバーを一般公開すると、アプリケーションはリクエスト数を計算して公開します。Prometheus は同時にカウントメトリックをスクレイプし、値を 0 として保存します。

11:01:00 までに 1 件のリクエストが処理されます。サーバー内のインストルメンテーションロジックはカウントを 1 にインクリメントします。Prometheus がメトリックをスクレイプすると、カウントの値は 1 になります。

11:02:00 までにさらに 2 件のリクエストが処理され、リクエスト数は 1 + 2 = 3 になります。同様にメトリックがスクレイプされ、保存されます。

ユーザーは、Prometheus がメトリックをスクレイプする頻度を制御できます。

タイムスタンプリクエスト数 (メトリック)
11:00:000
11:01:001
11:02:003

(注: この表は理解を助けるための表現です。Prometheus は正確にはこの形式で値を保存しません)

Prometheus には、スクレイプによって保存されたメトリックをクエリできる API もあります。この API は、メトリックのクエリ、ダッシュボード/チャートの作成などに使用されます。これらのメトリックをクエリするには PromQL が使用されます。

リクエスト数メトリックで作成されたシンプルな折れ線グラフは次のようになります。

Graph

アプリケーションで何が起こっているかを理解するために複数の有用なメトリックをスクレイプし、それらに対して複数のチャートを作成できます。チャートをダッシュボードにグループ化し、アプリケーションの概要を把握するために使用します。

やり方を見せてください

実際に Prometheus をセットアップしてみましょう。Prometheus は Go で書かれているため、必要なのはお使いのオペレーティングシステム用にコンパイルされたバイナリだけです。お使いのオペレーティングシステムに対応するバイナリを こちら からダウンロードし、バイナリをパスに追加してください。

Prometheus は、それ自身または別の Prometheus サーバーが消費できる独自のメトリックを公開します。

Prometheus がインストールされたので、次のステップは実行です。必要なのはバイナリと設定ファイルだけです。Prometheus は設定に yaml ファイルを使用します。

global:
  scrape_interval: 15s

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

上記の構成ファイルでは、`scrape_interval`、つまり Prometheus がメトリックをスクレイプする頻度を指定しています。`scrape_configs` を追加しましたが、これは名前と、メトリックをスクレイプするターゲットを含みます。Prometheus はデフォルトでポート 9090 でリッスンします。したがって、それをターゲットに追加します。

prometheus --config.file=prometheus.yml

これで、Prometheus が起動し、15 秒ごとに自身のメトリックをスクレイプできるようになりました。Prometheus には、メトリックをエクスポートするための標準エクスポーターが用意されています。次に、マシンメトリックのエクスポーターである node exporter を実行し、Prometheus を使用してそれをスクレイプします。( ノードメトリックエクスポーターをダウンロードする。)

ターミナルで node exporter を実行します。

./node_exporter

Node exporter

次に、scrape_configs のリストに node exporter を追加します。

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ["localhost:9090"]
  - job_name: node_exporter
    static_configs:
      - targets: ["localhost:9100"]

このチュートリアルでは、メトリックとは何か、そしてなぜ重要なのか、Prometheus の基本アーキテクチャ、そして Prometheus の実行方法について説明しました。

このページの内容