計算アイテムにおけるlast関数が扱う値について

お世話になります。

SNMPを用いて収集した値を元に、計算アイテムでlast関数を用いて値を算出しています。
例えばメモリ利用率を取得したい場合は、

①UsedMemory(タイプ:SNMP)
②MemorySize(タイプ:SNMP)

の2つのアイテムをSNMPで収集し、計算アイテムとして

③last("①UsedMemory") / last("②MemorySize") * 100

という式でメモリ利用率を算出しています。

このとき、通信断などによりSNMPで値が収集できなかった場合、それぞれの値を
最新データから確認すると、

・①と②は、通信断が発生していた間のデータが欠落
・③は、データが欠落しない

となっておりました。

このことから、③で利用しているlast関数というのは、タイムスタンプが更新されている
いないに関わらず、"取得できていた最新の値"を利用しているようですが、
合っていますでしょうか?

元データとなる①と②が収集できなかった場合、"最新の値"が存在しない状態であり、
③も計算できずに値を保持しないようにしたいです。
このような動きをさせるために式で利用できる関数はないようですが、その通りでしょうか?

よろしくお願いいたします。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー heya の写真

こんにちは。

どちらも未確認ですが・・・。

>このことから、③で利用しているlast関数というのは、タイムスタンプが更新されている
>いないに関わらず、"取得できていた最新の値"を利用しているようですが、
>合っていますでしょうか?
確かそうだったと思います。

>このような動きをさせるために式で利用できる関数はないようですが、その通りでしょうか?
こっちは、1-nodata() で割ったらどうですかね。えらく変な方法ですが。
https://www.zabbix.com/documentation/2.2/manual/config/items/itemtypes/c...
A calculated item may become unsupported in several cases:
1. referenced item(s) not found
2. no data to calculate a function
3. division by zero
4. incorrect syntax used
値が取れなければ nodata() は 1 に、取れれば 0 になるので、1 からその値を引くと 0/1 が逆になって、値が取れなければ 0 で割ることになり、むりやり↑の 3 に該当させるということです(値が取れれば 1 で割るので計算結果は変わらない)。

もっとスマートな方法があればお願いします。>他の方々

heya様

お世話になっております。

回答いただき、ありがとうございました。
返信が遅れてしまい、申し訳ありません。

1-nodata()を利用する方法を本日試してみました。
想定通りのグラフを生成することができました。

ただ、計算アイテムの式がどうしても複雑になってしまいます。
もっとスマートな方法が他にあれば、ぜひご教授いただいたいです。

引き続きよろしくお願いいたします。

ユーザー fripper の写真

試してみてはいないので、うまくいかなければ申し訳ないのですが‥

データ取得側のアイテム(SNMPと仰られているもの)の取得間隔が、仮に600 sec だったとして‥

avg(アイテムキー,600,1)

などのように、敢えて集計系のアイテムを、タイムシフト指定つき(だけどタイムシフト幅は小さく、
集計の範囲を、アイテム側の取得幅にあわせてみる‥

といった形で、「1 秒前から 過去 600 秒の範囲に取得されているデータの平均値」
→ どう頑張っても、その時間範囲だと値は1個なので平均を計算しても、元の値と同じ
→ なおかつ、データ収集が失敗していたら、当該時間範囲にはデータが無い

→ 素データがなければ、計算アイテム側もデータなしに‥なってくれるといいなぁ

というアイディアですが‥、いかがでしょうか?

#試せておらず、申し訳ありません‥少し思いついたので‥