Prometheus入門

Prometheusとは?

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

メトリックとは何か、なぜそれが重要なのか?

平たく言えば、メトリックは測定の基準です。何を測定したいかはアプリケーションによって異なります。Webサーバーであればリクエスト時間、データベースであればCPU使用率やアクティブな接続数などです。

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

Prometheusの基本アーキテクチャ

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

  • Prometheusサーバー(メトリックデータをスクレイピングして保存するサーバー)。
  • スクレイピングされるターゲット。例えば、メトリックを公開する計装済みアプリケーションや、別のアプリケーションのメトリックを公開するエクスポーターなど。
  • 事前設定されたルールに基づいてアラートを発行するAlertmanager。

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

Architecture

Webサーバーをアプリケーションの例として考え、Webサーバーによって処理されたAPIコールの数のような特定のメトリックを抽出したいとします。そこで、Prometheusクライアントライブラリを使用して特定の計装コードを追加し、メトリック情報を公開します。これで、Webサーバーがメトリックを公開したので、Prometheusがそれをスクレイピングするように設定できます。これでPrometheusは、xyz IPアドレスのポート7500でリッスンしているWebサーバーから、特定の時間間隔、たとえば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 metrics exporterをダウンロードします。

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

./node_exporter

Node exporter

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

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の実行方法について説明しました。

このページの内容