Prometheus(node_exporter)で頑張って色々なパフォーマンスを取得する

# はじめに
弊社（株式会社セレス）ではサーバーのパフォーマンス監視でPrometheusを使用しています。
データ表示はGrafanaを使用していますが、基本node_exporterで頑張って取ります。
2016年頃より使用しており、当時はまだ今よりexporterも基本的な物しかなく、
自分で作れ的な空気もあったので、頑張ってnode_exporterに食わせるシェルが走っています。
prometheusと言いつつワンライナー芸の記事な気がしてきた。

# node_exporterに食わせるには
公式
https://github.com/prometheus/node_exporter


```bash
#起動時に--collector.textfile.directoryオプションを指定する
./node_exporter --collector.textfile.directory=/opt/prometheus/collector
```
これで指定フォルダにある*.promファイルの情報を収集するようになります。

読み込みフォーマットはシンプルに
```bash
#ラベルは任意
メトリクス名 {ラベル1=値,ラベル2=値....} 値
```

以下のような感じだと単純にcpu_tempというメトリクスに60という値で収集します
```
cpu_temp 60
```


# 実際にがんばる

## HDDのSMART情報を読んでたりします。
過去記事より
https://qiita.com/m-kikuchi2/items/2861e33a221235aa687a
smartctlの情報をgrepとsedで頑張って取得しています。
```bash
#/dev/sdaからひろう場合
/usr/sbin/smartctl -a -d megaraid,0 /dev/sda |grep 'Current Drive Temperature'|sed 's/^Current Drive Temperature://g'|sed 's/[ |:|C]//g'|sed 's/^/HDD_Temperature{DiskID="0:1:0",mount="\/dev\/sda"} /g' >/opt/prometheus/collector/hdd_temp.prom
/usr/sbin/smartctl -a -d megaraid,1 /dev/sda |grep 'Current Drive Temperature'|sed 's/^Current Drive Temperature://g'|sed 's/[ |:|C]//g'|sed 's/^/HDD_Temperature{DiskID="0:1:1",mount="\/dev\/sda"} /g' >>/opt/prometheus/collector/hdd_temp.prom

#/dev/sg1からひろう場合
/usr/sbin/smartctl -a /dev/sg1 |grep 'Current Drive Temperature'|sed 's/^Current Drive Temperature://g'|sed 's/[ |:|C]//g'|sed 's/^/HDD_Temperature{DiskID="0:0",mount="\/dev\/sg1"} /g' >/opt/prometheus/collector/hdd_temp.prom
/usr/sbin/smartctl -a /dev/sg2 |grep 'Current Drive Temperature'|sed 's/^Current Drive Temperature://g'|sed 's/[ |:|C]//g'|sed 's/^/HDD_Temperature{DiskID="0:1",mount="\/dev\/sg2"} /g' >>/opt/prometheus/collector/hdd_temp.prom
```
こんなデータが出ます
```bash
[m-kikuchi@web ~]$ cat /opt/prometheus/collector/hdd_temp.prom
HDD_Temperature{DiskID="0:1:0",mount="/dev/sda"} 31
HDD_Temperature{DiskID="0:1:1",mount="/dev/sda"} 29
```
可視化するとこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143026/d97a67e0-9895-8ae0-f278-acd0304a1419.png)
HDDだけではなく、サーバー管理（DELLなのでServerAdministrator)から、システムボードやCPUの温度もとってたりします。
概ね負荷追従で変化します。（それはそう）


## WEBサーバーのアクセスログの容量なんかもとってたりします。
こちらはls,date,awk,sedで頑張る
```bash
ls -l アクセスログのパス.`date +%Y%m%d`-log 2>/dev/null| awk '{print $5}' | sed 's/^/Apache_log_size{logtype="access"} /g' >/opt/prometheus/collector/apache_logsize.prom
```

こんなかんじ
```bash
[m-kikuchi@web ~]$ cat /opt/prometheus/collector/apache_logsize.prom
Apache_log_size{logtype="access"} 311759807
Apache_log_size{logtype="error"} 179848
```

これを食わせて、Grafanaで可視化するとこう（1週間分）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143026/28a89d6e-182f-88cf-9a4c-ca72c52d31a4.png)
0時にローテートされるので0になるのこぎり波みたいな感じになります
通常はWEBアクセスに比例して増えるのですが、突然エラーログが増えたりした時に
アプリケーションチームにリリース内容の確認や調査を依頼したりするのに使用します。

## 直近n分の値とか

phpのエラーログから直近5分以内のFatalを数える
awkの変数に5分前の時刻を入力し、ログの時刻と比較する
```
/usr/bin/awk -v TTIME=`date -d "5 minutes ago" "+%H:%M:%S"` '$2 >= TTIME{print}' php-fpm.errors.log | grep Fatal|wc -l|sed 's/^/PHP_FatalError_count{device="web"} /g'>/opt/prometheus/collector/php_fatal.prom
```
本番環境ではFatalエラーは出てはいけないので
常時監視してキャッチ・開発チームへ連携します。

