【ZabbixAPI】trend.getやhistory.getでのvalue累計値の算出について
snmpで取得したルータのアウトバウンド流量(ポートごと)を、ZabbixAPIを用いて、指定した期間(1hや1ヶ月、指定日から現在まで、など)の累計値の出力を行いたいと考えています。長文で恐縮ですが、以下の質問にご回答いただけないでしょうか。
■Zabbixサーバ情報
インストールサーバ:CentOS 7.4
バージョン:3.0
■ZabbixAPI発行サーバ
OS:CentOS 7.4
コマンド:curl
■発行するZabbixAPI
trend.get
history.get
■API発行対象(get対象)のアイテムのプロトタイプ(snmp)
snmp_oid ifHCOutOctets
データ型 数値(整数)
データ形式 10進数
単位 bps
乗数を使用 8
更新間隔 60秒
保存時の計算 差分/時間
■質問①
アイテムのプロトタイプのパラメータ「保存時の計算 差分/時間」とは、以下のような考え方であっているでしょうか
例1)
取得するカウンタ値:600bit ※前回取得した値との差分をZabbixが計算してくれる
取得間隔(前回取得からの経過時間):60秒
保存する値:10bps
例2)
流量カウンタ差分:1200bit ※前回取得した値との差分をZabbixが計算してくれる
取得間隔:120秒 ※前回の取得が失敗していた場合
保存する値:10bps
■質問②
以下の様なtrend.getコマンドと応答結果についての確認です。
①トレンドデータは1hの平均値ですが、この場合の1hの累計流量は、value_avg(bps)×60(秒)×60(分)=151200bit でよいでしょうか
②numの値が60未満だった場合(毎分の流量取得が欠けていた場合)も、value_avgは単位がbpsのため、1hの累計流量は value_avg(bps)×60(秒)×60(分) のままでよいでしょうか
③trend.getのオプションなどで、1hの平均値(value_avg)ではなく、1hの累計値を出力するようなものはないでしょうか
curl -sS -X GET -H "Content-Type:application/json-rpc" -d '{"auth":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "method":"trend.get", "id":1, "params":{"output":"extend", "itemids":"xxxxx", "limit":"1"}, "jsonrpc":"2.0"}' http://xxx.xxx.xxx.xxx/zabbix/api_jsonrpc.php | jq '.'
{
"jsonrpc": "2.0",
"result": [
{
"itemid": "24301",
"clock": "1513569600",
"num": "60",
"value_min": "0",
"value_avg": "42",
"value_max": "176"
}
],
"id": 1
}
■質問③
以下の様なhistory.getコマンドと応答結果についての確認です。
①history.getのオプションなどで、全resultのvalueの合計値を出力するようなものはないでしょうか
curl -sS -X GET -H "Content-Type:application/json-rpc" -d '{"auth":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "method":"history.get", "id":1, "params":{"output":"extend", "history": 3, "itemids":"xxxxx", "sortfield":"clock", "limit": 2}, "jsonrpc":"2.0"}' http://xxx.xxx.xxx.xxx/zabbix/api_jsonrpc.php | jq '.'
{
"jsonrpc": "2.0",
"result": [
{
"itemid": "24301",
"clock": "1513907701",
"value": "42",
"ns": "754020797"
},
{
"itemid": "24301",
"clock": "1513907761",
"value": "80",
"ns": "935395370"
}
],
"id": 1
}
■質問④
trend.getやhistory.get以外で、「指定期間の累計値」を出力するようなZabbixAPIはないでしょうか
fripper - 投稿数: 495
>■質問②
>以下の様なtrend.getコマンドと応答結果についての確認です。
>①トレンドデータは1hの平均値ですが、この場合の1hの累計流量は、value_avg(bps)×60(秒)×60(分)=151200bit でよいでしょうか
value_avg が「42」となっていることから、42(bps)x60(sec)x60(min) で 151200 bits が
1時間の合計流量となる、で間違っていないと思います
>②numの値が60未満だった場合(毎分の流量取得が欠けていた場合)も、value_avgは単位がbpsのため、1hの累計流量は value_avg(bps)×60(秒)×60(分) のままでよいでしょうか
trends での値は、対象となる「1時間」の時間内に取得された値として DB 内に
記録されているものから算出されます
今回のように「差分/時間」として取得したアイテム値の場合は
たとえ1個・2個と欠落していた場合であっても
さらには、取得タイミングが負荷等の関係で多少前後しても
1.値の取得に成功→前回から 61 sec 経過→ 1 sec あたりの差分値として記録
2.値の取得に失敗
3.値の取得に成功→前回から 122 sec 経過→ 1 sec あたりの差分値として記録
といった形で、1 sec あたりの差分値をベースに DB 記録されているため
「value_avg(bps)×60(秒)×60(分)」の式で算出して良いと思います
>③trend.getのオプションなどで、1hの平均値(value_avg)ではなく、1hの累計値を出力するようなものはないでしょうか
trend.get が参照している DB 上のテーブルそのものが、該当時間枠内での件数を示す count と
value_avg, value_min, value_max の3項目から成り立っており、trend.get はそのテーブル上の
DB 上の値を返しているだけですので、累計合計値などを得られるような機能はありません
fripper - 投稿数: 495
> ■質問①
> アイテムのプロトタイプのパラメータ「保存時の計算 差分/時間」
あるタイミング(初回)で取得した値が 「600」で、その次のタイミングで取得した値が「1200」だった場合
(snmpget や snmpwalk 等コマンドで生の値として得られたものが上記の数値だったとすると)
SNMPにおけるifHCOutOctetsメトリクスの値はバイト単位となることから
アイテム設定「乗数:8」の設定に応じて、Zabbixとしては「4800」と「9600」と読み替えられます
(これによって、得られた値が bytes 単位から bits 単位へと読み替えられたこととなります)
そのうえで、さらにアイテム設定「差分/時間]」の設定によって
取得タイミング間の経過時間(60 sec)によって「9600-4800 = 4800」として差分値が計算され
2回目タイミングの時点における経過差分値が「4800」として特定されます
(「差分/時間」を設定した場合は、初回値はDBには記録されず、2回目以降が
前回との差分値としてはじめて有効な値となります)
(これで、60 sec 間に 4800 bits のデータが流れたことが特定される)
「差分/時間」として設定されていることから、前回取得からの経過時間(60 sec)でさらに計算され
「4800 / 60 = 80」として、DBには「80 bits / sec」として「80」が記録されることになります
60 sec の間に、まんべんなく 80 bits / sec のデータが流れ続けたのか
60 sec のうちのわずか2秒間に 2400 bits / sec のデータが流れ、残りは通信が全く無かったのかは判別つきません
単位が bytes なのか bits なのか、という点を除けば
「取得した時間間隔から、平均的な流量として差分値が記録される」という点については、ご理解いただいている通りで
間違いないと思います
fripper - 投稿数: 495
補足として
>trends での値は、対象となる「1時間」の時間内に取得された値として DB 内に
>記録されているものから算出されます
この処理は zabbix_server の trends 計算処理として
アイテム側の設定(「差分/時間」や「乗数」等の設定)とは無関係に
単に「1時間枠内の値として history 側に保存されている複数のデータ値を、まとめて1組のデータ化して trends へ集約する」が
実行されているだけとなります
今回のように「差分/時間」といった設定をしているアイテムの場合には、さほど気にする必要はないのですが、
そういった設定をすることがない通常のアイテム(cpu の load average 等)の場合には
欠落しているタイミングの分だけ、如実に演算精度が落ちる(瞬間的なピーク等を見逃す)点は注意が必要です
(それに気づけるようにするため、count 値が存在している、と考えてよいと思います)
fripper - 投稿数: 495
>■質問3
>history.getのオプションなどで、全resultのvalueの合計値を出力するようなものはないでしょうか
こちらも、trend.get と同じように、DB 上に history として保存されている値を返しているだけですので
累計合計値などを得られるような機能はありません
suwabec - 投稿数: 7
ご連絡遅くなり申し訳ありません。
また、丁寧にご回答いただきありがとうございます。
差分取得や流量計算の認識はあっていたこと、特定区間の累計値の算出はできないこと、等について理解を深めることが出来ました。
今回の回答をうけた方針としては、trend.getの仕様を利用して毎時でtrend.getを利用し、1時間ごとの平均流量(bps)に1時間をかけた値を合算することで、特定期間の累計流量を算出することにしようと思います。