zabbix
FlashMAX
HGST

Zabbix監視テンプレート(FlashMAX PCIe SSD)

Zabbix監視テンプレート(FlashMAX PCIe SSD)を作成しました。
Zabbix 3.0、HGST PCIe Flashドライブで検証しています。

前提条件

  • Zabbixエージェントの設定ファイルにパラメータ"Include=/etc/zabbix/zabbix_agentd.d/"を設定している事。
  • HGST PCIe Flashドライブ(4,800GB/2,200GB/1,100GB)を使用している事。
  • FlashMAXのユーティリティコマンド"vgc-monitor"がインストールされている事。
  • ZabbixエージェントにJSONパース用のユーティリティコマンド"jq"がインストールされている事。

FlashMAX PCIe SSD

テンプレート

  • Template FlashMAX PCIe SSD(テンプレートとのリンク: なし)

アプリケーション

  • FlashMAX PCIe SSD

アイテム

# 名前 トリガー キー データ型 単位 乗数の使用 更新間隔(秒) ヒストリ トレンド タイプ アプリケーション 内容 備考
1 R Version 0 custom.vgc.rversion 文字列 - - 3600 90 - Zabbixエージェント FlashMAX PCIe SSD ドライバーの連続稼働時間(秒)
2 Driver Uptime Secs 0 custom.vgc.driveruptimesecs 数値 - - 60 90 365 Zabbixエージェント FlashMAX PCIe SSD バージョン

トリガー

  • なし

ディスカバリ

ディスカバリルール

# 名前 タイプ キー 更新間隔(秒) 例外の更新間隔 存在しなくなったリソースの保持期間(日) 説明 備考
1 Custom mounted vgc for discovery Zabbixエージェント custom.vgc.discovery 3600 - 30 Discovery of custom vgc of different types as defined in global regular expression "Custom mounted vgc for discovery".
2 Custom mounted vgc part for discovery Zabbixエージェント custom.vgc.part.discovery 3600 - 30 Discovery of custom mounted vgc part of different types as defined in global regular expression "Custom mounted vgc part for discovery".

フィルター

  • なし

アイテムのプロトタイプ