## CPUクロックを取得する

みづらくなってきた
```bash
turbostat -n1|awk '{print $5}'|sed 1,2d|sed '1 s/^/CPU_Clock{processor="0"} /g'|sed '2 s/^/CPU_Clock{processor="1"} /g'|sed '3 s/^/CPU_Clock{processor="2"} /g'|sed '4 s/^/CPU_Clock{processor="3"} /g'|sed '5 s/^/CPU_Clock{processor="4"} /g'|sed '6 s/^/CPU_Clock{processor="5"} /g'|sed '7 s/^/CPU_Clock{processor="6"} /g'|sed '8 s/^/CPU_Clock{processor="7"} /g'|sed '9 s/^/CPU_Clock{processor="8"} /g'|sed '10 s/^/CPU_Clock{processor="9"} /g'|sed '11 s/^/CPU_Clock{processor="10"} /g'|sed '12 s/^/CPU_Clock{processor="11"} /g'|sed '13 s/^/CPU_Clock{processor="12"} /g'|sed '14 s/^/CPU_Clock{processor="13"} /g'|sed '15 s/^/CPU_Clock{processor="14"} /g'|sed '16 s/^/CPU_Clock{processor="15"} /g' >/opt/prometheus/collector/cpu_clock.prom
```

CPUのスレッドだけ作る
なんかいい方法ないかなって
sedで、上2行削除した後、各行の先頭にラベルを付与する

```bash
turbostat -n1|awk '{print $5}'|\
sed 1,2d|\
sed '1 s/^/CPU_Clock{processor="0"} /g'|\
sed '2 s/^/CPU_Clock{processor="1"} /g'|\
sed '3 s/^/CPU_Clock{processor="2"} /g'|\
sed '4 s/^/CPU_Clock{processor="3"} /g'|\
sed '5 s/^/CPU_Clock{processor="4"} /g'|\
sed '6 s/^/CPU_Clock{processor="5"} /g'|\
sed '7 s/^/CPU_Clock{processor="6"} /g'|\
sed '8 s/^/CPU_Clock{processor="7"} /g'|\
sed '9 s/^/CPU_Clock{processor="8"} /g'|\
sed '10 s/^/CPU_Clock{processor="9"} /g'|\
sed '11 s/^/CPU_Clock{processor="10"} /g'|\
sed '12 s/^/CPU_Clock{processor="11"} /g'|\
sed '13 s/^/CPU_Clock{processor="12"} /g'|\
sed '14 s/^/CPU_Clock{processor="13"} /g'|\
sed '15 s/^/CPU_Clock{processor="14"} /g'|\
sed '16 s/^/CPU_Clock{processor="15"} /g' \
>/opt/prometheus/collector/cpu_clock.prom
```

こんなかんじ
```bash
[m-kikuchi@web ~]$ cat /opt/prometheus/collector/cpu_clock.prom
CPU_Clock{processor="0"} 4665
CPU_Clock{processor="1"} 4618
CPU_Clock{processor="2"} 4664
CPU_Clock{processor="3"} 4562
CPU_Clock{processor="4"} 4560
CPU_Clock{processor="5"} 4608
CPU_Clock{processor="6"} 4649
CPU_Clock{processor="7"} 4534
CPU_Clock{processor="8"} 4499
CPU_Clock{processor="9"} 4546
CPU_Clock{processor="10"} 4567
CPU_Clock{processor="11"} 4704
CPU_Clock{processor="12"} 4738
CPU_Clock{processor="13"} 4772
CPU_Clock{processor="14"} 4655
CPU_Clock{processor="15"} 4658
```


過去に、最新CPUのサーバーを購入した際にKernel側が対応しておらず
ターボブーストが有効にならずパフォーマンスが出ないという事象があり監視対象に。
可視化するとこんなかんじ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143026/442f0307-eae9-f0a3-1ff8-168dc95d8af1.png)
ターボブーストとスピードステップがちゃんと動いているのがみれてちょっと楽しい

ターボブースト
https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AB_%E3%82%BF%E3%83%BC%E3%83%9C%E3%83%BB%E3%83%96%E3%83%BC%E3%82%B9%E3%83%88%E3%83%BB%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC


スピードステップ
https://ja.wikipedia.org/wiki/Intel_SpeedStep_%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8

# おわりに
promファイルを作成するだけで、好きなデータを取り込むことができるので便利。
今はもっと素敵なexporterがあるんじゃないかなと思いつつ
ワンライナーで書きがちなおじさん（42歳）でした
最近はServerAdministrator_exporterなんてのもあるんだなって・・・
もうこれでいいじゃんっておもってみたりみなかったり

でもやっぱ気軽にメトリクス作れちゃうのでついつい書いてしまうんだなあ・・・