Prometheusは、システム監視およびアラートシステムです。2012年にSoundCloudによってオープンソース化され、Kubernetesに続いてCloud Native Computing Foundationに参加し、卒業した2番目のプロジェクトです。Prometheusはすべてのメトリックデータを時系列データとして保存します。つまり、メトリック情報は記録されたタイムスタンプとともに保存され、ラベルと呼ばれるオプションのキーバリューペアもメトリックとともに保存できます。
平易な言葉で言うと、メトリックは測定の標準です。何を測定するかはアプリケーションによって異なります。Webサーバーの場合、リクエスト時間、データベースの場合、CPU使用率やアクティブな接続数などです。
メトリックは、アプリケーションが特定の方法で動作する理由を理解する上で重要な役割を果たします。Webアプリケーションを実行していて、誰かがアプリケーションが遅いと言ってきた場合、アプリケーションで何が起こっているのかを知るための情報が必要です。たとえば、リクエスト数が多いとアプリケーションが遅くなる可能性があります。リクエスト数のメトリックがあれば、その原因を特定し、負荷に対応するためにサーバー数を増やすことができます。アプリケーションのメトリックを定義する際には、探偵の帽子をかぶり、この質問を自問する必要があります。**アプリケーションに問題が発生した場合、デバッグのためにどのような情報が重要になりますか?**
Prometheusの設定の基本コンポーネントは次のとおりです。
(注:これとは別に、Prometheusにはここでは説明しないpush_gatewayがあります)。
Webサーバーをサンプルアプリケーションとして考え、Webサーバーによって処理されたAPI呼び出しの数などの特定のメトリックを抽出するとします。そこで、Prometheusクライアントライブラリを使用して特定の計装コードを追加し、メトリック情報を公開します。Webサーバーがメトリックを公開するようになったら、Prometheusがそれをスクレイピングするように設定できます。これで、Prometheusは、xyz IPアドレスポート7500で、たとえば毎分などの特定の時間間隔で、Webサーバーからメトリックを取得するように設定されます。
11:00:00にサーバーを公開すると、アプリケーションはリクエスト数を計算して公開し、Prometheusは同時にそのカウントメトリックをスクレイピングして値を0として保存します。
11:01:00までに1つのリクエストが処理されます。サーバー内の計装ロジックによってカウントが1にインクリメントされます。Prometheusがメトリックをスクレイピングすると、カウントの値は1になります。
11:02:00までにさらに2つのリクエストが処理され、リクエスト数は1+2 = 3になります。同様に、メトリックがスクレイピングされて保存されます。
ユーザーは、Prometheusがメトリックをスクレイピングする頻度を制御できます。
タイムスタンプ | リクエスト数(メトリック) |
---|---|
11:00:00 | 0 |
11:01:00 | 1 |
11:02:00 | 3 |
(注:この表は理解を深めるための表現です。Prometheusはこの正確な形式で値を保存しません)
Prometheusには、スクレイピングによって保存されたメトリックをクエリできるAPIもあります。このAPIは、メトリックのクエリ、ダッシュボード/チャートの作成などに使用されます。PromQLはこのメトリックをクエリするために使用されます。
リクエスト数メトリックで作成された単純な折れ線グラフは次のようになります。
アプリケーションで何が起こっているのかを理解するために、複数の有用なメトリックをスクレイピングし、それらに基づいて複数のチャートを作成できます。これらのチャートをダッシュボードにまとめ、アプリケーションの概要を把握するために使用します。
実際に手を動かして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メトリックエクスポータをダウンロードします。)
ターミナルで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の実行方法について説明しました。
このドキュメントはオープンソースです。問題を報告したり、プルリクエストを送信したりして、改善にご協力ください。