zabbix2.2如何获取lastvalue?

什么是lastvalue

lastvalue是1.8和之前的版本中的item表中的一个字段,可以查询这个字段非常方便的

获取监控项的最新数据。

但在zabbix2.2中发现该字段被移除了,而我们原有的很多功能和脚本均依赖与这个字段,

导致我们升级到zabbix2.2之后很多功能无法正常使用。

zabbix2.2中如何获取lastvalue

研究了下发现有三种方法可以获取lastvalue:

  • zabbix API

  • 数据库中创建触发器

  • 构造sql语句查询

具体说下每种方法和优劣:

zabbix api

zabbix api 的item.get可以直接返回lastvalue和prevalue。

不得不说zabbix 官方的api在2.2版本中非常强大,所以获取lastvalue

这种小case的任务自然是分分钟就可以搞定的。

api获取lastvalue

数据库中创建触发器

这个dba的同学比较熟悉,真的测试我也没有进行,但确实是可行的。

构造sql语句查询

构造sql语句查询那就是回归到我们最早的办法啦。只不过lastvalue字段取消了,我们拼凑起来稍微费点劲。

经过一番研究,终于在页面这块的代码发现了可用的sql:

sql

简单解释下:

getTableName 会根据itemid获取该item的数据类型,不同的数据类型会存储在不同的history表中,

例如整形的会存放在history_uint表中。

因此这个函数会根据不同的itemid自动获取需要查询的表明。

h.clock 是我们重点需要关注的,time() – $period其实实现的就是利用当前的时间减去该item的更新频率,

这样刚好可以获取一个大于上上次但小于上一次更新时间的时间戳,

利用可以时间就可以获取了最新的一次数据,即lastvalue。

而$period其实也是可以通过itemid可以查询到的。

优缺点对比

  • API:

    推荐方式,api的优势就是可维护性很强,但性能比较差,不过还是推荐api方式,

    毕竟性能的问题可以通过别的方式来搞定的。

  • 数据库创建触发器:

    不建议采用,触发器会增加数据库额外的压力,但创建了lastvalue

    可以兼容原有的老脚本,老脚本几乎不用改动;

  • 构造sql语句:

    不建议使用,性能很高,但sql语句构建繁琐,需要知道item的数据类型和

    更新频率等,并且每次版本升级都有可能需要再次调整。

Leave a Reply

Your email address will not be published. Required fields are marked *


To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax