APC社UPSの状態をzabbixで監視する

APC(シュナイダーエレクトリック)社UPSの状態をzabbixで監視したいと思います。
通常は電源障害時に発生するログを監視する程度で十分かと思いますが、せっかく採れる情報を有効活用したいと思います。

<!-- more -->
## 当方の環境
参考までに当方の環境を説明しますが、
Linuxサーバ(CentOS6)に、SmartUPS™ XL 500をUSB接続で接続しています。
当該サーバにzabbix-agentがインストールされており、v3にバージョンアップ済みです。

## apcupsdの導入
### インストール
epelリポジトリより、apcupsdをインストールします。
epelリポジトリの有効化方法は割愛します。

```bash
# yum --enablerepo=epel install apcupsd
```

### 設定
/etc/apcupsd/apcupsd.conf を適切に設定します。
但し(スタンドアロンの場合は)最低限、以下程度の設定を行えば問題ないかと思います。
conf中の説明が丁寧なので、説明通りに設定すれば問題ありません。

- UPSCABLE : 接続方法の指定
- UPSTYPE : 接続デバイス名
- ONBATTERYDELAY : 電源障害発生後、何秒後にイベント動作を開始するか
- BATTERYLEVEL : バッテリー残容量(%)を下回ったらシャットダウン処理を開始するか
- MINUTES : バッテリーでの残稼働時間(分)を下回ったらシャットダウン処理を開始するか

### 状態の確認
設定完了後、apcupsdを起動します。

```bash
# service apcupsd start
```

apcaccessコマンドで状態を取得できるか確認します。

```bash
[root@server ~]# apcaccess
APC      : 001,045,1139
DATE     : 2016-10-02 22:14:07 +0900
HOSTNAME : server.example.net
VERSION  : 3.14.12 (29 March 2014) redhat
UPSNAME  : server.example.net
CABLE    : USB Cable
DRIVER   : USB UPS Driver
UPSMODE  : Stand Alone
STARTTIME: 2016-08-26 00:13:17 +0900
MODEL    : Smart-UPS 500 XL
STATUS   : ONLINE
LINEV    : 102.2 Volts
LOADPCT  : 7.8 Percent
BCHARGE  : 100.0 Percent
TIMELEFT : 153.0 Minutes
MBATTCHG : 5 Percent
MINTIMEL : 3 Minutes
MAXTIME  : 0 Seconds
OUTPUTV  : 102.2 Volts
SENSE    : High
DWAKE    : -1 Seconds
DSHUTD   : 90 Seconds
LOTRANS  : 92.0 Volts
HITRANS  : 108.0 Volts
RETPCT   : 0.0 Percent
ITEMP    : 34.2 C
ALARMDEL : 30 Seconds
BATTV    : 27.3 Volts
LINEFREQ : 50.0 Hz
LASTXFER : Automatic or explicit self test
NUMXFERS : 3
XONBATT  : 2016-10-02 10:29:17 +0900
TONBATT  : 0 Seconds
CUMONBATT: 25 Seconds
XOFFBATT : 2016-10-02 10:29:23 +0900
LASTSTEST: 2016-10-02 10:29:17 +0900
SELFTEST : NO
STESTI   : 14 days
STATFLAG : 0x05000008
MANDATE  : 2011-06-10
SERIALNO : XX0000000000
BATTDATE : 2011-06-10
NOMOUTV  : 100 Volts
NOMBATTV : 24.0 Volts
FIRMWARE : 684.20.A USB FW:11.
END APC  : 2016-10-02 22:14:41 +0900
```

## zabbixでの情報取得
本題に入ります。
上記、apcaccessコマンドの結果には設定値が混ざっていますが、中には有用な情報が含まれていることに気付きます。以下の情報は変動する値と思われ、取得する価値がありそうです。

- LINEV : 入力(商用電源)電圧(V)
- OUTPUTV : 出力電圧(V)
- BATTV : バッテリー電圧(V)
- LOADPCT : 負荷(%)
- BCHARGE : バッテリー残容量(%)
- TIMELEFT : バッテリー稼働時間(分)
- ITEMP : 内部温度(℃)

