通过Node_Exporter将HDD的SMART信息发送到Prometheus
首先
在HDD中,有一项名为S.M.A.R.T的自我诊断功能。
与使用SATA HDD的信息相比,用于服务器的SAS形式的HDD还具备更详细的信息,例如温度等。
本次我们将获取温度数值,并使用Node_Exporter获取数据,在Prometheus和Grafana中显示图表。
为什么选择Node_Exporter?
由于 Prometheus 提供了方便的收集功能,如 PushGateway等,但这次为了与Node_Exporter的主机名相匹配,我将它作为了Node_Exporter的附加信息进行了注册(在Grafana部分中,如果主机不同会很麻烦)。
The premise
运用设备
戴尔 PowerEdge R210II 有点陈旧了。
安装smartmontools
#-yオプションは嫌い、ちゃんと依存関係とか見て使いたい・・・
sudo yum install smartmontools
服务器管理员的安装
戴尔的服务器提供了一个名为ServerAdministrator的工具来进行管理。
参考:通过yum安装Dell OpenManage Server Administrator(OMSA)
※这是同事的文章。
我想安装它是因为我想要使用后面提到的磁盘ID。
毕竟,它用于检测磁盘故障之类的事情,所以在安装操作系统之后最好先安装它。
检查光盘
由于我想将从OMSA获取的磁盘ID用作标签,所以请确认一下。
[m-kikuchi@manage01 ~]$ omreport storage pdisk controller=0
List of Physical Disks on Controller PERC H200 Adapter (Slot 1)
Controller PERC H200 Adapter (Slot 1)
ID : 0:0 ←ここをラベルで使用するのでメモしておく。
Status : Ok
Name : Physical Disk 0:0
State : Online
Power Status : Not Applicable
Device Name : Not Available
Bus Protocol : SAS ←SATAだと温度は取れない。
Media : HDD
・
・
・
顺便提一下,如果遇到磁盘故障或其他问题需要联系支持部门,请提供这个ID以加快处理速度。
准备Node_Exporter
在启动选项中设置收集以下文件夹的数据。
#ここが欲しい
/opt/prometheus/collector/
#起動オプション
./node_exporter --collector.textfile.directory=/opt/prometheus/collector
Prometheus和Grafana
只要数据源的注册是正确的,前提是这一点! (随意疲倦地说)
命令测试
由于操作系统版本和RAID控制器类型的不同,需要寻找适用的命令。
#CentOS7や、PERC系はだいたいこっち、sdaやsdbを指定するがどっちでも良かったりダメだったり
#コントローラー依存がありそう、両方で拾えた場合はディスク番号はどちらも共通
#-d megaraid,0 /dev/sda と-d megaraid,0 /dev/sdbは同じディスクの情報が帰ってくる
sudo /usr/sbin/smartctl -a -d megaraid,0 /dev/sda
#CenOS6や、ソフトウェアRAIDだとこっち
sudo /usr/sbin/smartctl -a /dev/sg1
回家的结果是一样的,不过sg[1-9]可能是RAID卷或者CD-ROM驱动器,所以要仔细确认一下。
指令结果如下:
$ sudo /usr/sbin/smartctl -a /dev/sg1
smartctl 5.43 2012-06-30 r3573 [x86_64-linux-2.6.32-358.18.1.el6.x86_64] (local build)
Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net
Vendor: SEAGATE
Product: ST3600057SS
Revision: ES66
User Capacity: 600,127,266,816 bytes [600 GB]
Logical block size: 512 bytes
Logical Unit id: 0x5000c50068e5c963
Serial number: 6SL6R42F
Device type: disk
Transport protocol: SAS
Local Time is: Tue Jun 27 16:51:20 2017 JST
Device supports SMART and is Enabled
Temperature Warning Disabled or Not Supported
SMART Health Status: OK
Current Drive Temperature: 35 C ←今回はここがほしい
Drive Trip Temperature: 68 C
・
・
・
指令 (Zhi Ling)
Prometheus以以下形式收集数据。
从smartctl提取出来的值中,通过sed过滤出对应部分的努力之人。
項目名{ラベル名1="文字列",ラベル名2="文字列"} 値
努力一口气,努力一丝不苟
#/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
正在做的事情 zuò de
#対象ドライブの温度の行を取得
/usr/sbin/smartctl -a /dev/sg1 |grep 'Current Drive Temperature' |
#温度の値だけ欲しいのでそれ以外を消す
sed 's/^Current Drive Temperature://g'|
sed 's/[ |:|C]//g'|
#Prometheusで使用する名前とラベルを行頭に差し込む、DiskIDに最初に調べたドライブのID、mountに取得したポイントを記録した
sed 's/^/HDD_Temperature{DiskID="0:0",mount="\/dev\/sg1"} /g'
#ファイルに書き込む(1行目はファイルを作り直すので>で送る)
>/opt/prometheus/collector/hdd_temp.prom
#2行目以降は追記なので>>で送る
>>/opt/prometheus/collector/hdd_temp.prom
设定
把它留作用于数据提取的脚本。
#HDDの温度
/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
当追加完毕后,请手动执行并确认值。
$ cat /opt/prometheus/collector/hdd_temp.prom
HDD_Temperature{DiskID="0:0",mount="/dev/sg1"} 36
HDD_Temperature{DiskID="0:1",mount="/dev/sg2"} 43
如果以Node_Exporter可读的格式输出就可以了。
如果可以的话,就把它注册到crontab中,每隔5分钟更新一次也可以。
确认
使用curl访问度量指标,如果该行存在则表示OK。
当Node_Exporter被调用时,它会自动读取每个参数,并且只要指定位置有指定文件,就会自动生效。
$ curl http://localhost:9100/metrics |grep HDD
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0# HELP HDD_Temperature Metric read from /opt/prometheus/collector/hdd_temp.prom
# TYPE HDD_Temperature untyped
HDD_Temperature{DiskID="0:0",mount="/dev/sg1"} 36
HDD_Temperature{DiskID="0:1",mount="/dev/sg2"} 43
100 85996 100 85996 0 0 1594k 0 --:--:-- --:--:-- --:--:-- 1646k

