134564 发表于 2014-11-28 09:57:37

zabbix 自定义LLD

线上部分实时job是用storm开发的,为了监控数据的延迟,在storm处理日志的时候会把日志的时间插入到redis中,然后通过zabbix做延迟的监控。由于经常有新的job上线,手动配置监控项就变得比较麻烦,为了解放生产力,还是需要搞成自动化。
之前添加网卡和分区监控的时候用了LLD的功能,并用了其内置的宏变量,新版本的zabbix是支持custom LLD的,实现步骤如下:
1.在模板中设置一个discovery rule ( UserParameterKey),调用脚本,返回zabbix规定的json数据(返回自定义的宏变量),并正确设置的discovery(比如filter等)
这里通过官方文档并结合线上的agent日志,可以看到zabbix规定的数据格式

1
2
3
4
5
6
7
8
9
10
11
12
143085:20141127:000548.967 Requested
143085:20141127:000548.967 Sending back [{
      "data":[
                {
                        "{#FSNAME}":"\/",
                        "{#FSTYPE}":"rootfs"},
                {
                        "{#FSNAME}":"\/proc\/sys\/fs\/binfmt_misc",
                        "{#FSTYPE}":"binfmt_misc"},
                {
                        "{#FSNAME}":"\/data",
                        "{#FSTYPE}":"ext4"}]}]




比如线上返回json数据的key:

1
UserParameter=storm.delay.discovery,python2.6 /apps/sh/zabbix_scripts/storm/storm_delay_discovery.py




并通过

1
zabbix_get-s 127.0.0.1 -k storm.delay.discovery




验证返回数据的准确性

storm_delay_discovery.py内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/usr/bin/python
import sys
import redis
import exceptions
import traceback
_hashtables = []
_continue = True
_alldict = {}
_alllist = []
class RedisException(Exception):
    def __init__(self, errorlog):
      self.errorlog = errorlog
    def __str__(self):
            return "error log is %s" % (self.errorlog)
            
def scan_one(cursor,conn):
    try:
      cursor_v =conn.scan(cursor)
      cursor_next = cursor_v
      cursor_value = cursor_v
      for line in cursor_value:
            if (line.startswith("com-vip-storm") or line.startswith("stormdelay_")) and str(line) != "stormdelay_riskcontroll":
                _hashtables.append(line)
            else:
                pass
      return cursor_next
    except Exception,e:
      raise RedisException(str(e))
      
def scan_all(conn):
    try:
      cursor1 = scan_one('0',conn)
      global _continue
      while _continue:
            cursor2 = scan_one(cursor1,conn)
            if int(cursor2) == 0:
                _continue = False
            else:
                cursor1 = cursor2
                _continue = True
    except Exception,e:
      raise RedisException(str(e))
def hget_fields(conn,hashname):
      onedict = {}
      fields = conn.hkeys(hashname)
      for field in fields:
            onedict["{#STORMHASHNAME}"] = hashname
            onedict["{#STORMHASHFIELD}"] = field
      _alllist.append(onedict)
if __name__ == '__main__':
    try:
      r=redis.StrictRedis(host='xxxx', port=xxx, db=0)
      scan_all(r)
      for hashtable in _hashtables:
                hget_fields(r,hashtable)
      _alldict["data"] = _alllist
      print str(_alldict).replace("'",'"')
    except Exception,e:
      print-1





2.设置item/graph/trigger prototypes:
这里以item为例,定义item prototypes (同样需要定义key),key的参数为宏变量
比如Free inodes on {#FSNAME} (percentage)--->vfs.fs.inode[{#FSNAME},pfree]
本例中,在item中使用上面返回的宏变量即可,

1
storm_delay




最后,把包含LLD的template链接到host上即可。
最后再配合screen.create/screenitem.update api就可以实现监控添加/screen添加,更新的自动化了
页: [1]
查看完整版本: zabbix 自定义LLD