実施環境:
[root@testhost ~]# uname -a
Linux testhost 4.18.0-448.el8.x86_64 #1 SMP Wed Jan 18 15:02:46 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
[root@testhost ~]# cat /etc/redhat-release
CentOS Stream release 8
[root@testhost ~]# yum list installed | grep grafana
grafana-enterprise.x86_64 10.0.3-1
prometheus:2.46.0.linux-amd64
node_exporter:1.6.1.linux-amd64
0. 概要
サーバのリソースの使用状況を確認しようと思ったとき、どのようなパラメータを使用するでしょうか。
環境や用途によっても異なりますが、特に頻繁に使用するのは「 CPU 使用率」「メモリ使用率」「ディスク使用率」の3つではないでしょうか。
Prometheus でも、当然これらは確認できます。
ですが実は Prometheus はこれらそのもののパラメータは取得しておらず、他のパラメータから少々加工する必要があります。
今回はその算出方法を、 Prometheus の画面と Prometheus のデータを連携した Grafana の画面の2つの画面について確認していきます。
なお、今回使用するパラメータは、いずれも node_exporter で取得できるパラメータです。
また、値は百分率(%値)で算出します。
1. CPU
1.1. 使用するパラメータ
CPU の使用率を算出するのに使用するパラメータは、「 node_cpu_seconds_total 」です。
このパラメータには、 Prometheus の起動時から現在までのモードごとの CPU の使用秒数の累計値が格納されています。
このパラメータで重要な構成要素は以下の通りです。
項目名 | 概要 |
---|---|
cpu | CPU のコア番号。 |
instance | インスタンス名。複数サーバを監視している場合などは気を付ける必要がある。 |
mode | CPU の状態。特に idle の場合が重要(後述)。 |
1.2. CPU 使用率( Prometheus )
CPU 使用率の算出方法はいくつかありますが、そのうちの1つが以下の式です。
avg(rate(node_cpu_seconds_total{mode="idle"}[1m])) * -100 + 100
式について、1つずつ説明していきます。
node_cpu_seconds_total
については、先ほど見た通りです。
{mode="idle"}
で、モードが idle (実行する処理がなく、 CPU が待機状態になっている時間)のデータのみを抽出します。
ここから、 CPU が使用「されていない」率をまず算出し、そこから CPU 使用率を求めていくことになります。
rate(...[1m])
は Prometheus の関数で、[]
に指定した期間(ここでは1m=1分)で値が1秒あたりどれだけ増加したかを計算します。
node_cpu_seconds_total は先ほど見た通り CPU の使用秒数の「累計値」なので、この rate 関数を node_cpu_seconds_total に用いれば CPU が使用「されていない」時間の割合が算出できます。
さて、これで CPU が使用「されていない」率が算出されたわけですが、上で見た通り node_cpu_seconds_total は CPU のコアごとに値が格納されています。
今回は全体の CPU 使用率がほしいので、 avg(...)
で全コアの平均値を出します。
最後に、 * -100 + 100
を付与して、 100% - CPU が使用「されていない」率 = CPU 使用率を算出します。
1.3. CPU 使用率( Grafana )
さて、ここまで Prometheus の画面で見てきたわけですが、 Prometheus と Grafana を連携していれば、同じものが Grafana からも確認できます。
今回 Grafana で値を確認するには Explore 画面を使用します。
Explore 画面はダッシュボードなどを作らずともその場でデータを検索できる画面です。
メニューから「 Explore 」を選択してください。
使用するデータソースは「 Prometheus 」を選択してください。
まずは、 GUI を駆使して算出してみましょう。
Metric に「 node_cpu_seconds_total 」を指定します。
次に、 Label filters に「 mode = idle 」を指定します。
ここから、検索されたデータを加工していきます。
「 Operations 」を押してください。
データの加工方法のリストが出てきますので、「 Range functions 」⇒「 Rate 」を選択します。
「 Range 」に「 1m 」を指定します。
再度、「 Operations 」を押してください。
今度は「 Aggregations 」⇒「 Avg 」を選択します。
再び、「 Operations 」を押します。
次は、「 Binary operations 」⇒「 Multiply by scalar 」を選びます。
Value には「 -100 」を入力します。
最後にもう1度、「 Operations 」を押します。
「 Binary operations 」⇒「 Add scalar 」を選びます。
Value には「 100 」を入力します。
これでクエリが作れましたので、あとは検索範囲を指定して「 Run query 」を押せば、 CPU 使用率が表示できます。
と、ここまで GUI で地道にクエリを作ってみましたが、実は「 Code 」を押せば式を直接入力できるので、式がわかっているならこちらの方が早いです。
2. メモリ
2.1. 使用するパラメータ
メモリの使用率を算出するのに使用するパラメータは、「 node_memory_MemTotal_bytes 」と「 node_memory_MemAvailable_bytes 」の2つです。
「 node_memory_MemTotal_bytes 」はメモリの総容量バイト数を、「 node_memory_MemAvailable_bytes 」はメモリの空き容量バイト数を表しています。
これらのパラメータで重要な構成要素は以下の通りです。
項目名 | 概要 |
---|---|
instance | インスタンス名。複数サーバを監視している場合などは気を付ける必要がある。 |
2.2. メモリ使用率( Prometheus )
メモリ使用率の算出方法はいくつかありますが、そのうちの1つが以下の式です。
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * -100 + 100
こちらはあまり複雑ではありません。
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes
で空き容量 ÷ 総容量 = 空き容量の割合を計算し、 * -100 + 100
で 100% - 空き容量の割合 = 使用率を算出しています。
2.3. メモリ使用率( Grafana )
上記の式は2つのパラメータから値を計算していますが、このようなクエリを Grafana の GUI で作ろうとすると非常に面倒なので、 Code で素直に上の式を直接入力してしまった方がよいです。
3. ディスク
3.1. 使用するパラメータ
ディスクの使用率を算出するのに使用するパラメータは、「 node_filesystem_size_bytes 」と「 node_filesystem_avail_bytes 」の2つです。
「 node_filesystem_size_bytes 」はディスクの総容量バイト数を、「 node_filesystem_avail_bytes 」はディスクの空き容量バイト数を表しています。
これらのパラメータで重要な構成要素は以下の通りです。
項目名 | 概要 |
---|---|
instance | インスタンス名。複数サーバを監視している場合などは気を付ける必要がある。 |
device | デバイス名。 |
mountpoint | デバイスが紐づけられているディレクトリ名。 |
3.2. ディスク使用率( Prometheus )
ディスク使用率の算出方法はいくつかありますが、そのうちの1つが以下の式です。
node_filesystem_avail_bytes / node_filesystem_size_bytes * -100 + 100
こちらもあまり複雑ではありません。
node_filesystem_avail_bytes / node_filesystem_size_bytes
で空き容量 ÷ 総容量 = 空き容量の割合を計算し、 * -100 + 100
で 100% - 空き容量の割合 = 使用率を算出しています。
3.3. ディスク使用率( Grafana )
こちらの式も2つのパラメータから計算しており Grafana の GUI で作ろうとすると非常に面倒なので、 Code で式を直接入力してしまった方がよいです。