在Grafana上努力奋斗

总结
这篇文章通过在命令行上操纵SMART信息并将其格式化以便在Prometheus上读取,事先将其放置在设置好的Node_Exporter收集目录中,从而实现值的收集。所有这些都不仅限于SMART。
请赠品
由于我在上面提及了OMSA,所以在应用中也可以实现这样的事情。
#物理ディスクの正常な数を数えて出力
/opt/dell/srvadmin/bin/omreport storage pdisk controller=0 | grep Status | grep Ok | wc -l |sed 's/^/OmReport_PDisk_Status /g' >/opt/prometheus/collector/pdisk.prom
#物理ディスクの数を数えて出力
/opt/dell/srvadmin/bin/omreport storage pdisk controller=0 | grep Media | wc -l |sed 's/^/OmReport_PDisk_Num /g' >/opt/prometheus/collector/pdisk_num.prom
您可以输出已识别为OK的存储器数量和已认知数量,并用以下警报规则检测磁盘故障。
ALERT Local_HDDFAILD
IF OmReport_PDisk_Status < OmReport_PDisk_Num
FOR 1m
LABELS {severity="High"}
ANNOTATIONS {description="{{ $labels.instance }} がHDD壊れたみたいですよ", summary="Instance {{ $labels.instance }} HDD-Failed"}
- alert: Local_HDDFAILD
expr: OmReport_PDisk_Status < OmReport_PDisk_Num
for: 1m
labels:
severity: High
annotations:
description: '{{ $labels.instance }} がHDD壊れたみたいですよ'
summary: Instance {{ $labels.instance }} HDD-Failed