zabbix示例之监控Redis状态(九)
监控redis也是通过info信息来监控redis的状态:https://blog.51niux.com/?id=130 #此链接里面有info信息各参数的意思
一、 zabbix监控单实例redis(通过自动发现的方式)
#这种方式呢也是不太推荐的一种方式,虽然比较省事,但是在出图上面就有点麻烦了,这里脚本格式就不写的那么严谨了。
1.1 客户端的配置
自动发现脚本编写:
# cat /etc/zabbix/scripts/redis_parameter #自动发现redis脚本参数的脚本
#!/bin/bash /usr/local/bin/redis-cli -p 3000 -a redis66cs "info">/home/zabbix/tmp/info.txt cat /tmp/info.txt |grep -v "^#"|awk -F ":" {'print $1'}|grep -v [[:space:]] >/home/zabbix/tmp/info_parameter Redis_parameter_discovery () { Redis_Site=`cat /home/zabbix/tmp/info_parameter` Redis_Site_Num=`echo ${Redis_Site}|awk {'print NF'}` Redis_Site_parameter=($Redis_Site) printf '{\n' printf '\t"data":[\n' for((i=0;i<${Redis_Site_Num};i++)) { if [ `expr $i + 1 ` != ${Redis_Site_Num} ];then printf "\t{\"{#SITENAME}\":\"${Redis_Site_parameter[$i]}\"},\n" else printf "\t{\"{#SITENAME}\":\"${Redis_Site_parameter[$i]}\"}\n" fi } printf '\t]\n' printf '}\n' } case "$1" in redis_parameter_discovery) Redis_parameter_discovery ;; *) echo "Usage:$0 redis_parameter_discovery" ;; esac
#这是是根据之前写的硬盘自动发现。网卡自动发现的脚本改的,这种就是将redis的info信息里面左边的参数名都提取出来输出为json格式。
创建上面脚本对应的目录和文件:
#mkdir /home/zabbix/tmp
#touch /home/zabbix/tmp/info.txt
#touch /home/zabbix/tmp/info_parameter
#chown -R zabbix:zabbix /home/zabbix
#chmod 777 /home/zabbix/tmp/{info.txt,info_parameter}
编写redis的info取值的脚本:
# cat /etc/zabbix/scripts/redis_info.sh #这个脚本就是根据自动发现传过来的info的参数名进行grep取值
#!/bin/bash /usr/local/bin/redis-cli -p 3000 -a redis66cs "info">/home/zabbix/tmp/info.txt Redis_Site=`cat /home/zabbix/tmp/info_parameter` Redis_info_value=$(grep "$1"\: /home/zabbix/tmp/info.txt|awk -F ":" {'print $NF'}) echo $Redis_info_value
#注意这里一定grep 一定要是"$1"\:这种以:结尾,比如:used_memory:和 used_memory_human:,会精确匹配而非模糊匹配
编写自定义的key:
# cat /etc/zabbix/zabbix_agentd.conf.d/redis_parameter_discovery.conf #redis.parameter.discovery就是我们自定义的key
UserParameter=redis.parameter.discovery,/etc/zabbix/scripts/redis_parameter redis_parameter_discovery
#redis.parameter.discovery这个key的作用就是调用redis_parameter这个脚本,将redis的所有info的参数名提取出来。
# cat /etc/zabbix/zabbix_agentd.conf.d/redis_info_value.conf #通过上面自动发现提取出来的参数名作为$1传递给下面的脚本
UserParameter=redis.info.value[*],/etc/zabbix/scripts/redis_info.sh $1
给对应的脚本授权:
#chown -R zabbix:zabbix /etc/zabbix/*
#chmod +x zabbix:zabbix /etc/zabbix/scripts/*
重启客户端服务:
#/etc/init.d/zabbix/zabbix_agentd restart
博文来自:www.51niux.com
1.2 zabbix_proxy代理的操作
#/usr/local/zabbix/bin/zabbix_get -s 192.168.14.56 -k redis.parameter.discovery #测试redis的自动发现info参数的脚本
{ "data":[ {"{#SITENAME}":"redis_version"}, {"{#SITENAME}":"redis_git_sha1"}, {"{#SITENAME}":"redis_git_dirty"}, {"{#SITENAME}":"redis_build_id"}, {"{#SITENAME}":"redis_mode"}, {"{#SITENAME}":"os"}, {"{#SITENAME}":"arch_bits"}, {"{#SITENAME}":"multiplexing_api"}, {"{#SITENAME}":"gcc_version"}, {"{#SITENAME}":"process_id"}, {"{#SITENAME}":"run_id"}, {"{#SITENAME}":"tcp_port"}, {"{#SITENAME}":"uptime_in_seconds"}, {"{#SITENAME}":"uptime_in_days"}, {"{#SITENAME}":"hz"}, {"{#SITENAME}":"lru_clock"}, {"{#SITENAME}":"executable"}, {"{#SITENAME}":"config_file"}, {"{#SITENAME}":"connected_clients"}, {"{#SITENAME}":"client_longest_output_list"}, {"{#SITENAME}":"client_biggest_input_buf"}, {"{#SITENAME}":"blocked_clients"}, {"{#SITENAME}":"used_memory"}, {"{#SITENAME}":"used_memory_human"}, {"{#SITENAME}":"used_memory_rss"}, {"{#SITENAME}":"used_memory_rss_human"}, {"{#SITENAME}":"used_memory_peak"}, {"{#SITENAME}":"used_memory_peak_human"}, {"{#SITENAME}":"total_system_memory"}, {"{#SITENAME}":"total_system_memory_human"}, {"{#SITENAME}":"used_memory_lua"}, {"{#SITENAME}":"used_memory_lua_human"}, {"{#SITENAME}":"maxmemory"}, {"{#SITENAME}":"maxmemory_human"}, {"{#SITENAME}":"maxmemory_policy"}, {"{#SITENAME}":"mem_fragmentation_ratio"}, {"{#SITENAME}":"mem_allocator"}, {"{#SITENAME}":"loading"}, {"{#SITENAME}":"rdb_changes_since_last_save"}, {"{#SITENAME}":"rdb_bgsave_in_progress"}, {"{#SITENAME}":"rdb_last_save_time"}, {"{#SITENAME}":"rdb_last_bgsave_status"}, {"{#SITENAME}":"rdb_last_bgsave_time_sec"}, {"{#SITENAME}":"rdb_current_bgsave_time_sec"}, {"{#SITENAME}":"aof_enabled"}, {"{#SITENAME}":"aof_rewrite_in_progress"}, {"{#SITENAME}":"aof_rewrite_scheduled"}, {"{#SITENAME}":"aof_last_rewrite_time_sec"}, {"{#SITENAME}":"aof_current_rewrite_time_sec"}, {"{#SITENAME}":"aof_last_bgrewrite_status"}, {"{#SITENAME}":"aof_last_write_status"}, {"{#SITENAME}":"total_connections_received"}, {"{#SITENAME}":"total_commands_processed"}, {"{#SITENAME}":"instantaneous_ops_per_sec"}, {"{#SITENAME}":"total_net_input_bytes"}, {"{#SITENAME}":"total_net_output_bytes"}, {"{#SITENAME}":"instantaneous_input_kbps"}, {"{#SITENAME}":"instantaneous_output_kbps"}, {"{#SITENAME}":"rejected_connections"}, {"{#SITENAME}":"sync_full"}, {"{#SITENAME}":"sync_partial_ok"}, {"{#SITENAME}":"sync_partial_err"}, {"{#SITENAME}":"expired_keys"}, {"{#SITENAME}":"evicted_keys"}, {"{#SITENAME}":"keyspace_hits"}, {"{#SITENAME}":"keyspace_misses"}, {"{#SITENAME}":"pubsub_channels"}, {"{#SITENAME}":"pubsub_patterns"}, {"{#SITENAME}":"latest_fork_usec"}, {"{#SITENAME}":"migrate_cached_sockets"}, {"{#SITENAME}":"role"}, {"{#SITENAME}":"connected_slaves"}, {"{#SITENAME}":"master_repl_offset"}, {"{#SITENAME}":"repl_backlog_active"}, {"{#SITENAME}":"repl_backlog_size"}, {"{#SITENAME}":"repl_backlog_first_byte_offset"}, {"{#SITENAME}":"repl_backlog_histlen"}, {"{#SITENAME}":"used_cpu_sys"}, {"{#SITENAME}":"used_cpu_user"}, {"{#SITENAME}":"used_cpu_sys_children"}, {"{#SITENAME}":"used_cpu_user_children"}, {"{#SITENAME}":"cluster_enabled"} ] }
#redis的Info信息总共有82个参数,用上面的自定义key已经都取出来了。
# /usr/local/zabbix/bin/zabbix_get -s 192.168.14.56 -k redis.info.value[used_memory] #测试redis.info.value传参也可以
821512
1.3 zabbix服务端Web操作
创建redis模板:
#先创建redis的模板。
#然后创建Redis的应用集。
#添加一个自动发现的规则,将redis的Info信息里面的所有参数名都发现出来。
选择主机添加模板:
#上面已经将一个简单的Redis模板创建完成了,现在找一个主机进行添加吧。
#点击此主机的自动发现,如果最后边的状态有红色的叹号,说明哪里会有问题,鼠标移动到叹号哪里也会有提示
#点击此主机的监控项选择Redis应用集,可以看到我们设置的自动发现规则里面的监控项原型生效了。一共两页82行。
博文来自:www.51niux.com
检查是否有数据:
#查看最新数据,选择主机以及应用集,查看是否能采集到数据。
#从上图可以看到我们已经可以对redis的info信息的每一项参数进行数据采集了.
1.4 小结
好的上面这种利用自动发现方式来获取redis信息的方式已经展示完了,当然因为是一个简单示例还有可以改进的地方。
它的优势就是可以根据客户端的情况灵活的传递参数,而非向上一篇TCP连接状态那样,在Web端要定义监控项和图形。
它不好的地方呢就是信息太多太杂,很多信息并非DBA关心的,也就是没用的数据,跟直接在redis哪里执行info一个鸟样,另外呢全是历史记录,没图啊,没图你搞个毛啊,看不出走势啊,没图咋分析问题啊。
二、zabbix监控redis单实例(常用方法)
2.1 客户端的操作
编写获取redis的value值的脚本:
$ cat /etc/zabbix/scripts/redis_info_value.sh
#!/bin/bash Info_Parameter="$1" Redis_Port="20000" Redis_Host="127.0.0.1" Redis_Passwd="redis48cs" Info_file="/home/zabbix/tmp/info.txt" /usr/local/bin/redis-cli -h 127.0.0.1 -p 20000 -a redis48cs "info" >$Info_file Info_Values(){ INFO_VALUE=$(grep "$Info_Parameter"\: $Info_file|awk -F ":" {'print $NF'}) echo "$INFO_VALUE" } Info_Values $1
创建上面脚本对应的目录和文件:
#mkdir /home/zabbix/tmp
#touch /home/zabbix/tmp/info.txt
#chown -R zabbix:zabbix /home/zabbix
#chmod 777 /home/zabbix/tmp/info.txt
编写自定义的key:
$ cat /etc/zabbix/zabbix_agentd.conf.d/redis_info_value.conf
UserParameter=redis.info.value[*],/bin/bash /etc/zabbix/scripts/redis_info_value.sh "$1"
给对应的脚本授权:
#chown -R zabbix:zabbix /etc/zabbix/*
#chmod +x zabbix:zabbix /etc/zabbix/scripts/*
重启客户端服务:
#/etc/init.d/zabbix/zabbix_agentd restart
1.2 zabbix_proxy代理的操作
# /usr/local/zabbix/bin/zabbix_get -s 192.168.14.55 -k redis.info.value[used_cpu_user] #取值是可以的,有浮点数
2.26
# /usr/local/zabbix/bin/zabbix_get -s 192.168.14.55 -k redis.info.value[maxmemory_human] #有字符型
8.00G
1.3 zabbix服务端Web操作
创建redis模板:
#创建一个Redis的模板,然后创建一个Redis的应用集,这个就不说了。
创建监控项:
#首先info里面的好多信息是没用的,另外好多参数是将上面的参数转换成可读的形式,例如,used_memory_peak和used_memory_peak_human,显然我们就要前面的就可以了,因为你用后面是一个字符型,你客户端还要写脚本再转回成字节类型,所以类似于这种就直接在服务器取字节的形式然后转换就行了。如下图:
#然后又得又不是整数型,是浮点数的类型,如果你选择成整数类型的话,又获取不到值,如下图:
#像这种CPU就不需要转换了,因为本身你也不可能有太多的CPU占用。
#最后监控项就做成了这样子,左边呢根据$1可以显示参数的名称,右边呢可以根据键值取出对应的数字。
redis_info_value_templates.xml
#然后找个redis的主机关联一下。
查看最后的效果:
1.4 小结
#上面是一个简单的小例子,也没有做图形也没有做触发器,生产中呢可以根据自己的需求,跟DBA或者使用Redis的人进行沟通,他们比较关心那些方面,就将那些监控起来,然后做图形做触发器之类的,像我们的DBA呢就比较关心内存是否达到上限啊,复制是否运行正常啊,是不是有大查询导致服务挂掉了啊之类的。
#然后呢,redis不像别的数据库服务,还能针对不同的用户设置不同的权限,redis就一个密码验证,那么好多时候呢你监控用户是执行不了redis-cli命令的,对redis的监控呢,不如让DBA写个定时任务,定时的导出info信息一份到一个公共区域的文件里面去,可以加上时间戳,然后zabbix去分析这个对应时间戳的文件,将info监控项对应的值取出来交给proxy端。
三、zabbix监控redis多实例(自动发现)
#这个以后有机会再写吧,先留个坑,网上也很多博客写这个。
#一个服务器上面redis可能是多实例,端口呢也可能不一样,也就是多实例起多个非固定的端口。
#我是这么想的啊,首先利用自动发现,最上面不是写了个自动发现info参数的脚本嘛,得改成自动发现本地有哪些redis端口。
#然后呢一般多实例呢都是在同一个根目录下面,然后不同的业务目录下面的redis.conf文件里面定义了,现在一般还是有密码的,咱们也就别去跟DBA要密码了,redis挺重要的服务人家也不见得愿意给你或者让你操作redis,不如就让人家每分钟导出一份数据来写到公共区域,然后以(redis.conf所在的上级目录来开头_端口_时间戳.txt),类似于这种形式的记录文件命名,这样我们是哪个业务的redis知道了,是哪个端口知道了,然后其中对应的info信息也知道了,是不是最新的info信息也知道了。
#然后服务端怎么取啊,前面记录了一个网卡的自动发现功能,用哪个意思就OK了,两种方式,比如我上面不是监控了八项嘛,把这八项写成八个自定义的key,[自动发现的端口,业务名称],然后监控项名称取$2,然后自定义的那些key呢要端口$1去对应的端口文件里面去取值,这样就都OK啦。另一种方式就是还是像上面似得定义一个自定义的key,然后客户端的脚本就需要复杂点了,[info参数名称,redis的端口号,业务名称],这样客户端的脚本文件根据传递过来的$2去找对应的info记录文件,然后根据$1做过滤取值