使用 Prometheus(node_exporter)努力获取各种性能数据
首先
我们公司(Celestia有限公司)在服务器性能监控方面使用Prometheus。
数据展示方面使用Grafana,但基本上会努力使用node_exporter提取数据。
从2016年左右开始使用,当时exporter的种类还很有限,只有一些基本的存在。
当时也有一种自己动手创建的氛围,所以我们努力让node_exporter能运行起来。
有时候觉得很像一篇讲述一行命令的技巧的文章。
要将其提供给node_exporter。
公式
https://github.com/prometheus/node_exporter
#起動時に--collector.textfile.directoryオプションを指定する
./node_exporter --collector.textfile.directory=/opt/prometheus/collector
现在将收集指定文件夹中的*.prom文件的信息。
读取格式简洁
#ラベルは任意
メトリクス名 {ラベル1=値,ラベル2=値....} 値
我会用CPU温度这个指标以60的值进行收集。
cpu_temp 60
真的努力
我会读取HDD的SMART信息。
从过去的文章中
https://qiita.com/m-kikuchi2/items/2861e33a221235aa687a
我努力使用grep和sed获取smartctl的信息。
#/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
这种数据会显示出来
[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

有时候也会记录WEB服务器的访问日志容量。
我会尽力在ls,date,awk和sed上努力。
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
这个样子
[m-kikuchi@web ~]$ cat /opt/prometheus/collector/apache_logsize.prom
Apache_log_size{logtype="access"} 311759807
Apache_log_size{logtype="error"} 179848

最近n个值或者最近n个数值
从PHP错误日志中计算最近5分钟内的Fatal错误。
将5分钟前的时间输入到awk变量中,并与日志时间进行比较。
/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
在正式环境中,不得出现致命错误,因此需要一直监控并捕捉错误,并与开发团队进行协调。
获取CPU时钟速率
变得越来越困难了
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,在删除前两行之后,在每行开头添加标签。
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
就是这样
[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

增压器
https://zh.wikipedia.org/wiki/%E5%A2%9E%E5%8A%A0%E5%99%A8
速度步进
最后
只需创建一个prom文件,就可以方便地导入所需的数据。虽然现在可能会有更好的出口商,但我是一个倾向于使用一行代码的42岁老家伙。最近还有ServerAdministrator_exporter之类的东西……有时觉得这已经足够好了,有时又觉得不是。
但是因为可以轻松地进行度量衡,所以不知不觉中总是写下来了呢…