### UserParameterの設定
追加情報を取得する場合、zabbix-agentdにUserParameterの設定を追加します。
値のみを適切に渡せるよう、/etc/zabbix/zabbix-agentd.confのUserParameterの段落に以下の記載を追記します。

```bash
UserParameter=UPS.LINEV,apcaccess -u|grep LINEV|cut -d ':' -f2|cut -d ' ' -f2
UserParameter=UPS.OUTPUTV,apcaccess -u|grep OUTPUTV|cut -d ':' -f2|cut -d ' ' -f2
UserParameter=UPS.BATTV,apcaccess -u|grep ^BATTV|cut -d ':' -f2|cut -d ' ' -f2
UserParameter=UPS.LOADPCT,apcaccess -u|grep LOADPCT|cut -d ':' -f2|cut -d ' ' -f2
UserParameter=UPS.BCHARGE,apcaccess -u|grep BCHARGE|cut -d ':' -f2|cut -d ' ' -f2
UserParameter=UPS.TIMELEFT,apcaccess -u|grep TIMELEFT|cut -d ':' -f2|cut -d ' ' -f2
UserParameter=UPS.ITEMP,apcaccess -u|grep ITEMP|cut -d ':' -f2|cut -d ' ' -f2
```
設定完了後、zabbix-agentを再起動します。

### アイテムの設定
設定したUserParameterを取り込むため、zabbixアイテムの設定を行います。(設定⇒ホスト⇒サーバ名)
![item1.png](https://qiita-image-store.s3.amazonaws.com/0/113912/99eec951-2178-9226-5553-cbdacbb6ecde.png)
当方では以下のように設定しました。
アプリケーション名を設定しカテゴライズするとよいでしょう。

| UserParameterで設定したキー名 | 名前 | データ型 | 単位 |
|:-------------|---------------------:|:-------------:|:---:|
| UPS.LINEV    | UPS Line Voltage     | 数値(浮動小数) |  V  |
| UPS.OUTPUTV  | UPS Output Voltage   | 数値(浮動小数) |  V  |
| UPS.BATTV    | UPS Battery Voltage  | 数値(浮動小数) |  V  |
| UPS.LOADPCT  | UPS Load Percent     | 数値(浮動小数) |  %  |
| UPS.BCHARGE  | UPS Battery Capacity | 数値(浮動小数) |  %  |   
| UPS.TIMELEFT | UPS Time Left        | 数値(浮動小数) | min |   
| UPS.ITEMP    | UPS Internal Temperature | 数値(浮動小数) | ℃ |

### 取得状況の確認
以上の設定で、値が取得できるようになっているはずです。（監視データ⇒最新データ）
また、しばらく取得すればグラフが描かれます。
![item2.png](https://qiita-image-store.s3.amazonaws.com/0/113912/5f3bead8-438d-7da9-ea1d-fcdc72c19d0b.png)

## zabbixでの活用
### カスタムグラフの作成
上記の設定のみでも単独のパラメータのグラフが確認できますが、視認性を上げるためカスタムグラフの作製をお勧めします。(設定⇒ホスト⇒当該サーバの「グラフ」）
当方では以下3つのカスタムグラフを作成しました。

- 電圧 : UPS Line Voltage , UPS Output Voltage , UPS Battery Voltage の3つ  ![g-voltage.png](https://qiita-image-store.s3.amazonaws.com/0/113912/1d56ad54-0ca1-05c6-4f4c-115c79850a74.png)  

- 負荷 : UPS Load Percentのみ  ![g-load.png](https://qiita-image-store.s3.amazonaws.com/0/113912/c696775b-6624-7116-e3d9-5a69b6a5dcd0.png)  

- 温度 : サーバの sensorsコマンド(lm_sensors) で取得したCPU温度、サーバ温度とUPS温度の3つをグラフ化  ![g-temp.png](https://qiita-image-store.s3.amazonaws.com/0/113912/8ae57bdc-aada-11cf-f533-1cc94531534c.png)  

### 監視
商用電圧が閾値を下回った際にアラームが鳴るようにします。(設定⇒ホストで、当該ホストにトリガーを作成)
当方では条件式を {server:UPS.LINEV.last(#2)}<80 とし、2分間にわたり80Vを下回る場合に通知するようにしています。