使用zabbix_sender主动发送监控数据到zabbix server

通常来讲,大部分的zabbix key都是预先在server端定义好抓取数据的行为(比如抓取脚本,时间间隔,单位),然后由server端按照这个行为去向agent索要数据,或者由agent按照这个行为往server端发送数据,但都逃不开“定时”这个概念,即抓取数据的时间间隔是固定的。有一种场景,需要监控的数据不是随时(比如cpu,load)都能拿到的,而是由某些程序不定时的产生(比如crontab,某些用户触发的数据),这时候再用常规的zabbix key解决起来就不是那么的优雅,而且很难做到实时,理想的做法应该是程序产生监控数据的同时便将数据发送到zabbix server,这种做法类似于大名鼎鼎的newrelic,通过在程序端部署agent,然后发送数据到newrelic服务器。甚幸,zabbix提供类似的功能来帮助我们完成这种需求。
zabbix_sender:
zabbix提供的二进制程序,可以用来发送数据到zabbix server,具体用法如下:

>>> zabbix_sender -z 10.0.0.1 -p 10051 -s "rs_solrmaster" -k "get_number_of_solr_index_update" -o 4
需要注意的是get_number_of_solr_index_update这个key是需要事先创建在rs_solrmaster这台主机上的,并且是zabbix trapper类型的,并且是zabbix trapper类型的,并且是zabbix trapper类型的。
#usage: zabbix_sender [-Vhv] {[-zpsI] -ko | [-zpI] -T -i  -r} [-c ]
#Options:
#  -c --config                    配置文件的绝对路径
#  -z --zabbix-server             zabbix server或者zabbix proxy的ip地址
#  -p --port                      zabbix server或者zabbix proxy的端口,默认是10051
#  -s --host                      主机名,指的是zabbix里配制的主机名
#  -I --source-address            源ip,干嘛使得
#  -k --key                       zabbix trapper key名字
#  -o --value                     需要发送的监控项值
#  -i --input-file <input type="text" />   通过文件的方式批量发送数据,每行一个纪录,格式为hostname,key,value,使用空格分割,如果hostname有空格,使用双引号。
>>> cat trapper_key.txt
"zabbix server" key1 10
"zabbix proxy" key2 20
10.0.0.2 key3 30
>>> zabbix_sender -z 10.0.0.1 -i trapper_key.txt
如此,我们便可以随时随地的向zabbix发送监控数据了,由于zabbix只提供了zabbix_sender这个二进制程序来发送数据,如果要在程序中调用,直接调用一个二进程程序是一种很丑陋的做法,那么有没有更优雅的办法呢(zabbix的api部分并没有trapper key的相关说明)。有,注意前方高能。
zabbix_sender跟zabbix_server的通信方式是tcp协议的,也就是说zabbix_sender发送给一个DATA段为固定格式的tcp数据包给zabbix_server,然后server端解析并处理请求。所以这个DATA段的数据格式如果能确定,那我们就可以使用程序来模拟zabbix_sender了。
先来看两篇文章:
zabbix sender协议的研究 | itnihao
zabbix sender 2.0 协议文档
从中可以整理出一个完整的zabbix_sender请求包的格式如下:
源端口 目标端口
32位序列号
32位确认号
4位首部长度 保留(6位) URG ACK PSH PST SYN FIN 16位窗口大小
16位校验和 16位紧急指针
可选项
Z B X D 协议版本 8位数据长度 请求或者响应的json数据
可以看到基本的zabbix_sender数据协议即为'Z''B''X''D' + 1位的协议版本号 + 8位的数据长度 + json数据组成,如文档,请求的json数据格式为:
{
        "request":"sender data",
        "data":[
                {
                        "host":"Host name 1",
                        "key":"item_key",
                        "value":"33"},
                {
                        "host":"Host name 2",
                        "key":"item_key",
                        "value":"55"
                }
        ]
}
这样,基本的程序逻辑就出来了,即为:
构建符合zabbix_sender协议的数据包,格式为 '4sBqns' (n为json串的长度)
发送数据包至zabbix_server的端口
处理响应
如下为一个python的实现示例:

#!/usr/bin/env python

import struct
import json
import socket

class zabbix_sender:
        def __init__(self,zbx_server_host,zbx_server_port):
                self.zbx_server_host=zbx_server_host
                self.zbx_server_port=zbx_server_port
                self.zbx_header='ZBXD'
                self.zbx_protocols_version=1
                self.zbx_send_value={'request':'sender data','data':[]}
        def adddata(self,host,key,value):
                add_data={'host':host,'key':key,'value':value}
                self.zbx_send_value['data'].append(add_data)
        #按照协议封装数据包
        def makesenddata(self):
                zbx_send_json=json.dumps(self.zbx_send_value)
                zbx_send_json_len=len(zbx_send_json)
                self.zbx_send_data=struct.pack("<4sBq"+str(zbx_send_json_len)+"s",'ZBXD',1,zbx_send_json_len,zbx_send_json)
        def send(self):
                self.makesenddata()
                zbx_server_socket=socket.socket()
                zbx_server_socket.connect((self.zbx_server_host,self.zbx_server_port))
                zbx_server_write_df=zbx_server_socket.makefile('wb')
                zbx_server_write_df.write(self.zbx_send_data)
                zbx_server_write_df.close()
                zbx_server_read_df=zbx_server_socket.makefile('rb')
                zbx_response_package=zbx_server_read_df.read()
                zbx_server_read_df.close()
                #按照协议解数据包
                zbx_response_data=struct.unpack("<4sBq"+str(len(zbx_response_package) - struct.calcsize("<4sBq"))+"s",zbx_response_package)
                return zbx_response_data[3]

