Search code examples
zabbix

How to calculate 20% change within one hour in Zabbix?


I have to compare two values changing in both directions (rising and falling) within an hour (items amount, for example). What formula may I use to calculate if the amount drops or rises on more than 20%? Does Zabbix calculated value support if conditions to support positive and negative change or it's possible to bypass it?

I'm trying to write something like this:

{api20prod:mysql.get_active_offers.count(0)}/{api20prod:mysql.get_active_offers.count(,,,1h)}*100 > 20

but what if mysql.get_active_offers.count(0) more than mysql.get_active_offers.count(,,,1h) ?


Solution

  • You cannot use a "Simple Change" preprocessor because:

    If the current value is smaller than the previous value, Zabbix discards that difference (stores nothing) and waits for another value.

    If you set the item with a 1h check interval (or with scheduled intervals at a specific minute of every hour), you can do the trick with the last() function.

    Let's say that at 12:00 your item equals 25 and at 13:00 it equals 38:

    • At 13:00 invoking last() without parameters will return 38
    • At 13:00 invoking last(#2) will return 25

    You can calculate the hourly readings delta % with:

    100 * ({api20prod:mysql.get_active_offers.last()} - {api20prod:mysql.get_active_offers.last(#2)}) / {api20prod:mysql.get_active_offers.last(#2)}
    

    This syntax should work either in a trigger or in a calculated item, choose the one that suits you better: I suggest a calculated item.

    Of course, your trigger will have a double condition: you need to match "> 20" OR "< -20"

    If you don't want to change the item's check interval you can use the avg() function, see the documentation.