collectd的python插件(redis)
https://blog.dbrgn.ch/2017/3/10/write-a-collectd-python-plugin/

redis_info.conf
<LoadPlugin python>
Globals true
</LoadPlugin>
<Plugin python>
ModulePath "/opt/redis-collectd-plugin"
Import "redis_info"'
<Module redis_info>
Host "10.105.225.8"
Port 6379
Password "@sentinel"
sentinel_port 26379
sentinel_name mymaster
Redis_redis_alive "gauge"
Redis_sentinel_alive "gauge"
Redis_connected_clients "gauge"
Redis_blocked_clients "gauge"
Redis_rejected_connections "counter"
Redis_expired_keys "counter"
Redis_evicted_keys "counter"
Redis_used_memory "gauge"
Redis_used_memory_rss "gauge"
Redis_maxmemory "gauge"
Redis_mem_used_ratio "gauge"
Redis_mem_fragmentation_ratio "gauge"
Redis_instantaneous_ops_per_sec "gauge"
Redis_total_connections_received "counter"
Redis_total_commands_processed "counter"
Redis_keyspace_hits "derive"
Redis_keyspace_misses "derive"
Redis_cmdstat_get_calls "counter"
Redis_cmdstat_set_calls "counter"
Redis_db0_keys "gauge"
Redis_db0_expires "gauge"
</Module>
<Module redis_info>
Host "10.105.223.86"
Port 6379
Password "@sentinel"
sentinel_port 26379
sentinel_name mymaster
Redis_redis_alive "gauge"
Redis_sentinel_alive "gauge"
Redis_connected_clients "gauge"
Redis_blocked_clients "gauge"
Redis_rejected_connections "counter"
Redis_expired_keys "counter"
Redis_evicted_keys "counter"
Redis_used_memory "gauge"
Redis_used_memory_rss "gauge"
Redis_maxmemory "gauge"
Redis_mem_used_ratio "gauge"
Redis_mem_fragmentation_ratio "gauge"
Redis_instantaneous_ops_per_sec "gauge"
Redis_total_connections_received "counter"
Redis_total_commands_processed "counter"
Redis_keyspace_hits "derive"
Redis_keyspace_misses "derive"
Redis_cmdstat_get_calls "counter"
Redis_cmdstat_set_calls "counter"
Redis_db0_keys "gauge"
Redis_db0_expires "gauge"
</Module>
</Plugin>
redis_info.py
# -*- coding: utf-8 -*-
import collectd
import redis
from redis.sentinel import Sentinel
import re
import json
CONFIG = []
def configure_callback(config):
host = '127.0.0.1'
port = 6379
password = '@sentinel'
sentinel_port = 26379
sentinel_name = 'mymaster'
redis_info = {}
for node in config.children:
k, v = node.key, node.values[0]
match = re.search(r'Redis_(.*)$', k, re.M|re.I)
if k == 'Host':
host = v
elif k == 'Port':
port = int(v)
elif k == 'Password':
password = v
elif k == 'Sentinel_port':
sentinel_port = int(v)
elif k == 'Sentinel_name':
sentinel_name = v
elif match:
redis_info[match.group(1)] = v
else:
collectd.warning('unknown config key: %s' % (k))
CONFIG.append({'host': host, 'port': port, 'password': password, 'sentinel_port': sentinel_port, 'sentinel_name': sentinel_name, 'redis_info': redis_info})
def fetch_redis_info(conf):
info = {}
# 获取redis状态信息(0 dead, 1 master, -1 slave)
try:
r = redis.Redis(host=conf['host'], port=conf['port'], password=conf['password'], socket_connect_timeout=5)
for k, v in r.info().items():
if k in conf['redis_info'].keys():
info[k] = v
elif k.startswith('db'):
for i in ['keys','expires']:
info[k+'_'+i] = v[i]
elif k == 'role':
if v == 'master':
info['redis_alive'] = 1
else:
info['redis_alive'] = -1
if info['maxmemory'] > 0:
info['mem_used_ratio'] = round(float(info['used_memory'])/float(info['maxmemory'])*100, 2)
else:
info['mem_used_ratio'] = 0
for k, v in r.info('commandstats').items():
if k+'_calls' in conf['redis_info'].keys():
info[k+'_calls'] = v['calls']
except redis.RedisError as e:
collectd.error('redis %s:%s connection error!' % (conf['host'], conf['port']))
info['redis_alive'] = 0
# 获取sentinel状态信息 (0 dead, 1 leader, -1 leaf)
try:
s = Sentinel([(conf['host'], conf['sentinel_port'])], socket_timeout=0.1)
if conf['host'] == s.discover_master(conf['sentinel_name'])[0]:
info['sentinel_alive'] = 1
else:
info['sentinel_alive'] = -1
except redis.RedisError as e:
collectd.error('sentinel %s:%s connection error!' % (conf['host'], conf['sentinel_port']))
info['sentinel_alive'] = 0
return info
def read_callback():
for conf in CONFIG:
info = fetch_redis_info(conf)
#collectd.info('[%s] %s' % (conf['host'], json.dumps(info)))
plugin_instance = '%s:%d' % (conf['host'], conf['port'])
for k, v in info.items():
if k in conf['redis_info'].keys():
dispatch_value(k, v, conf['redis_info'][k], plugin_instance)
def dispatch_value(key, value, type, plugin_instance):
val = collectd.Values(plugin='redis_info')
val.type = type
val.type_instance = key
val.plugin_instance = plugin_instance
val.values = [value]
val.dispatch()
#注册回调函数
collectd.register_config(configure_callback)
collectd.register_read(read_callback)
collectd的python插件(redis)的更多相关文章
- Python操作Redis(一)
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...
- python中redis
一.简介 二.redis的安装和使用 三.python操作readis之安装和支持存储类型 四.python操作redis值普通链接 五.python操作redis值连接池 六.操作之String操作 ...
- python之redis和memcache操作
Redis 教程 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据 ...
- Python—操作redis
Python操作redis 连接方式:点击 1.String 操作 redis中的String在在内存中按照一个name对应一个value来存储 set() #在Redis中设置值,默认不存在则创建, ...
- python——操作Redis
在使用django的websocket的时候,发现web请求和其他当前的django进程的内存是不共享的,猜测django的机制可能是每来一个web请求,就开启一个进程去与web进行交互,一次来达到利 ...
- 【python】Redis介绍及简单使用
一.redis redis是一个key-value存储系统.和 Memcached类似,它支持存储的value类型相对更多,包括string(字符串). list(链表).set(集合).zset(s ...
- python之 Redis
Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...
- Python操作Redis、Memcache、RabbitMQ、SQLAlchemy
Python操作 Redis.Memcache.RabbitMQ.SQLAlchemy redis介绍:redis是一个开源的,先进的KEY-VALUE存储,它通常被称为数据结构服务器,因为键可以包含 ...
- python之redis
Redis简单介绍 如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构 ...
随机推荐
- ajax乱码的问题
ajax 乱码情况与原因很多,本文只讲其中之一: 浏览器端正常的数据,用ajax提交到服务器上就乱码了. 当ajax的提交方式是get而不是post时,其所携带的数据不会被字符编码过滤器所拦截(事实上 ...
- js小仓库
1.千分位分隔符 const toDecimalMark = num => num.toLocaleString("en-US"); console.log(toDecima ...
- UML图及Visio 2010使用总结
1. 关于UML9种图的详细介绍: 参考链接A:UML 九种图详解 参考链接B:UML的九种图+包图 2. 深入探究类图: 类图间的关系:泛化 .继承.实现.依赖.关联.聚合.组合: 参考链接A:ht ...
- Centos6.5上安装sonarqube6.7.6
Centos6.5已经装备好,可以联网 sonarqube6.7.6下载地址:https://www.sonarqube.org/downloads/ 步骤: 安装MySQL5.7 MySQL详细的安 ...
- VMware Workstation pro14 虚拟机下安装CentOS6.5图文教程
1 启动VMware的画面 2.点击 创建新的虚拟机 3 选择 典型(推荐) 4 选择 稍后安装操作系统 5 选择客户机操作系统类型 6 设置虚拟机名称 和 安装路径 7 指定磁盘容量 8 点击 自定 ...
- orcale 之 多表查询
在以往的工作中我们不可能单一的从一张表中查询数据,而在开始设计数据库的时候,我们会把一些数据存放在不同的数据表中,因此往往需要从多个数据表中获取到我们想要的数据. 笛卡儿积 在学习这些之前我们先了解一 ...
- 本地IDC机房数据库容灾解决方案
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB 发表于云+社区专栏 作者介绍:李明,腾讯云数据库架构师华南区负责人,曾在某专业数据库服务商.51jo ...
- Java入门系列-19-泛型集合
集合 如何存储每天的新闻信息?每天的新闻总数是不固定的,太少浪费空间,太多空间不足. 如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象,可以使用Java集合框架. Java 集合框架提 ...
- [转]VS清除打开项目时的TFS版本控制提示
本文转自:http://www.cnblogs.com/weixing/p/5219294.html 对于曾经做过TFS版本控制的项目,在版本控制服务不可用的时候,依然会在每次打开项目的时候都提示:当 ...
- [转]ECMAScript 6 入门 -编程风格
本文转自:http://es6.ruanyifeng.com/#docs/style 编程风格 块级作用域 字符串 解构赋值 对象 数组 函数 Map结构 Class 模块 ESLint的使用 本章探 ...