通过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
image.png

在Grafana上努力奋斗

image.png

总结

这篇文章通过在命令行上操纵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
广告
将在 10 秒后关闭
bannerAds