はじめに
Prometheus が Node Exporter からメトリクスを収集できるようになったので、データに対して質問できるようになりました。
Prometheus には、PromQL(Prometheus Query Language)という独自のクエリ言語があります。
生のメトリクスは、そこから必要なデータを絞り込み、組み合わせ、意味のある答えを計算できて初めて役立ちます。そのため、PromQL は重要です。
ここから、モニタリングは単なる収集ではなく、分析になります。Prometheus の価値は、数値を保存することだけではありません。PromQL を使えば、その数値を質問と答えに変換できます。
この実験では、次の 3 種類の質問をします。
- 単純な事実:「空きメモリはどのくらいあるか」
- レート:「CPU はどのくらいの速度で動作しているか」
- 計算:「メモリの何パーセントが使用中か」
Prometheus Web Interface(Web Service)に質問を入力し、答えを確認します。
空きメモリをクエリする
このステップでは、空きメモリのバイト数をクエリし、応答を保存します。
まずは、単純な事実を確認します。空きメモリ(RAM)がどのくらいあるかを調べます。
Prometheus のインターフェースを開きます。
LabEx インターフェースの左上にあるメニューで Prometheus タブをクリックし、ダッシュボードを開きます。
インターフェースが表示されたら、目立つ位置にある検索バーを探します。ここに Librarian への質問を入力します。
検索バーに次のクエリを入力します。
node_memory_MemFree_bytes
この文字列は、「空きメモリ」を表すデータポイントの名前です。入力したら、Execute ボタンをクリックします。

結果を確認します。
「Value」列に数値が表示されます。たとえば、5204746240 のように非常に大きな数値になる場合があります。これは正常です。コンピューターは、非常に小さな単位である Bytes でメモリを数えるためです。
注記:Labby のチャットウィンドウによって、「Value」列の数値が隠れることがあります。値が見えない場合は、一時的に Labby ダイアログを閉じて数値を確認し、確認が終わったら再び開いてください。
正しく取得できたことを確認するため、ターミナルで次のコマンドを実行して、答えをファイルに保存します。
curl "http://localhost:9090/api/v1/query?query=node_memory_MemFree_bytes" > ~/project/free_memory.json
cat ~/project/free_memory.json
{"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"node_memory_MemFree_bytes","instance":"localhost:9100","job":"node_exporter"},"value":[1768698428.127,"4001128448"]}]}}
CPU レートをクエリする
このステップでは、rate() を使って CPU カウンターが増加する速さをクエリします。
次は、もう少し難しい質問です。
車の速度計は「走行した総距離」を表示せず、「時速」(速度)を表示します。
CPU 使用量も同じように考えられます。Prometheus は、「CPU の電源を入れてから CPU が動作した合計秒数」を記録します。この数値は時間とともに増え続けます。
このようなメトリクスはカウンターと呼ばれます。時間の経過とともに値が蓄積されるためです。現在の状態を理解するには、累積値の増加を単位時間あたりの値に変換する rate() のような関数が必要になることがあります。
「現在、CPU はどのくらい動作しているか」を確認するには、レート(速度)を計算する必要があります。
質問:
rate(node_cpu_seconds_total[1m])
内訳:
node_cpu_seconds_total:元のデータ(合計秒数)。[1m]:「直近 1 分間のデータを見る」。rate(...):「その 1 分間に、この数値がどのくらいの速さで増加したかを計算する」。
Web UI で試します。
クエリ rate(node_cpu_seconds_total[1m]) を検索バーに貼り付け、Execute をクリックします。コンピューターには複数の CPU コアがあるため、多数の数値の行が表示される可能性があります。
答えを保存します(確認用)。
curl -g "http://localhost:9090/api/v1/query?query=rate(node_cpu_seconds_total[1m])" > ~/project/cpu_rate.json
-g(--globoff)オプションは curl の URL グロビングを無効にします。これにより、curl は [1m] 内の角括弧を URL の範囲指定として解釈せず、そのまま送信します。シェルの引用符は、クエリ URL 全体を一つにまとめるためのものです。
割合を計算する
このステップでは、メモリのメトリクスを組み合わせて割合を計算します。
「空きメモリが 5 億バイトある」と言われても、理解しにくいかもしれません。「50% 空いている」と言われれば、簡単に理解できます。
Prometheus は計算を実行できます。
この計算機能が、PromQL を運用に役立つ強力な言語にしています。複数の低レベルなメトリクスを組み合わせて、人間が解釈しやすい高レベルの健全性指標を作成できます。
ここでは、メモリの何パーセントが使用中かを調べます。
計算式は次のとおりです。
$$ \text{Percent Used} = \frac{\text{Total Memory} - \text{Free Memory}}{\text{Total Memory}} \times 100 $$
PromQL の質問:
(node_memory_MemTotal_bytes - node_memory_MemFree_bytes) / node_memory_MemTotal_bytes * 100
Web UI で試します。
この長い計算式を検索バーに貼り付け、Execute をクリックします。1 つの数値(たとえば 45.2)が表示されます。これは、メモリの 45.2% が使用中であることを意味します。
答えを保存します。
curl "http://localhost:9090/api/v1/query?query=(node_memory_MemTotal_bytes-node_memory_MemFree_bytes)/node_memory_MemTotal_bytes*100" > ~/project/memory_usage.json
データを可視化する
このステップでは、メモリのクエリをグラフにし、その軸が表す内容を読み取ります。
最後に、数値よりもグラフのほうが状況を把握しやすい場合があります。
計算式のクエリを検索バーに入力したまま、結果エリアの上にあるタブを探します。単純なテキスト結果に使う Table タブの隣などに、通常は Graph タブがあります。
Graph タブをクリックします。時間の経過に伴うメモリ使用率が、折れ線グラフで表示されます。
- X 軸:時間
- Y 軸:使用率
直線が表示された場合、メモリ使用量が安定していることを意味します。負荷の高いプログラムを実行すると、急な山が表示されます。
最後の確認:
グラフを見ているだけなので、サーバーがバックグラウンドで動作し続けていることを確認します。
ps aux | grep prometheus
まとめ
この実験では、PromQL を使って Librarian に質問する方法を学びました。
次の内容を学習しました。
- 単純な事実:
node_memory_MemFree_bytes - レート(速度):
rate(... [1m]) - 計算:
(Total - Free) / Total * 100 - グラフ化:Graph タブの使用方法
データを確認できるようになったので、次は問題が発生したときに Prometheus が通知するようにします。これを Alerting と呼びます。



