【prometheus】 の理解を深める
はじめに
以前、Prometheus と Grafana の環境構築を行いました。構築自体はできたものの、仕組みの理解が浅かったため、理解を深める目的で今回アウトプットすることにしました。
1. prometheus とは
prometheus は、システムやアプリケーションから収集した メトリクス(時系列データ) をもとに、監視や可視化を行うオープンソースのソフトウェアです。
少し難しく書くとすれば、エクスポーターなどから HTTP 経由でメトリクスを収集し、内部の時系列データベースに格納、クエリ言語 PromQL により監視や可視化を実現するオープンソースのモニタリングツールです。
・メトリクスとは
一般的には、定量的に測定できる指標や値のことを指します。
prometheus においては、これらのメトリクスを時系列で収集・保存し、各メトリクスは「名前」「ラベル」「値」「タイムスタンプ」を持ちます。これらは PromQL(Prometheus Query Language) によって柔軟に検索・分析することができます。
・時系列データとは
時系列データとは、時間の経過に沿って連続的または定期的に観測されるデータのことです。
コンピューターリソースの使用状況を例に挙げると、「CPU やメモリ、ディスクの使用率」「ネットワークの通信量」「起動中のプロセス数」...... などが、時間ごとに変化するため時系列データに分類されます。
コンピューターに限らず、他にも「天気の変化」や「企業の月ごとの売上」、「国の GDP の推移」なども時系列データに該当します。
※当初は Prometheus をサーバー監視専用のソフトウェアだと考えていましたが、調査を進める中で、サーバー監視に限らず、さまざまな「時系列データ」を柔軟に扱えるツールであることを理解しました。
2. メトリクスの収集方法
prometheus はメトリクスを収集しないことには始まりません。メトリクスの収集方法は主に以下の3つがあります。
-
Pull形式
監視対象に exporter を導入し、prometheus サーバーが定期的に HTTP でメトリクスを取得する方式です。prometheus の標準的かつ一般的な収集方法です。 -
Push形式
監視対象が Prometheus Pushgateway にメトリクスを送信する方式です。主に一時的なジョブやバッチ処理の監視に使われます。Pushgateway は prometheus 本体ではなく別のコンポーネントです。 -
その他
APIやログファイルなどからメトリクスを抽出・収集する仕組みもあるようですね。
3. exporter とは
prometheus が監視対象のメトリクスを取得できるように、監視対象の内部情報を prometheus が理解できる形式(=メトリクス形式)で公開するためのソフトウェアです。つまり、prometheus 用の「データ変換・公開ツール」といえます。
(exporter には公式のものと非公式のものが存在します。また、自作することも可能。)
【代表的な exporter 一覧】
| Exporter 名称 | 監視対象・用途 | 備考 |
|---|---|---|
| Node Exporter | Linux/UNIX サーバーのハードウェア・OS情報 | CPU、メモリ、ディスク、ネットワークなど基本情報を収集 |
| Blackbox Exporter | 外部サービスの可用性チェック(HTTP, TCP, ICMPなど) | 死活監視に便利(pingやポート応答確認など) |
| Cadvisor | コンテナ(Docker)のリソース使用状況 | コンテナ単位のCPU・メモリなどを可視化可能 |
| MySQL Exporter | MySQL / MariaDB の各種統計情報 | クエリ数、接続数、バッファ状況など |
| PostgreSQL Exporter | PostgreSQL の統計情報 | クエリ遅延、接続状況、テーブル情報など |
| NGINX Exporter | NGINX のリクエスト・レスポンス統計情報 | ステータスコード、転送量など |
| Apache Exporter | Apache HTTP Server の統計情報 | NGINXと同様、トラフィックや応答情報 |
| MongoDB Exporter | MongoDB のメトリクス | コレクション統計、接続情報など |
exporter のメトリクス収集タイミング
prometheus の動作を定義するメインの設定ファイルである prometheus.yml の scrape_interval 欄で収集タイミングを指定できます。
global:
scrape_interval: 15s # 15秒ごとに全ターゲットをスクレイプ
scrape_configs:
- job_name: "node_exporter"
static_configs:
- targets: ["localhost:9100"]
収集されたメトリクスについて
収集されたメトリクスは TSDB(時系列)データとして保存されます。どのように保存されているのか気になったので、確認してみます。
(※今回はdockerコンテナで prometheus を起動しているので、コンテナに接続して中身を確認してみます。)
% docker ps | grep prometheus
8cb16b50f2cc prom/prometheus "/bin/prometheus --c…" 2 days ago Up 2 days 0.0.0.0:9090->9090/tcp, [::]:9090->9090/tcp prometheus
% docker exec -it prometheus sh
/prometheus $
# コンテナ内に接続
/prometheus $ pwd
/prometheus
# prometheus の TSDB データは、通常 "/prometheus" 以下に保存されている
/prometheus $ ls -l
total 52
drwxr-xr-x 3 nobody nobody 4096 Jul 26 23:20 01K14GKYBCE48FMG9T77HWT3PR
drwxr-xr-x 3 nobody nobody 4096 Jul 27 19:28 01K16NQMTC66M8KZYPEEZXKEKC
drwxr-xr-x 3 nobody nobody 4096 Jul 28 11:57 01K18EAS6N5FY40PEHMTRESAT5
drwxr-xr-x 3 nobody nobody 4096 Jul 29 03:58 01K1A59F55VN5XYF4XF356WZY1
drwxr-xr-x 3 nobody nobody 4096 Jul 29 05:47 01K1ABGSC3NF422GPBHP3GX8XT
drwxr-xr-x 3 nobody nobody 4096 Jul 29 05:47 01K1ABGSF1DBYD2FCCP0MP24JQ
drwxr-xr-x 2 nobody nobody 4096 Jul 29 05:48 chunks_head
-rw-r--r-- 1 nobody nobody 0 Jul 26 07:50 lock
-rw-r--r-- 1 nobody nobody 20001 Jul 29 04:54 queries.active
drwxr-xr-x 3 nobody nobody 4096 Jul 29 05:47 wal
# 「01K14GKYBCE48FMG9T77HWT3PR」 などが TSDB の「ブロック」という単位で保存されている
/prometheus $ ls 01K14GKYBCE48FMG9T77HWT3PR
chunks index meta.json tombstones
# chunks : 実際の時系列データが圧縮された形で保存されているファイル群(データ本体)
# index : メトリクスのラベルや時系列データの検索を効率化するためのインデックス情報
# meta.json : このブロックの開始時刻や終了時刻、バージョン情報などのメタデータ(設定情報)
# tombstones : 削除された時系列データ(メトリクス)に関する情報(論理削除の記録)
Prometheus は収集したメトリクスを上記の様に内部のTSDB(時系列データベース)にファイル形式で保存しています。このファイル群(例:01K14GKYBCE48FMG9T77HWT3PR)がそのデータの塊です。
後述する PromQL を使ってクエリを投げると、そのクエリに該当する時系列データをこのTSDBファイル群から効率的に読み出し、計算や集計を行っているようです。
※これらのデータは一定のルールに基づいて自動的に管理されており、古くて不要になったファイルはPrometheusが自動で消去してくれるとのこと。
4. PromQL とは
PromQL(Prometheus Query Language) は、prometheus に蓄積された 時系列データ(メトリクス)を検索・抽出・集約・演算するための専用クエリ言語です。ざっくり言えば、「CPU使用率が高いサーバーは?」「メモリ使用量の平均は?」といった問いに答えるための文法です。
prometheus でメトリクスを可視化したり、アラート条件を定義したりする際に中心となる仕組みです。
【基本構文と概念】
インスタントクエリ
単一時点のデータを取得します。
node_cpu_seconds_total
レンジクエリ
一定期間のデータを取得します。[時間] をつけると範囲指定になります。
node_cpu_seconds_total[5m]
ラベルセレクタ
データをフィルタできます。
node_cpu_seconds_total{mode="idle", instance="192.168.1.1:9100"}
関数(例:rate)
メトリクスを集計・加工できます。
rate(node_cpu_seconds_total{mode="idle"}[1m])
【理解したこと】
サンプルであげた 「node_cpu_seconds_total」 は node_exporter が提供しているメトリクス名です。まとめると以下の通りです。
- prometheus 本体は、データ収集(scrape)と保存、クエリ言語(PromQL)を提供するだけ。
- 実際の「データの中身(=メトリクス名と値)」は exporter が作成している
つまり、監視対象に設定した exporter によって Prometheus が取得・表示できるメトリクス名は変わるという事です。
したがって、PromQL を使う上では 使用する exporter が提供するメトリクスの仕様を理解することが重要です。prometheus環境構築の前にここを先に理解すべきでした。
5. prometheus の活用例
その他、prometheus で実現できる事例をまとめました。もう少し理解が進んだら何かしらトライしてみようと思います。
1. IoTデバイスのモニタリング
温度センサー、湿度センサー、照度など、時間と共に変化する値を収集。
2. ビジネス指標のトラッキング
ECサイトの注文数、在庫推移、キャンペーンの反応数など、ビジネス上のKPIを時系列管理。
3. アプリケーションパフォーマンスの可視化
レスポンスタイム、リクエスト数、エラー率などを時系列で収集。特定の時間帯のパフォーマンス劣化を分析可能。
4. ネットワークトラフィック分析
帯域使用量、パケット数、エラーパケットの推移などをモニタリング。異常検知にも活用できる。
さいごに
以上で今回の記事については一旦終了となります。今後は grafana を用いて自分用のテンプレートを作成したり、閾値を設定しアラートを送信するなど、実践的な内容にも取り組んでいこうと思います。
Discussion