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

  1. Python操作Redis(一)

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  2. python中redis

    一.简介 二.redis的安装和使用 三.python操作readis之安装和支持存储类型 四.python操作redis值普通链接 五.python操作redis值连接池 六.操作之String操作 ...

  3. python之redis和memcache操作

    Redis 教程 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据 ...

  4. Python—操作redis

    Python操作redis 连接方式:点击 1.String 操作 redis中的String在在内存中按照一个name对应一个value来存储 set() #在Redis中设置值,默认不存在则创建, ...

  5. python——操作Redis

    在使用django的websocket的时候,发现web请求和其他当前的django进程的内存是不共享的,猜测django的机制可能是每来一个web请求,就开启一个进程去与web进行交互,一次来达到利 ...

  6. 【python】Redis介绍及简单使用

    一.redis redis是一个key-value存储系统.和 Memcached类似,它支持存储的value类型相对更多,包括string(字符串). list(链表).set(集合).zset(s ...

  7. python之 Redis

    Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...

  8. Python操作Redis、Memcache、RabbitMQ、SQLAlchemy

    Python操作 Redis.Memcache.RabbitMQ.SQLAlchemy redis介绍:redis是一个开源的,先进的KEY-VALUE存储,它通常被称为数据结构服务器,因为键可以包含 ...

  9. python之redis

    Redis简单介绍 如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构 ...

随机推荐

  1. jsp基础知识总结

    1.了解jsp,jsp有什么有利的,有什么弊端. jsp是serlet的扩展,在web应用中,每个jsp页面都会有servlet容器生产对应的servlet. jsp通过在标准的html页面中插入ja ...

  2. selenium 之Ran 0 tests in 0.000s

    from selenium import webdriverfrom time import ctime,sleepimport unittestclass TestLogin(unittest.Te ...

  3. Oracle pl/sql编程值控制结构

    以下测试案例均来自于scott方案,运行前请确保该方案解锁. 1.条件分支状语 pl/sql中提供了三种条件分支状语,分别是: if   then if   then   else if   then ...

  4. window下,nodejs 安装 http-server,开启命令行HTTP服务器

    第一步:http://nodejs.cn/  官网下载安装文件,安装nodejs: 第二步:运行中输入cmd进入命令行模式,输入  node -v ,显示版本号,代表安装成功: 第三步:在node命令 ...

  5. 014-CallbackServlet代码

    package ${enclosing_package}; import java.io.IOException; import java.util.ResourceBundle; import ja ...

  6. MySql的数据查询

    SELECT语句是最常用的查询语句,它的使用方式有些复杂,但功能却相当强大.SELECT语句的基本语法如下: select selection_list//要查询的内容,选择哪些列 from数据表名/ ...

  7. Visual Studio 2013复制项目

    在当前解决方案下复制项目的步骤: 1. 在硬盘存放代码的目录下将整个文件拷贝一份,修改文件夹名字,改成新的项目名称, 然后修改 *.csproj文件,名字必须与新项目名一致. 2. 在解决方案上右键 ...

  8. Spring Boot学习笔记-配置devtools实现热部署

    写在前面 Spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用. de ...

  9. Android OpenGL教程-第一课【转】

    第一课 快速的开始一个Android OpenGL项目 首先,读懂我们的教程,需要有android的初步基础,我们这里只是通过android提供的SDK,来进行OpenGL的学习,所以你必须先学习如何 ...

  10. android添加系统(服务、应用)

    1. 添加系统服务 1.1 添加方式1:(不加入servicemanager统一管理的) 看Android6.0.1 init.rc解析中的第2章和第3章 方式1: 1). 写一个测试脚本test.s ...