if __name__ == '__main__':
        zabbix_sender=zabbix_sender('10.0.0.1',10051)
        zabbix_sender.adddata('solrmaster','get_number_of_solr_index_update',60)
        response=zabbix_sender.send()
        print response

时间: 2024-11-08 20:39:07

使用zabbix_sender主动发送监控数据到zabbix server的相关文章

Zabbix与RRDtool绘图篇之用ZabbixAPI取监控数据

一起来看一个Zabbix与RRDtool绘图篇之用ZabbixAPI取监控数据技巧文章,希望下文可以帮助到各位. 经过一个星期的死磕,Zabbix取数据和RRDtool绘图都弄清楚了,做第一运维平台的时候绘图取数据是直接从Zabbix的数据库取的,显得有点笨拙,不过借此也了解了Zabbix数据库结构还是有不少的收获. 学习Zabbix的API官方文档少不了,官方文档地址链接https://www.zabbix.com/documentation/ 大家选择对应的版本就好了,不过2.0版本的API

RHEL6.3下Zabbix监控实践之Zabbix的安装

RHEL6.3 i386 zabbix 2.0.3 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供柔软的通知机制以让系统管理员快速定位/解决存在的各种问题.   zabbix由2部分构成,zabbixserver与可选组件zabbix agent. zabbix server可以通过SNMP,zabbix agent,ping,端口监视等方法提供对远程服务器/网络状态的监视,数据收集等

点击发布按钮,如何用ajax发送这些数据到后台,希望有源码

问题描述 点击发布按钮,如何用ajax发送这些数据到后台,希望有源码 mg.ask.csdn.net/upload/201512/10/1449737844_583917.png) 如何点击发布使用ajax发送到后台这么多数据,我只能发送一行的数据,所有行的要怎么发,后台要如何接收 //第一行数据 var _tr = $("tbody tr:eq(0)"); var sortNum = _tr.children().eq(0).text(); var photoId = _tr.chi

iocp-C# IOCP模式下服务器主动发送消息

问题描述 C# IOCP模式下服务器主动发送消息 http://blog.csdn.net/zhujunxxxxx/article/details/43573879 服务器端代码是参考这篇帖子的. 我想要实现,按下按钮,然后往所有当前连接上的客户端发送数据. 但是从SocketAsyncEventArgsPool 对象池里pop一个SocketAsyncEventArgs e,然后发送数据. 发送函数里的Socket s = e.AcceptSocket会出现未实例化的错误. 发送函数如下 pu

容易被站长忽视的内容:主动访问用户数据

百度站长平台发布了<容易被站长忽视的内容:主动访问用户数据>,对于主动访问用户来说,也就是大家一直提到的忠诚用户.对于大部分品牌站来说,都形成了自己的口碑,都有了自己的核心用户群体.那么对于普通的站长朋友们,是否去关注过自己的忠诚用户(主动访问用户)? 如果关注过百度搜索引擎优化指南的朋友应该看到过指南中强调的品牌观念:最低层次,让用户知道他所获取的内容来自你的网站;进阶,让用户下次再想找这个信息时,能想到你的网站;最终,能让用户在找同类内容时,能第一时间想到你的网站.今天站长平台发布的消息也

后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法_AngularJS

1.问题: 后端接收不到AngularJs中$http.post发送的数据,总是显示为null 示例代码: $http.post(/admin/KeyValue/GetListByPage, { pageindex: 1, pagesize: 8 }) .success(function(){ alert("Mr靖"); }); 代码没有错,但是在后台却接收不到数据,这是为什么呢? 用火狐监控:参数是JSON格式 用谷歌监控:传参方式是request payload 可以发现传参方式是

php版微信开发主动发送实例

为了方便调试用CLI方式作测试,记得代码中替换你的appid和appsecret: 比如我们想取公众号的组数据: if (isset($argc)  && $argc >= 1 && $argv[0] == __FILE__) {     $client = new WechatJSON(array(         WechatJSON::APP_ID => 'wx78acfe8257asDb1',         WechatJSON::APP_SECRET

基于表格存储的高性能监控数据存储计算方案

概述         随着软件架构的愈发复杂,了解系统现状.调查问题的困难度也增加了很多.此时,一套完善的监控方案能够让开发和运维工程师快速排查问题,更好的维护系统的稳定性.        开源监控方案中,Zabbix.Nagios都是不错的监控软件,可以针对数十万的设备监控数百万的指标,强大的功能让开发和运维都很赞叹.但是,网上经常看到的抱怨是其写入和存储能力的不足,以Zabbix为例,文章[1]提到使用NoSQL方案(HBase.Cassandra.Riak)比利用传统RDBMS方案(MyS

如何更好地监控数据中心

企业希望在难题出现之前,智能分析功能可以将企业的系统监控提升到一个全新的水平. 如今,适当进行产能规划以保持平稳运行,是IT部门一个非常重要的能力.除了实现IT目标和业务目标以外,它可以帮助维持企业的IT基础设施,而这时,系统性问题出现了. 对于那些关键的时刻,企业必须有一个良好的数据中心基础设施管理(DCIM)策略,可以防止系统停机,并迅速采取行动,这可能会对企业的声誉和收入产生深刻的负面影响.但是,企业将如何从被动到主动,并改变其方法,从而减少昂贵的错误和崩溃的机会,他们有机会出现吗?当它涉