Zabbix: 同一OIDのトラップを分類する(内部メッセージをKEYにして)

# 問題点

Zabbixにて、各OIDのトラップに対して、深刻度をそれぞれ定義していると思います。
が稀に、同一OIDのトラップに対して、内部メッセージをキーとして、異なる深刻度に分類する要望が発生したりします。

# 問題点の具体例(サンプル)

### (1)設計時の監視ルール
トラップ(OID=.1.3.6.1.4.1.8072.9999(netSnmpExperimental))は、ファイルオープンが失敗した場合のアラームであり、必ず、深刻度「致命的な障害」としてインシデント管理していたとします。
また、当トラップの第一引数には、エラー原因により、以下の３メッセージの何れかを付加していた。

+ "FileNotFound"(ファイルが存在しないエラー)
+ "FileSizeZero"(ファイルが存在しているが0Bytes)
+ "UnknownError"(原因不明のエラー)

※サンプルショボくてすいません

### (2)実際に運用してみて、
運用後、ファイル0bytesの場合は、エラーではなく正常な動作であることが判明(よくあることです)。
アプリチームから、トラップnetSnmpExperimentalで、第一引数が"FileSizeZero"の場合は、深刻度「情報」にして欲しい(インシデント管理対象外にしたい)との要望。

### (3)Zabbix管理者はその要望を受容しなければなりません。
サービス要件ならば、プログラム側の修正は必須ですが、
今回は監視要件…　Zabbix管理側が対応しなければなりませんよね（悲しい!!)

# 想定するZabbix環境

トラップの流れは、以下の3デーモンを使用していると想定

1. SNMPTRAPDでトラップを受信
2. SNMPTTでトラップの分類
3. ZABBIXでトリガー処理

# 実現方法(設定)

SNMPTTを利用する。

### SNMPTT設定
本来、対象トラップ(netSnmpExperimental)の記載は１本であったが、
以下のように、深刻度(severity)を"INFORMATION(情報)"と"DISASTER(致命的な障害)"の2本に分割。
それぞれにMATCH構文を追記し、"INFORMATION"には"(FileSizeZero)"を追記。
"DISASTER"には"!(FileSizeZero)"を追記する。

```ruby:/etc/snmp/snmptt.conf
EVENT netSnmpExperimental .1.3.6.1.4.1.8072.9999 "Status Event" INFORMATION
MATCH $1: (FileSizeZero)
FORMAT ZBXTRAP $aA ファイルサイズゼロなので処理不要。正常状態です($1)。

EVENT netSnmpExperimental .1.3.6.1.4.1.8072.9999 "Status Event" DISASTER
MATCH $1: !(FileSizeZero)
FORMAT ZBXTRAP $aA ファイルオープンが失敗しました。障害発生($1)。
```

### Zabbix-ITEM設定

+ 深刻度"INFORMATION"用のitem設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/78b17e42-6775-781f-ef3b-542bfc2ccf7c.png)


+ 深刻度"DISASTER"用のitem設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/3641f812-b6ec-cdc3-6987-84fc13845a70.png)

(注意)キーの中身は、"INFORMATION"や"DISASTER"のみだと、トラップメッセージ内の文字列がマッチしてしまう可能性があるので、ユニークになるようなルールが必要です(ここでは、深刻度+"Status Event"をキーとしています)。


### Zabbix-TRIGGER設定

+ 深刻度"INFORMATION"用のtrigger設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/4a0a47cd-e791-209a-41e3-2f3776761508.png)

+ 深刻度"DISASTER"用のtrigger設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/60da3f04-fb35-9b18-aa4e-bc3712c1d4b8.png)

# 検証

### (1)メッセージに"FileSizeZero"を含むトラップ(netSnmpExperimental)　⇒　深刻度「情報」
```ruby:テストトラップ(1)
snmptrap -v 2c -c public 127.0.0.1 '' netSnmpExperimental netSnmpExperimental.1 s "FileSizeZero"
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/88f268d1-62fe-5070-fa1d-23e86ee70381.png)

### (2)メッセージに"FileNotFound"を含むトラップ(netSnmpExperimental)　⇒　深刻度「致命的な障害」

```ruby:テストトラップ(2)
snmptrap -v 2c -c public 127.0.0.1 '' netSnmpExperimental netSnmpExperimental.1 s "FileNotFound"
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/e714a9b9-c11f-ddab-1da6-424290e62423.png)


### (3)メッセージに"UnknownError"を含むトラップ(netSnmpExperimental)　⇒　深刻度「致命的な障害」

```ruby:テストトラップ(3)
snmptrap -v 2c -c public 127.0.0.1 '' netSnmpExperimental netSnmpExperimental.1 s "UnknownError"
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/a87d5575-a2ca-0954-a93e-f4e0b90d6b6a.png)

# まとめ
Zabbix触りたての頃、私はZabbixにSNMPTRAPを処理させる時に、itemのsnmptrap[]内にトラップ名称(linkUp等々)を記載していた。
これはこれで正確に記載できるが、ここには深刻度(information/warning/disaster等)を記載したほうが管理しやすいと考え、切り替えた経緯があります。
今回のようにSNMPTRAP条件分岐を実現するために、ZABBIXのITEM/TRIGGERよりもSNMPTT機能を活用するほうが容易で強力に感じたので、記事にしてみました。