# 名前 ディスカバリルール トリガー キー データ型 単位 乗数の使用 更新間隔(秒) ヒストリ トレンド タイプ アプリケーション 内容 備考
1 beacon on {#VGCCARDNAME} Custom mounted vgc for discovery 0 custom.vgc.beacon[{#VGCCARDNAME},{#VGCCARDNUMBER}] 文字列 - - 3600 90 - Zabbixエージェント FlashMAX PCIe SSD ビーコン
2 Card Action Required on {#VGCCARDNAME} Custom mounted vgc for discovery 0 custom.vgc.cardactionrequired[{#VGCCARDNAME},{#VGCCARDNUMBER}] 文字列 - - 3600 90 - Zabbixエージェント FlashMAX PCIe SSD カードに必要な行動
3 Card Option Rom Rev on {#VGCCARDNAME} Custom mounted vgc for discovery 0 custom.vgc.cardoptionromrev[{#VGCCARDNAME},{#VGCCARDNUMBER}] 文字列 - - 3600 90 - Zabbixエージェント FlashMAX PCIe SSD カードのROMリビジョン(オプション)
4 Card Part Name on {#VGCCARDNAME} Custom mounted vgc for discovery 0 custom.vgc.cardpartname[{#VGCCARDNAME},{#VGCCARDNUMBER}] 文字列 - - 3600 90 - Zabbixエージェント FlashMAX PCIe SSD カードのパーティーション名
5 Card PCIE Gen on {#VGCCARDNAME} Custom mounted vgc for discovery 0 custom.vgc.cardpciegen[{#VGCCARDNAME},{#VGCCARDNUMBER}] 文字列 - - 3600 90 - Zabbixエージェント FlashMAX PCIe SSD カードのPCI Expressの世代
6 Card Rev on {#VGCCARDNAME} Custom mounted vgc for discovery 0 custom.vgc.cardrev[{#VGCCARDNAME},{#VGCCARDNUMBER}] 文字列 - - 3600 90 - Zabbixエージェント FlashMAX PCIe SSD カードのリビジョン
7 Card Serial Number on {#VGCCARDNAME} Custom mounted vgc for discovery 0 custom.vgc.cardserialnumber[{#VGCCARDNAME},{#VGCCARDNUMBER}] 文字列 - - 3600 90 - Zabbixエージェント FlashMAX PCIe SSD カードのシリアルナンバー
8 Card Status on {#VGCCARDNAME} Custom mounted vgc for discovery 1 custom.vgc.cardstatus[{#VGCCARDNAME},{#VGCCARDNUMBER}] 文字列 - - 60 90 - Zabbixエージェント FlashMAX PCIe SSD カードの状態
9 Card State Details on {#VGCCARDNAME} Custom mounted vgc for discovery 1 custom.vgc.cardtemperaturec[{#VGCCARDNAME},{#VGCCARDNUMBER}] 文字列 - - 60 90 - Zabbixエージェント FlashMAX PCIe SSD カードの状態(詳細)
10 Card Temperature on {#VGCCARDNAME}, in ℃ Custom mounted vgc for discovery 1 custom.vgc.cardtemperaturec[{#VGCCARDNAME},{#VGCCARDNUMBER}] 数値 - 60 90 365 Zabbixエージェント FlashMAX PCIe SSD カードの温度(摂氏)
11 Card Temperature State on {#VGCCARDNAME} Custom mounted vgc for discovery 1 custom.vgc.cardtemperaturestate[{#VGCCARDNAME},{#VGCCARDNUMBER}] 文字列 - - 60 90 - Zabbixエージェント FlashMAX PCIe SSD カードの温度(状態)
12 Card Temperature Throttle on {#VGCCARDNAME} Custom mounted vgc for discovery 1 custom.vgc.cardtemperaturethrottle[{#VGCCARDNAME},{#VGCCARDNUMBER}] 文字列 - - 60 90 - Zabbixエージェント FlashMAX PCIe SSD カードの温度(スロットル)
13 Card Type on {#VGCCARDNAME} Custom mounted vgc for discovery 0 custom.vgc.cardtype[{#VGCCARDNAME},{#VGCCARDNUMBER}] 文字列 - - 60 90 - Zabbixエージェント FlashMAX PCIe SSD カードのタイプ
14 Flash Reserve Left on {#VGCPARTNAME}, in % Custom mounted vgc part for discovery 1 custom.vgc.part.flashreservesleftpct[{#VGCCARDNAME},{#VGCCARDNUMBER},{#VGCPARTNUMBER}] 数値(浮動小数) % - 60 90 365 Zabbixエージェント FlashMAX PCIe SSD 最大書き換え容量
15 Remaining Life on {#VGCPARTNAME}, in % Custom mounted vgc part for discovery 1 custom.vgc.part.remaininglifepct[{#VGCCARDNAME},{#VGCCARDNUMBER},{#VGCPARTNUMBER}] 数値(浮動小数) % - 60 90 365 Zabbixエージェント FlashMAX PCIe SSD 最大書き換え容量に対する残りの書き換え容量の割合
16 Format Mode on {#VGCPARTNAME} Custom mounted vgc part for discovery 0 custom.vgc.part.formatmode[{#VGCCARDNAME},{#VGCCARDNUMBER},{#VGCPARTNUMBER}] 文字列 - - 3600 90 - Zabbixエージェント FlashMAX PCIe SSD フォーマットモード
17 Idle Time GC on {#VGCPARTNAME} Custom mounted vgc part for discovery 0 custom.vgc.part.idletimegc[{#VGCCARDNAME},{#VGCCARDNUMBER},{#VGCPARTNUMBER}] 文字列 - - 3600 90 - Zabbixエージェント FlashMAX PCIe SSD アイドルタイム(ガベージコレクション)
18 Partition State on {#VGCPARTNAME} Custom mounted vgc part for discovery 1 custom.vgc.part.partitionstate[{#VGCCARDNAME},{#VGCCARDNUMBER},{#VGCPARTNUMBER}] 文字列 - - 60 90 - Zabbixエージェント FlashMAX PCIe SSD パーティーションの状態
19 Raid on {#VGCPARTNAME} Custom mounted vgc part for discovery 0 custom.vgc.part.raid[{#VGCCARDNAME},{#VGCCARDNUMBER},{#VGCPARTNUMBER}] 文字列 - - 3600 90 - Zabbixエージェント FlashMAX PCIe SSD Raidの有効/無効
20 Total Flash Reads on {#VGCPARTNAME}, in Bytes Custom mounted vgc part for discovery 0 custom.vgc.part.totalreadbytes[{#VGCCARDNAME},{#VGCCARDNUMBER},{#VGCPARTNUMBER}] 数値 B - 60 90 365 Zabbixエージェント FlashMAX PCIe SSD 現在までの合計読み込みバイト数
21 Total Flash Writes on {#VGCPARTNAME}, in Bytes Custom mounted vgc part for discovery 0 custom.vgc.part.totalwritebytes[{#VGCCARDNAME},{#VGCCARDNUMBER},{#VGCPARTNUMBER}] 数値 B - 60 90 365 Zabbixエージェント FlashMAX PCIe SSD 現在までの合計書き込みバイト数
22 Usable Capacity on {#VGCPARTNAME}, in Bytes Custom mounted vgc part for discovery 0 custom.vgc.part.usablecapacitybytes[{#VGCCARDNAME},{#VGCCARDNUMBER},{#VGCPARTNUMBER}] 数値 B - 60 90 365 Zabbixエージェント FlashMAX PCIe SSD 使用可能なバイト数
  • ヒストリとは各収集値の保持期間
  • トレンドとは数値データタイプの1時間あたりの最低値、最高値、平均値および合計値の保持期間
  • Zabbixにリトライ回数、リトライ間隔、タイムアウト時間は存在しない

トリガーのプロトタイプ

# 深刻度 トリガー ディスカバリルール 条件式 種別 内容 備考
1 重度の障害 Custom mounted vgc for discovery Card Status on {#VGCCARDNAME} on {HOST.NAME} custom.vgc.cardstatus[{#VGCCARDNAME},{#VGCCARDNUMBER}].str("Good")<>1 デバイス 直近のカードの状態(詳細)の文字列の値が1("Good")以外だった場合
2 重度の障害 Custom mounted vgc for discovery Card State Details on {#VGCCARDNAME} on {HOST.NAME} custom.vgc.cardstatedetails[{#VGCCARDNAME},{#VGCCARDNUMBER}].str("Normal")<>1 デバイス 直近のカードの状態の文字列の値が1("Normal")以外だった場合
3 重度の障害 Custom mounted vgc for discovery Card Temperature on {#VGCCARDNAME} on {HOST.NAME} custom.vgc.cardtemperaturec[{#VGCCARDNAME},{#VGCCARDNUMBER}].max(#3)>80 デバイス 直近3回のカードの温度(摂氏)の値(最大値)が80以上だった場合
4 重度の障害 Custom mounted vgc for discovery Card Temperature State on {#VGCCARDNAME} on {HOST.NAME} custom.vgc.cardtemperaturestate[{#VGCCARDNAME},{#VGCCARDNUMBER}].str("Safe")<>1 デバイス 直近のカードの温度(状態)の文字列の値が1("Safe")以外だった場合
5 重度の障害 Custom mounted vgc for discovery Card Temperature Throttle on {#VGCCARDNAME} on {HOST.NAME} custom.vgc.cardtemperaturethrottle[{#VGCCARDNAME},{#VGCCARDNUMBER}].str("Inactive")<>1 デバイス 直近のカードの温度(スロットル)の文字列の値が1("Inactive")以外だった場合
6 重度の障害 Custom mounted vgc part for discovery Flash Reserve Left on {#VGCPARTNAME} on {HOST.NAME} custom.vgc.part.flashreservesleftpct[{#VGCCARDNAME},{#VGCCARDNUMBER},{#VGCPARTNUMBER}].max(#3)<20.00 デバイス 直近3回の最大書き換え容量の割合の値(最大値)が20.00以下だった場合
7 重度の障害 Custom mounted vgc part for discovery Remaining Life on {#VGCPARTNAME} on {HOST.NAME} custom.vgc.part.remaininglifepct[{#VGCCARDNAME},{#VGCCARDNUMBER},{#VGCPARTNUMBER}].max(#3)<20.00 デバイス 直近3回の最大書き換え容量に対する残りの書き換え容量の割合の値(最大値)が20.00以下だった場合
8 重度の障害 Custom mounted vgc part for discovery Partition State on {#VGCCARDNAME} on {HOST.NAME} custom.vgc.part.partitionstate[{#VGCCARDNAME},{#VGCCARDNUMBER},{#VGCPARTNUMBER}].str("READY")<>1 デバイス 直近のカードの状態の文字列の値が1("READY")以外だった場合

スクリプトの設置

/usr/local/bin/lld-vgc.py
#!/usr/bin/python
# coding: utf-8
# ------------------------------------------------------------------------------
# Script Name  : lld-vgc.py
# Tool Version : 1.0.0
# Argument     : -
# Options      : -h, --help       show this help message and exit
#              : -v, --version    show version and exit
#              : -p, --partition  show all partition
# Usage        : $0 [Option]
# Return       : -
# -------------+-------------------------------------------+--------------------
# Date         | Changes                                   | Author
# -------------+-------------------------------------------+--------------------
# 2018/02/26   | New Creation                              | @bloodia
# ------------------------------------------------------------------------------
# --+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8

import json
import subprocess
import argparse

parser = argparse.ArgumentParser()
parser.add_argument(
                       '-v', '--version',
                       action='version',
                       version='v1.0.0',
                       help='show version and exit'
                   )
parser.add_argument(
                       '-p', '--partition',
                       action='store_true',
                       dest='partition',
                       help='show all partition and exit'
                   )
args = parser.parse_args()

if __name__ == "__main__":
    p1 = subprocess.Popen(['vgc-monitor', '-f', 'json'], stdout=subprocess.PIPE)
    stdout, stderr = p1.communicate()
    data = list()
    json_data = json.loads(stdout,'utf-8')
    for vgc in json_data:
        if isinstance(json_data[vgc], list):
            cardnumber = -1
            for card in json_data[vgc]:
                cardnumber += 1
                cardname = card['cardName']
                if (args.partition == True or args.partition == True):
                  if isinstance(card['partitionDetails'], list):
                    partnumber = -1
                    for part in card['partitionDetails']:
                        partnumber += 1
                        partname = part['partName']
                        data.append({
                            "{#VGCCARDNUMBER}": cardnumber,
                            "{#VGCCARDNAME}": cardname,
                            "{#VGCPARTNUMBER}": partnumber,
                            "{#VGCPARTNAME}": partname
                        })
                else:
                        data.append({
                            "{#VGCCARDNUMBER}": cardnumber,
                            "{#VGCCARDNAME}": cardname
                        })
    print(json.dumps({"data": data}, indent=4))

コンフィグの設置

/etc/zabbix/zabbix_agentd.d/userparameter_vgc.conf
# Custom Discovery Rules
UserParameter=custom.vgc.discovery,/usr/local/bin/lld-vgc.py
UserParameter=custom.vgc.part.discovery,/usr/local/bin/lld-vgc.py -p

# Custom Monitoring Items
UserParameter=custom.vgc.rversion,vgc-monitor -f json | jq -r ".rVersion"
UserParameter=custom.vgc.driveruptimesecs,vgc-monitor -f json | jq -r ".driverUptimeSecs"
UserParameter=custom.vgc.beacon[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].beacon"
UserParameter=custom.vgc.cardactionrequired[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].cardActionRequired"
UserParameter=custom.vgc.cardoptionromrev[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].cardOptionRomRev"
UserParameter=custom.vgc.cardpartname[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].cardPartName"
UserParameter=custom.vgc.cardpciegen[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].cardPCIEGen"
UserParameter=custom.vgc.cardrev[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].cardRev"
UserParameter=custom.vgc.cardserialnumber[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].cardSerialNumber"
UserParameter=custom.vgc.cardstatedetails[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].cardStateDetails"
UserParameter=custom.vgc.cardstatus[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].cardStatus"
UserParameter=custom.vgc.cardtemperaturec[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].cardTemperatureC"
UserParameter=custom.vgc.cardtemperaturestate[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].cardTemperatureState"
UserParameter=custom.vgc.cardtemperaturethrottle[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].cardTemperatureThrottle"
UserParameter=custom.vgc.cardtype[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].cardType"
UserParameter=custom.vgc.part.flashreservesleftpct[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].partitionDetails[$3].flashReservesLeftPCT"
UserParameter=custom.vgc.part.formatmode[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].partitionDetails[$3].formatMode"
UserParameter=custom.vgc.part.idletimegc[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].partitionDetails[$3].idleTimeGC"
UserParameter=custom.vgc.part.partitionstate[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].partitionDetails[$3].partitionState"
UserParameter=custom.vgc.part.remaininglifepct[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].partitionDetails[$3].remainingLifePCT"
UserParameter=custom.vgc.part.totalreadbytes[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].partitionDetails[$3].totalReadBytes"
UserParameter=custom.vgc.part.totalwritebytes[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].partitionDetails[$3].totalWriteBytes"
UserParameter=custom.vgc.part.usablecapacitybytes[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].partitionDetails[$3].usableCapacityBytes"
UserParameter=custom.vgc.part.raid[*],vgc-monitor -d $1 -f json | jq -r ".cardInfo[$2].partitionDetails[$3].raid"

zabbix-agentの再起動(CentOS 5, 6)

[root@localhost ~]# /etc/init.d/zabbix-agent restart

zabbix-agentの再起動(CentOS 7)

[root@localhost ~]# systemctl restart zabbix-agent