Zabbix监控redis status

时间:2023-02-20 20:17:03

概述

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

Zabbix监控redis status

item prototypes

Zabbix监控redis status

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的更多相关文章

  1. Zabbix 监控redis

    Zabbix 监控redis 1.监控脚本,github上的 [root@localhost ~]# cat /etc/zabbix/script/redis-status.sh #!/bin/bas ...

  2. Zabbix监控nginx-rtmp status(json版)

    与前面的文章 zabbix监控nginx-rtmp status(html版)区别只在于取值的页面不一样 http://127.0.0.1:81/control/get/all_streams sta ...

  3. Zabbix应用六&colon;Zabbix监控Redis

    利用Zabbix监控Redis Zabbix监控redis就比较简单了,因为zabbix官方提供了监控redis的模版和脚本,而且脚本有nodejs和python两种,下载地址:https://git ...

  4. 01:zabbix监控redis

    一.zabbix 自动发现并监控redis多实例 1.1 编写脚本 1.1.1 redis_low_discovery.sh 用于发现redis多实例 [root@redis02 homed]# ca ...

  5. (十二)zabbix监控redis

    1)agent端配置 安装redis yum install epel-release -y yum install redis -y 配置认证密码 #vim /etc/redis.conf requ ...

  6. Zabbix监控php-fpm status

    开启php-fpm status php-fpm.conf pm.status_path = /statusx45 nginx.conf location ~ /(statusx45)$ { incl ...

  7. Zabbix监控nginx status

    nginx开启status ./configure --with-http_stub_status_module nginx.conflocation /statusx35 { stub_status ...

  8. Zabbix监控nginx-rtmp status(html版)

    nginx-rtmp开启stats # nginx(--add-module=nginx-rtmp-module-master) nginx.conf: server { listen ; locat ...

  9. zabbix 监控 redis

    redis  可以直接使用zabbix官方的模板 模板地址: https://github.com/blacked/zbx_redis_template redis 主机通过脚本把数据推送到zabbi ...

随机推荐

  1. string&period;Format格式化用法详解

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...

  2. 课程上线 -&OpenCurlyDoubleQuote;新手入门 &colon; Windows Phone 8&period;1 开发”

    经过近1个月的准备和录制,“新手入门 : Windows Phone 8.1 开发”系列课程已经在Microsoft 虚拟学院上线,链接地址为:http://www.microsoftvirtuala ...

  3. php基础15:表单验证

    <?php $nameError=$emailError=$genderError=$websiteError=""; $name=$email=$gender=$comme ...

  4. java代码中后台向前台传递list或map集合案例

    导入jar包 新建一个servert传递map集合 ajax.java代码: package servlet; import java.io.IOException; import java.io.P ...

  5. MySQL数据库中的触发器

    --触发器是一类特殊的监控增删改操作,并产生相应的增删改的操作 --1,监视谁 2,监视动作 3,监视时间(之前或之后) 4,触发的事件 --触发器的简单语法 create trigger 触发器名字 ...

  6. UVA&lowbar;埃及分数&lpar;Hard Version&rpar; UVA 12588

    Problem EEg[y]ptian Fractions (HARD version)Given a fraction a/b, write it as a sum of different Egy ...

  7. 阅读《大数据》Tuzipeizhe

    一本好书.4/5明星. 内容:引进美国和信息,相关历史资料.从建国,为了连任奥巴马. 它是引入大型数据在美国,如何从头开始. 的流逝,到近期几年.这股影响美国的大数据 是怎样走入世界,影响各国的. 英 ...

  8. python之分析decode、encode、unicode编码转换

    decode()方法使用注册编码的编解码器的字符串进行解码.它默认为默认的字符串编码.decode函数可以将一个普通字符串转换为unicode对象.decode是将普通字符串按照参数中的编码格式进行解 ...

  9. 【Scala篇】--Scala中的函数

    一.前述 Scala中的函数还是比较重要的,所以本文章把Scala中可能用到的函数列举如下,并做详细说明. 二.具体函数 1.Scala函数的定义 def fun (a: Int , b: Int ) ...

  10. Oracle学习——dmp文件&lpar;表&rpar;导入与导出

    Oracle学习——dmp文件(表)导入与导出 2014-12-28      0个评论    来源:张文康 廊坊师范学院信息技术提高班 第九期   收藏    我要投稿 前言 关于dmp文件我们用的 ...