はじめに
業務でZabbixから監視itemのデータを元に何か動作させるプログラムを開発していたのですが、
ヒストリデータはあるはずがなぜか監視データが取れなくなったので調査した話です。
これで数時間失ったので記事として記録に残します。ダレカノヤクニタテバ嬉しいです。
zabbixは3.0系です。
どういうことが起こったか
Zabbix api(item.get)で、とある監視データのlastvalueを取得。
監視hostを無効化したあと、しばらく取得し続けるとヒストリデータが7日の設定であるはずが、
1日後に取得できなくなりました(lastvalueの値が0となりました)。
先に結論
結果から、、ZBX_HISTORY_PERIOD
設定しましょう。
Zabbix api(item.get)のlastvalueに上記パラメータがあり、これが悪さをしていた。
設定方法は defines.inc.php というphpファイルに直書きするようです。
調査
取得監視itemの設定とその取得方法
- 取得監視itemの設定
設定名 | 値 |
---|---|
item名 | system.cpu.util[,idle] |
ヒストリ | 7d |
トレンド | 365d |
ステータス | Enabled |
↑ この設定から最低でも7日間はデータを取得できるはずです(でもできない)。
- 取得方法
- Zabbix api
item.get
で lastvalueを見て監視itemデータを取得 - 監視しているhostの監視状態を有効化から無効化に切り替え
- 監視しているhostをシャットダウン
- ちょうど1日間 監視itemデータ(lastvalue)をapiで取得し続ける
- Zabbix api
具体的には以下のような感じ
- 取得方法詳細
curl -sS -X POST http://<zabbix_host>/api_jsonrpc.php \
-H 'Content-Type: application/json-rpc' -d '
{
"jsonrpc": "2.0",
"method": "item.get",
"params": {
"output": ["key_", "lastvalue"],
"hostids": "<監視するhostid>",
"search": {
"key_": "system.cpu.util[,idle]"
},
"sortfield": "name"
},
"auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"id": 1
}'
- 1日流し続けた結果
{
"id": 1,
"jsonrpc": "2.0",
"result": [
{
"itemid": "23689",
"key_": "system.cpu.util[,idle]",
"lastvalue": "98.3248" ← とれてる
}
]
}
:
{
"id": 1,
"jsonrpc": "2.0",
"result": [
{
"itemid": "23689",
"key_": "system.cpu.util[,idle]",
"lastvalue": "98.3248" ← とれてる
}
]
}
: 監視host無効化してから1日経過
{
"id": 1,
"jsonrpc": "2.0",
"result": [
{
"itemid": "23689",
"key_": "system.cpu.util[,idle]",
"lastvalue": "0" ← ここで急に0になる
}
]
}
{
"id": 1,
"jsonrpc": "2.0",
"result": [
{
"itemid": "23689",
"key_": "system.cpu.util[,idle]",
"lastvalue": "0" ← 以降0になる
}
]
}
以下が被疑所となりました。
- ヒストリデータの設定が7dだがZabbix内の何かの設定で上書きされている
- 監視hostを無効化した場合、ヒストリ以外の他の設定でデータを残す期間が決まっている
- housekeepingがヒストリデータを削除している(可能性低)
と調べ続けたのですが、1日後、というキーワードに引っかからず、どれも外れ。違いました。
そもそもzabbix api item.getで実は1日間しかデータを参照してくれないのでは?と疑問に思い、apiの仕様を調査して見ました。
apiのI/Fでは特に取得範囲を設定するような箇所がなかったため、ダメ元でitem.getで取得しているlastvalueについて調べてみるとどうもZBX_HISTORY_PERIOD
という設定値に従うことが分かりました。。
ここにたどり着くのにどれだけ時間のかかったことか。
設定方法は defines.inc.php というphpファイルに直書きです。こんな分かりにくい所に設定があるなんて・・・itemのヒストリ設定はapiによっても設定が多岐に渡るようです
これを設定して item.getで lastvalueを 1d以上 取得することができました。
以上