HDD의 SMART 정보를 Node_Exporter를 통해 Prometheus로 보내기

소개



HDD에는 S.M.A.R.T이라는 자체 진단 기능이 있습니다.
서버에서 사용되는 SAS 형식의 HDD에는 SATA의 HDD로 취득하고 있는 정보 외에 온도 등 더 세세한 정보도 가지고 있습니다.

이번에는 거기에서 온도 값을 얻고 Node_Exporter로 데이터를 얻고 Prometheus와 Grafana에서 그래프를 표시해 보겠습니다.

왜 Node_Exporter?



Prometheus에는 PushGateway 등 편리한 수집 기능도 있습니다만, 이번은 Node_Exporter와 같은 호스트명으로 정렬하고 싶었으므로 Node_Exporter의 추가 정보로서 등록했습니다.
(후의 Grafana의 단에서 호스트가 다르면 귀찮음)

전제



사용 장비



DELL PowerEdge R210II
조금 오래된

smartmontools 설치


#-yオプションは嫌い、ちゃんと依存関係とか見て使いたい・・・
sudo yum install smartmontools

ServerAdministrator 설치



DELL 서버는 관리를 위해 ServerAdministrator이라는 도구를 제공합니다.
참고 : Dell OpenManage Server Administrator(OMSA)를 yum에서 설치
※동료의 기사입니다.
후술하는 디스크 ID를 사용하고 싶기 때문에 설치해 둡니다.
그렇다면 디스크 장애 감지에 사용하기 때문에 OS를 넣으면 우선 할 수 있습니다.

디스크 확인



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



이쪽은 데이터 소스의 등록이 적절하게 되어 있는 것을 전제로! (던지기)

명령 테스트



OS의 버전이나 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
・
・
・

명령



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

하는 일


#対象ドライブの温度の行を取得
/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

설정



데이터 수집을위한 스크립트로 유지

get_omreport.sh
#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로 읽을 수 있는 형식으로 출력되면 OK
가능하면 crontab에 등록해 둔다, 5분 두어도 갱신해 두면 좋을까.

확인



curl을 사용하여 metrics에 액세스하고 해당 행이 있으면 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

마찬가지로 Prometheus도 값이 늘어나면 자동으로 등록하므로 그대로 반영된다.


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

Status가 OK인 스토리지의 수와 인식하고 있는 수를 출력해 두고, 이하의 경고 룰로 디스크 장해를 검지하는 것 같습니다. (오히려 여기 기사를 걸고)

prometheus1계
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"}

prometheus2계
  - 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

좋은 웹페이지 즐겨찾기