Prometheus: CPU、メモリ、ディスクの使用率の算出方法+Grafanaでの算出方法


###### 実施環境：

```Linux:Linux
[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 の使用秒数の累計値が格納されています。

![WS000804.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/84d2eae7-f284-ddc1-3637-60afcd13b615.jpeg "node_cpu_seconds_total")

このパラメータで重要な構成要素は以下の通りです。

|項目名|概要|
|:-|:-|
| cpu | CPU のコア番号。|
| instance |インスタンス名。複数サーバを監視している場合などは気を付ける必要がある。|
| mode | CPU の状態。特に idle の場合が重要(後述)。|

###### 1.2. CPU 使用率( Prometheus )

 CPU 使用率の算出方法はいくつかありますが、そのうちの1つが以下の式です。

```Prometheus:Prometheus
avg(rate(node_cpu_seconds_total{mode="idle"}[1m])) * -100 + 100
```

![WS000805.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/ea51f1f7-4a3d-fbd0-f34b-7c8565542a32.jpeg "cpu_prometheus")

式について、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 が使用「されていない」時間の割合が算出できます。

![WS000840.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/1250a34d-1890-d1bf-6354-245d22d4ab0f.jpeg "rate")

さて、これで 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 」を選択してください。

![WS000814.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/31bac655-70df-eeb4-3b3b-5a4115a6735b.jpeg "menu")

使用するデータソースは「 Prometheus 」を選択してください。

![WS000836.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b0c18300-12b7-99bd-2d23-195777820b41.jpeg "explore_01")

まずは、 GUI を駆使して算出してみましょう。

Metric に「 node_cpu_seconds_total 」を指定します。

![WS000815.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e058de6a-3904-87ab-96bf-2187d5422c14.jpeg "explore_02")

![WS000817.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/a6a2403b-9755-c028-6a18-c7ffdd0824c2.jpeg "explore_03")

次に、 Label filters に「 mode = idle 」を指定します。

![WS000817.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/815c8fce-e595-e4d5-a7a3-5395ecfcf05e.jpeg "explore_04")

![WS000818.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/c46b2b36-7192-0227-4797-f5a18ea82e0e.jpeg "explore_05")

ここから、検索されたデータを加工していきます。
「 Operations 」を押してください。

![WS000818.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/328db8c2-e6e3-c93e-9cee-f649d420e1fb.jpeg "explore_06")

データの加工方法のリストが出てきますので、「 Range functions 」⇒「 Rate 」を選択します。

![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/19cbc43a-4036-51f0-8287-cf83eadf7e6f.png "explore_07")

「 Range 」に「 1m 」を指定します。

![WS000820.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/96c38c61-f109-4f9d-e4df-f36c3ac33f86.jpeg "explore_08")

![WS000821.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/00db4ca3-f194-cc10-0185-2cf38403a2ab.jpeg "explore_09")

再度、「 Operations 」を押してください。

![WS000821.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/62580b70-c624-cb59-f787-76584a951e45.jpeg "explore_10")

今度は「 Aggregations 」⇒「 Avg 」を選択します。

![112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/0b308e6a-2f4d-9af6-ca9b-69a18da4f2dd.png "explore_11")

![WS000822.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8389c478-fad7-c632-ea02-fcaf93fcc77d.jpeg "explore_12")

再び、「 Operations 」を押します。

![WS000822.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/92ce3a8b-b888-cf9e-f5b9-f344bf3a8e78.jpeg "explore_13")

次は、「 Binary operations 」⇒「 Multiply by scalar 」を選びます。

![113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/d4c63be9-8709-1793-1dd9-65d56b9c32c0.png "explore_14")

 Value には「 -100 」を入力します。

![WS000823.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/ca6e5f60-cb9c-e1b1-fb9a-5d1763cb9468.jpeg "explore_15")

![WS000824.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/fb8020ca-0734-4096-6292-d36357e028f9.jpeg "explore_16")

最後にもう1度、「 Operations 」を押します。

![WS000824.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7367b06a-4d65-5007-8b1d-32205e335768.jpeg "explore_17")

「 Binary operations 」⇒「 Add scalar 」を選びます。

![114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8401e26f-3984-cae6-1a28-35b816f33e79.png "explore_18")

 Value には「 100 」を入力します。

![WS000825.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/a24d0a5f-1178-d666-b4fd-b699c4c4a238.jpeg "explore_19")

![WS000826.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e288f538-78d4-2299-718d-b0772cb378c0.jpeg "explore_20")

これでクエリが作れましたので、あとは検索範囲を指定して「 Run query 」を押せば、 CPU 使用率が表示できます。

![WS000828.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/6573e929-a1ef-5533-c354-d5452c93f356.jpeg "run")

![WS000829.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b3ae5346-a0a3-5422-c52a-a67121ba1fa3.jpeg "cpu_grafana")

と、ここまで GUI で地道にクエリを作ってみましたが、実は「 Code 」を押せば式を直接入力できるので、式がわかっているならこちらの方が早いです。

![WS000830.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/383692bc-43a5-7b03-31eb-d5cca77c4551.jpeg "code")

![WS000831.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/9f9717a0-85b3-1274-56e3-3c8f32d4aa55.jpeg "cpu_code")

### 2. メモリ

###### 2.1. 使用するパラメータ

メモリの使用率を算出するのに使用するパラメータは、「 node_memory_MemTotal_bytes 」と「 node_memory_MemAvailable_bytes 」の2つです。
「 node_memory_MemTotal_bytes 」はメモリの総容量バイト数を、「 node_memory_MemAvailable_bytes 」はメモリの空き容量バイト数を表しています。

![WS000807.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8ef7f8fe-caaf-eeef-ec61-10b3b44e6bd8.jpeg "node_memory_MemTotal_bytes")

![WS000808.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/c5e66019-6e2b-a4ac-e9ff-ad194f06ffbf.jpeg "node_memory_MemAvailable_bytes")

これらのパラメータで重要な構成要素は以下の通りです。

|項目名|概要|
|:-|:-|
| instance |インスタンス名。複数サーバを監視している場合などは気を付ける必要がある。|

###### 2.2. メモリ使用率( Prometheus )

メモリ使用率の算出方法はいくつかありますが、そのうちの1つが以下の式です。

```Prometheus:Prometheus
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * -100 + 100
```

![WS000809.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/5c11ff51-4252-24de-0fc8-33da135cf7ed.jpeg "mem_prometheus")

こちらはあまり複雑ではありません。
 `node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes` で空き容量 ÷ 総容量 = 空き容量の割合を計算し、 `* -100 + 100` で 100% - 空き容量の割合 = 使用率を算出しています。

###### 2.3. メモリ使用率( Grafana )

上記の式は2つのパラメータから値を計算していますが、このようなクエリを Grafana の GUI で作ろうとすると非常に面倒なので、 Code で素直に上の式を直接入力してしまった方がよいです。

![WS000832.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/505edfbc-ea09-6735-65c5-feb67b690d96.jpeg "mem_code")

![WS000833.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/9b198b51-7843-7b58-59ee-1bf5b5eb9497.jpeg "mem_grafana")

### 3. ディスク

###### 3.1. 使用するパラメータ

ディスクの使用率を算出するのに使用するパラメータは、「 node_filesystem_size_bytes 」と「 node_filesystem_avail_bytes 」の2つです。
「 node_filesystem_size_bytes 」はディスクの総容量バイト数を、「 node_filesystem_avail_bytes 」はディスクの空き容量バイト数を表しています。

![WS000810.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/1911a8a6-f09e-5ee5-2772-408b60787463.jpeg "node_filesystem_size_bytes")

![WS000811.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/d474cb19-6169-2c6a-edef-a3c3aa5aaeae.jpeg "node_filesystem_avail_bytes")

これらのパラメータで重要な構成要素は以下の通りです。

|項目名|概要|
|:-|:-|
| instance |インスタンス名。複数サーバを監視している場合などは気を付ける必要がある。|
| device |デバイス名。|
| mountpoint |デバイスが紐づけられているディレクトリ名。|

###### 3.2. ディスク使用率( Prometheus )

ディスク使用率の算出方法はいくつかありますが、そのうちの1つが以下の式です。

```Prometheus:Prometheus
node_filesystem_avail_bytes / node_filesystem_size_bytes * -100 + 100
```

![WS000812.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/547aecdb-9773-533d-ab2e-6b7a64b3caaa.jpeg "disk_prometheus")

こちらもあまり複雑ではありません。
 `node_filesystem_avail_bytes / node_filesystem_size_bytes` で空き容量 ÷ 総容量 = 空き容量の割合を計算し、 `* -100 + 100` で 100% - 空き容量の割合 = 使用率を算出しています。

###### 3.3. ディスク使用率( Grafana )

こちらの式も2つのパラメータから計算しており Grafana の GUI で作ろうとすると非常に面倒なので、 Code で式を直接入力してしまった方がよいです。

![WS000834.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8d7cd5ce-c3f6-1f86-8dcb-5dfb22be9438.jpeg "disk_code")

![WS000835.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e27009b5-a0f3-567b-6aa1-2f70ae9b24e6.jpeg "disk_grafana")