collectd的python插件(redis)

https://blog.dbrgn.ch/2017/3/10/write-a-collectd-python-plugin/

564063-20180530180422665-941488538.png

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)
posted on 2018-04-25 15:58 北京涛子 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/liujitao79/p/8945310.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值