博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zabbix 自定义LLD
阅读量:5977 次
发布时间:2019-06-20

本文共 3007 字,大约阅读时间需要 10 分钟。

线上部分实时job是用storm开发的,为了监控数据的延迟,在storm处理日志的时候会把日志的时间插入到redis中,然后通过zabbix做延迟的监控。由于经常有新的job上线,手动配置监控项就变得比较麻烦,为了解放生产力,还是需要搞成自动化。

之前添加网卡和分区监控的时候用了LLD的功能,并用了其内置的宏变量,新版本的zabbix是支持custom LLD的,实现步骤如下:

1.在模板中设置一个discovery rule ( UserParameter  Key),调用脚本,返回zabbix规定的json数据(返回自定义的宏变量),并正确设置的discovery(比如filter等)

这里通过官方文档并结合线上的agent日志,可以看到zabbix规定的数据格式

1
2
3
4
5
6
7
8
9
10
11
12
143085:20141127:000548.967 Requested [vfs.fs.discovery]
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
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/python2.6
#for storm job delay monitor auto discovery
#edit by ericni.ni
#2014-11-27
import 
sys
import 
redis
import 
exceptions
import 
traceback
 
_hashtables 
= 
[]
_continue 
= 
True
_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[
0
]
        
cursor_value 
= 
cursor_v[
1
]
        
for 
line 
in 
cursor_value:
            
if 
(line.startswith(
"com-vip-storm"
or 
line.startswith(
"stormdelay_"
)):
                
_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):
        
fields 
= 
conn.hkeys(hashname)
        
re 
= 
"["
        
#print "hashname %s"%(hashname)
        
#print fields
        
for 
field 
in 
fields:
            
aline 
= 
""
            
aline 
+
= 
"""{"{#STORMHASHNAME}": "%s", "{#STORMHASHFIELD}": "%s"}"""
%
(hashname,field)
            
_alllist.append(aline)
 
if 
__name__ 
=
= 
'__main__'
:
    
re 
= 
""
    
try
:
        
r
=
redis.StrictRedis(host
=
'xxx'
, port
=
xxx, db
=
0
)
        
scan_all(r)
        
for 
hashtable 
in 
_hashtables:
                
hget_fields(r,hashtable)
        
re 
+
= 
"""{"data": """
        
re 
+
= 
str
(_alllist).replace(
"'",'')
        
re += "}"
        
print re.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[hget,{
#STORMHASHNAME},{#STORMHASHFIELD}]

最后,把包含LLD的template链接到host上即可。

最后再配合screen.create/screenitem.update api就可以实现监控添加/screen添加,更新的自动化了。

本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1583536,如需转载请自行联系原作者

你可能感兴趣的文章
《Cisco IPv6网络实现技术(修订版)》一2.6 配置练习:使用Cisco路由器配置一个IPv6网络...
查看>>
《可穿戴创意设计:技术与时尚的融合》一一第2章 与可穿戴设备有关的故事...
查看>>
ruby动态new对象
查看>>
《JavaScript启示录》——导读
查看>>
如何让你的 Linux 系统干净整洁
查看>>
《JavaScript高效图形编程(修订版)》——6.10 用画布sprites取代DHTMLsprite
查看>>
Linux中grep命令的12个实践例子
查看>>
使用Docker Compose部署基于Sentinel的高可用Redis集群
查看>>
Mybatis 3学习笔记(一)
查看>>
MySQL · 引擎特性 · InnoDB COUNT(*) 优化(?)
查看>>
Guice系列之用户指南(十)
查看>>
树与森林的存储、遍历和树与森林的转换
查看>>
mongodb的读写分离
查看>>
Android自定义属性
查看>>
介绍几个好用的android自定义控件
查看>>
阿里云服务器 Windows连接不成功 提示“你的凭证不工作” 解决方法
查看>>
NVIDIA Jetson TK1学习与开发(八):图文详解OpenGL在Jetson TK1上的安装和使用
查看>>
【性能优化】直方图
查看>>
Visual C#之核心语言
查看>>
[J2ME]Nokia播放音乐时发生MediaException的解决办法
查看>>