基本的な PromQL クエリ

LinuxBeginner
オンラインで実践に進む

はじめに

Prometheus が Node Exporter からメトリクスを収集できるようになったので、データに対して質問できるようになりました。

Prometheus には、PromQL(Prometheus Query Language)という独自のクエリ言語があります。

生のメトリクスは、そこから必要なデータを絞り込み、組み合わせ、意味のある答えを計算できて初めて役立ちます。そのため、PromQL は重要です。

ここから、モニタリングは単なる収集ではなく、分析になります。Prometheus の価値は、数値を保存することだけではありません。PromQL を使えば、その数値を質問と答えに変換できます。

この実験では、次の 3 種類の質問をします。

  1. 単純な事実:「空きメモリはどのくらいあるか」
  2. レート:「CPU はどのくらいの速度で動作しているか」
  3. 計算:「メモリの何パーセントが使用中か」

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 に質問する方法を学びました。

次の内容を学習しました。

  1. 単純な事実:node_memory_MemFree_bytes
  2. レート(速度):rate(... [1m])
  3. 計算:(Total - Free) / Total * 100
  4. グラフ化:Graph タブの使用方法

データを確認できるようになったので、次は問題が発生したときに Prometheus が通知するようにします。これを Alerting と呼びます。