Zabbix监控redis status
概述
zabbix采用Trapper方式监控redis status
原理
redis-cli info命令得到redis服务器的统计信息,脚本对信息分两部分处理:
(1)# Keyspace部分为Zabbix agent,因为不确定db的数目所以此段的items也不确定,Zabbix server需要low level discovery(redis.discovery脚本)来确定db的数目以确定对redis服务器发起哪些items请求
(2)其余部分为Zabbix trapper,脚本整理这些信息并向Zabbix server发送(items要事先定义好)
配置
(1)Zabbix agent
low level discovery

item prototypes

userparameter_redis.conf
#Redis
UserParameter=redis.discovery,/m2odata/server/zabbix-agent/scripts/lld-redis.py -a password
UserParameter=redis[*],/m2odata/server/zabbix-agent/scripts/redis_zabbix.py $ $ $ -a password
lld-redis.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-
__author__ = 'pdd'
__date__ = '2016/11/28' ''' redis db low level discovery ''' import re
import json
import redis def discovery(host, port, password):
client = redis.StrictRedis(host=host, port=port, password=password)
server_info = client.info()
dbs = [('db%d' % x) for x in range(0,16) if ('db%d' % x) in server_info] # redis默认15个db
data = [{"{#DBNAME}": db} for db in dbs]
print(json.dumps({"data": data}, indent=4)) if __name__=='__main__':
host = '127.0.0.1'
port = 6379
password = 'password'
discovery(host, port, password)
(2)Zabbix trapper # 一分钟发送一次数据到Zabbix server
*/ * * * * /storage/server/zabbix-agent/scripts/redis_zabbix.py -a password
redis_zabbix.py
#!/usr/bin/python import redis, json, re, struct, time, socket, argparse parser = argparse.ArgumentParser(description='Zabbix Redis status script')
parser.add_argument('redis_hostname',nargs='?')
parser.add_argument('metric',nargs='?')
parser.add_argument('db',default='none',nargs='?')
parser.add_argument('-p','--port',dest='redis_port',action='store',help='Redis server port',default=6379,type=int)
parser.add_argument('-a','--auth',dest='redis_pass',action='store',help='Redis server pass',default=None)
args = parser.parse_args() zabbix_host = '127.0.0.1' #IP address of Zabbix Server
# Zabbix Server IP
zabbix_port = 10051 # Zabbix Server Port # Name of monitored server like it shows in zabbix web ui display
redis_hostname = args.redis_hostname if args.redis_hostname else socket.gethostname() class Metric(object):
def __init__(self, host, key, value, clock=None):
self.host = host
self.key = key
self.value = value
self.clock = clock def __repr__(self):
result = None
if self.clock is None:
result = 'Metric(%r, %r, %r)' % (self.host, self.key, self.value)
else:
result = 'Metric(%r, %r, %r, %r)' % (self.host, self.key, self.value, self.clock)
return result def send_to_zabbix(metrics, zabbix_host, zabbix_port):
result = None
j = json.dumps
metrics_data = []
for m in metrics:
clock = m.clock or ('%d' % time.time())
metrics_data.append(('{"host":%s,"key":%s,"value":%s,"clock":%s}') % (j(m.host), j(m.key), j(m.value), j(clock)))
json_data = ('{"request":"sender data","data":[%s]}') % (','.join(metrics_data))
data_len = struct.pack('<Q', len(json_data))
packet = 'ZBXD\x01'+ data_len + json_data # For debug:
#print(packet)
#print(':'.join(x.encode('hex') for x in packet))
try:
zabbix = socket.socket()
zabbix.connect((zabbix_host, zabbix_port))
zabbix.sendall(packet)
resp_hdr = _recv_all(zabbix, 13)
if not resp_hdr.startswith('ZBXD\x01') or len(resp_hdr) != 13:
print('Wrong zabbix response')
result = False
else:
resp_body_len = struct.unpack('<Q', resp_hdr[5:])[0]
resp_body = zabbix.recv(resp_body_len)
zabbix.close() resp = json.loads(resp_body)
# For debug
# print(resp)
if resp.get('response') == 'success':
result = True
else:
print('Got error from Zabbix: %s' % resp)
result = False
except:
print('Error while sending data to Zabbix')
result = False
finally:
return result def _recv_all(sock, count):
buf = ''
while len(buf)<count:
chunk = sock.recv(count-len(buf))
if not chunk:
return buf
buf += chunk
return buf def main():
if redis_hostname and args.metric:
client = redis.StrictRedis(host=redis_hostname, port=args.redis_port, password=args.redis_pass)
server_info = client.info() if args.metric:
if args.db and args.db in server_info.keys():
server_info['key_space_db_keys'] = server_info[args.db]['keys']
server_info['key_space_db_expires'] = server_info[args.db]['expires']
server_info['key_space_db_avg_ttl'] = server_info[args.db]['avg_ttl'] def list_key_space_db():
if args.db in server_info:
print(args.db)
else:
print('database_detect') def default():
if args.metric in server_info.keys():
print(server_info[args.metric]) {
'list_key_space_db': list_key_space_db,
}.get(args.metric, default)() else:
print('Not selected metric');
else:
client = redis.StrictRedis(host=redis_hostname, port=args.redis_port, password=args.redis_pass)
server_info = client.info() a = []
for i in server_info:
a.append(Metric(redis_hostname, ('redis[%s]' % i), server_info[i])) # Send packet to zabbix
send_to_zabbix(a, zabbix_host, zabbix_port) if __name__ == '__main__':
main()
参考:https://github.com/blacked/zbx_redis_template
Zabbix监控redis status的更多相关文章
- Zabbix 监控redis
Zabbix 监控redis 1.监控脚本,github上的 [root@localhost ~]# cat /etc/zabbix/script/redis-status.sh #!/bin/bas ...
- Zabbix监控nginx-rtmp status(json版)
与前面的文章 zabbix监控nginx-rtmp status(html版)区别只在于取值的页面不一样 http://127.0.0.1:81/control/get/all_streams sta ...
- Zabbix应用六:Zabbix监控Redis
利用Zabbix监控Redis Zabbix监控redis就比较简单了,因为zabbix官方提供了监控redis的模版和脚本,而且脚本有nodejs和python两种,下载地址:https://git ...
- 01:zabbix监控redis
一.zabbix 自动发现并监控redis多实例 1.1 编写脚本 1.1.1 redis_low_discovery.sh 用于发现redis多实例 [root@redis02 homed]# ca ...
- (十二)zabbix监控redis
1)agent端配置 安装redis yum install epel-release -y yum install redis -y 配置认证密码 #vim /etc/redis.conf requ ...
- Zabbix监控php-fpm status
开启php-fpm status php-fpm.conf pm.status_path = /statusx45 nginx.conf location ~ /(statusx45)$ { incl ...
- Zabbix监控nginx status
nginx开启status ./configure --with-http_stub_status_module nginx.conflocation /statusx35 { stub_status ...
- Zabbix监控nginx-rtmp status(html版)
nginx-rtmp开启stats # nginx(--add-module=nginx-rtmp-module-master) nginx.conf: server { listen ; locat ...
- zabbix 监控 redis
redis 可以直接使用zabbix官方的模板 模板地址: https://github.com/blacked/zbx_redis_template redis 主机通过脚本把数据推送到zabbi ...
随机推荐
- 关于docker
摘要: 最近很多阿里内部的同学和客户私信来咨询如何学习 Docker 技术.为此,我们列了一个路线图供大家学习Docker和阿里云容器服务.这个列表包含了一些社区的优秀资料和我们的原创文章.我们会随着 ...
- opts=opts | |{}
var opts=opts || {}这个语句是一个赋值或者初始化语句 该语句在opts已经被初始化过后opts的值不变,即执行var opts=opts这一部分. 当opts未被初始化,即typeo ...
- Golang Web开发时前端出现谜之空白换行的坑
在使用Golang做Web开发时,有时候渲染出来的模板在前台显示时会出现一些奇怪的空白换行,具体特征就是查看css样式表并没有相关定义的空白部分. 分析: 查看出现问题页面的网页源代码,复制空白换行部 ...
- Android Weekly Notes Issue #224
Android Weekly Issue #224 September 25th, 2016 Android Weekly Issue #224 本期内容包括: Google Play的pre-lau ...
- GreenDao2.2升级GreenDao3.0的适配之路
前言.为什么要升级到Greendao3.0? 1. 多人开发 以往的数据库建表建Dao等操作要新开一个module,在统一的地方管理数据库建表,现在可以直接写Entity.多人开发时自己管自己的Ent ...
- [转]HttpModule的认识
HttpModule是向实现类提供模块初始化和处置事件.当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于H ...
- UITableView点击每个Cell,Cell的子内容的收放
关于点击TableviewCell的子内容收放问题,拿到它的第一个思路就是, 方法一: 运用UITableview本身的代理来处理相应的展开收起: 1.代理:- (void)tableView:(UI ...
- 15-static和extern关键字1-对函数的作用
一.extern与函数 如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.ob ...
- Highchart基础教程-图表配置
一.图表容器: Highcharts 实例化中绑定容器的两种方式: 1.通过 dom 调用 highcharts() 函数的方式 $("#container").highchart ...
- 2016 DTCC(中国数据库技术大会)
上周去参加了2016 DTCC(数据库技术大会),会议总共持续3天,议题非常多,我这里搜集了最新的公开的PPT内容,有兴趣的同学可以下载看看,PPT合集下载链接为:http://pan.baidu.c ...