redis详细监控,优势:1.比官方脚本详细; 2.采用shell实现zabbix自定义监控项,更加通用;3.中文告警,易懂;4. 支持自动发现同机同安装目录的所有redis,并创建监控项、触发器和图形
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 |
#!/bin/bash ################################### # date author note # 2014/08/06 zhangm412@126.com pioneer # 2015/06/30 mail@zhaoyanan.cn update # 2018/04/13 mail@zhaoyanan.cn 增加密码参数,增加大量必要监控项和中文注释 # 2018/04/18 mail@zhaoyanan.cn 修改文件路径等一系列bug # 2018/09/21 mail@zhaoyanan.cn 修正redis4上面密码不安全提示问题 # # function for redis montior # # touch /opt/zabbix/bin/redis_monitor.sh; chmod +x /opt/zabbix/bin/redis_monitor.sh # # redis的zabbix配置: # UserParameter=custom.redis.discovery,/opt/zabbix/bin/redis_monitor.sh discovery # UserParameter=custom.redis.status[*],/opt/zabbix/bin/redis_monitor.sh $1 $2 $3 ################################### ############# 配置部分 ################## export HOST=“127.0.0.1” export PORT=“$1” # redis自定义安装的目录 export BASE_DIR=/opt/redis # 如果无密码,置空即可。或者直接从本地配置中获取密码。该配置这儿如果不配,下面会自动偿试从本地配置中获取 # export PASSWD=”pass” ############# 配置结束 ################## # 环境变量 export LANG=C export LC_ALL=C export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin ############# PROGRAM ############## if [ “$1” == “” ] || [ “$1” == “help” ]; then echo “\$1 Can not be empty, error, exit.” exit fi # 发现规则 REDIS=“” if [ “$1” == “discovery” ];then for each in `find ${BASE_DIR} –name “redis*.conf” –type f|xargs grep ‘^port’|cut –d‘ ‘ –f2|sort|uniq` do REDIS=${REDIS}‘”{#REDISPORT}”:”‘${each}‘”,’ done echo ‘{“data”: [{‘${REDIS}‘}]}’ | sed ‘s/,/},{/g’ | sed ‘s/,{}//’ exit fi # 密码判断和获取 if [ “$PASSWD” == “” ];then if [ “$1” == “6379” ] && [ –f ${BASE_DIR}/redis.conf ];then PASSWD=`grep –v “^#” ${BASE_DIR}/redis.conf | sed ‘/^$/d’ | grep requirepass | awk ‘{ print $2; }’` else PASSWD=`grep –v “^#” ${BASE_DIR}/redis_$1.conf | sed ‘/^$/d’ | grep requirepass | awk ‘{ print $2; }’` fi fi if [ “$PASSWD” != “” ];then pw_parameter=“-a” else pw_parameter=“” fi # 定义命令路径 export REDISCLI=“${BASE_DIR}/bin/redis-cli” if [ ! –f “$REDISCLI” ];then REDISCLI=“${BASE_DIR}/src/redis-cli” fi REDISCONN=“$REDISCLI -h $HOST -p $PORT $pw_parameter $PASSWD” # 获取监控值 if [[ $# == 2 ]];then case $2 in redis_ping) result=`$REDISCONN ping 2> /dev/null | grep –c PONG` echo $result ;; redis_version) result=`$REDISCONN info 2> /dev/null | grep –w “redis_version” | awk –F‘:’ ‘{print $2}’` echo $result ;; uptime_in_seconds) # 自 Redis 服务器启动以来,经过的秒数 result=`$REDISCONN info 2> /dev/null | grep –w “uptime_in_seconds” | awk –F‘:’ ‘{print $2}’` echo $result ;; uptime_in_days) # 自 Redis 服务器启动以来,经过天数 result=`$REDISCONN info 2> /dev/null | grep –w “uptime_in_days” | awk –F‘:’ ‘{print $2}’` echo $result ;; connected_clients) # 已连接客户端的数量(不包括通过从属服务器连接的客户端) result=`$REDISCONN info 2> /dev/null | grep –w “connected_clients” | awk –F‘:’ ‘{print $2}’` echo $result ;; blocked_clients) # 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量 result=`$REDISCONN info 2> /dev/null | grep –w “blocked_clients” | awk –F‘:’ ‘{print $2}’` echo $result ;; used_memory) # 由 Redis分配器分配的内存总量,以字节(byte)为单位 result=`$REDISCONN info 2> /dev/null | grep –w “used_memory” | awk –F‘:’ ‘{print $2}’` echo $result ;; used_memory_rss) # 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps等命令的输出一致。 result=`$REDISCONN info 2> /dev/null | grep –w “used_memory_rss” | awk –F‘:’ ‘{print $2}’` echo $result ;; used_memory_peak) # Redis 的内存消耗峰值(以字节为单位) result=`$REDISCONN info 2> /dev/null | grep –w “used_memory_peak” | awk –F‘:’ ‘{print $2}’` echo $result ;; used_memory_lua) # Lua 引擎所使用的内存大小(以字节为单位) result=`$REDISCONN info 2> /dev/null | grep –w “used_memory_lua” | awk –F‘:’ ‘{print $2}’` echo $result ;; mem_fragmentation_ratio) # 内存碎片的比率,used_memory_rss 和 used_memory 之间的比率 # 在理想情况下, used_memory_rss 的值应该只比 used_memory 稍微高一点儿。 # 当 rss > used ,且两者的值相差较大时,表示存在(内部或外部的)内存碎片。 # 内存碎片的比率可以通过 mem_fragmentation_ratio 的值看出。 # 当 used > rss 时,表示 Redis 的部分内存被操作系统换出到交换空间了,在这种情况下,操作可能会产生明显的延迟。 result=`$REDISCONN info 2> /dev/null | grep –w “mem_fragmentation_ratio” | awk –F‘:’ ‘{print $2}’` echo $result ;; aof_current_size) # AOF 文件目前的大小 result=`$REDISCONN info 2> /dev/null | grep –w “aof_current_size” | awk –F‘:’ ‘{print $2}’` echo $result ;; aof_pending_bio_fsync) # 后台 I/O 队列里面,等待执行的 fsync 调用数量。 result=`$REDISCONN info 2> /dev/null | grep –w “aof_pending_bio_fsync” | awk –F‘:’ ‘{print $2}’` echo $result ;; aof_last_rewrite_time_sec) # 最近一次创建 AOF 文件耗费的时长。 result=`$REDISCONN info 2> /dev/null | grep –w “aof_last_rewrite_time_sec” | awk –F‘:’ ‘{print $2}’` echo $result ;; aof_last_bgrewrite_status) # 一个标志值,记录了最近一次创建 AOF 文件的结果是成功还是失败。 result=`$REDISCONN info 2> /dev/null | grep –w “aof_last_bgrewrite_status” | awk –F‘:’ ‘{print $2}’ | grep –c ok` echo $result ;; aof_last_write_status) # 没搞懂aof_last_bgrewrite_status和aof_last_write_status的区别 result=`$REDISCONN info 2> /dev/null | grep –w “aof_last_write_status” | awk –F‘:’ ‘{print $2}’ | grep –c ok` echo $result ;; rdb_changes_since_last_save) # 距离最近一次成功创建持久化文件之后,经过了多少秒。 result=`$REDISCONN info 2> /dev/null | grep –w “rdb_changes_since_last_save” | awk –F‘:’ ‘{print $2}’` echo $result ;; rdb_last_save_time) # 最近一次成功创建 RDB 文件的 UNIX 时间戳。 result=`$REDISCONN info 2> /dev/null | grep –w “rdb_last_save_time” | awk –F‘:’ ‘{print $2}’` echo $result ;; rdb_last_bgsave_status) # 一个标志值,记录了最近一次创建 RDB 文件的结果是成功还是失败。 result=`$REDISCONN info 2> /dev/null | grep –w “rdb_last_bgsave_status” | awk –F‘:’ ‘{print $2}’ | grep –c ok` echo $result ;; rdb_last_bgsave_time_sec) # 记录了最近一次创建 RDB 文件耗费的秒数。 result=`$REDISCONN info 2> /dev/null | grep –w “rdb_last_bgsave_time_sec” | awk –F‘:’ ‘{print $2}’` echo $result ;; instantaneous_ops_per_sec) # 服务器每秒钟执行的命令数量。 result=`$REDISCONN info 2> /dev/null | grep –w “instantaneous_ops_per_sec” | awk –F‘:’ ‘{print $2}’` echo $result ;; rejected_connections) # 因为最大客户端数量限制而被拒绝的连接请求数量。 result=`$REDISCONN info 2> /dev/null | grep –w “rejected_connections” | awk –F‘:’ ‘{print $2}’` echo $result ;; expired_keys) # 因为过期而被自动删除的数据库键数量。 result=`$REDISCONN info 2> /dev/null | grep –w “expired_keys” | awk –F‘:’ ‘{print $2}’` echo $result ;; evicted_keys) # 因为最大内存容量限制而被驱逐(evict)的键数量。 result=`$REDISCONN info 2> /dev/null | grep –w “evicted_keys” | awk –F‘:’ ‘{print $2}’` echo $result ;; keyspace_hits_rate) # 键请求命中率 i=`$REDISCONN info 2> /dev/null | grep –w “keyspace_hits” | awk –F‘:’ ‘{print $2}’ | tr –d “\r”` j=`$REDISCONN info 2> /dev/null | grep –w “keyspace_misses” | awk –F‘:’ ‘{print $2}’| tr –d “\r”` result=$(($i*100/($i+$j))) echo $result ;; latest_fork_usec) # 最近一次 fork() 操作耗费的毫秒数。当 Redis 持久化数据到磁盘上时,它会进行一次 fork 操作。# 是毫秒还是微秒,应该是微秒吧 result=`$REDISCONN info 2> /dev/null | grep –w “latest_fork_usec” | awk –F‘:’ ‘{print $2}’` echo $result ;; master_link_down_since_seconds) # 主从服务器连接断开了多少秒。 result=`$REDISCONN info 2> /dev/null | grep –w “master_link_down_since_seconds” | awk –F‘:’ ‘{print $2}’` echo $result ;; master_last_io_seconds_ago) # 主从服务器连接断开了多少秒。 result=`$REDISCONN info 2> /dev/null | grep –w “master_last_io_seconds_ago” | awk –F‘:’ ‘{print $2}’` echo $result ;; master_link_status) # 复制连接当前的状态, up 表示连接正常, down 表示连接断开。 result=`$REDISCONN info 2> /dev/null | grep –w “master_link_status” | awk –F‘:’ ‘{print $2}’ | grep –c up` echo $result ;; used_cpu_sys) # Redis 服务器耗费的系统 CPU 。 result=`$REDISCONN info 2> /dev/null | grep –w “used_cpu_sys” | awk –F‘:’ ‘{print $2}’ | cut –d‘.’ –f 1` echo $result ;; used_cpu_user) # Redis 服务器耗费的用户 CPU 。 result=`$REDISCONN info 2> /dev/null | grep –w “used_cpu_user” | awk –F‘:’ ‘{print $2}’ | cut –d‘.’ –f 1` echo $result ;; used_cpu_sys_children) # 后台进程耗费的系统 CPU 。 result=`$REDISCONN info 2> /dev/null | grep –w “used_cpu_sys_children” | awk –F‘:’ ‘{print $2}’ | cut –d‘.’ –f 1` echo $result ;; used_cpu_user_children) # 后台进程耗费的用户 CPU 。 result=`$REDISCONN info 2> /dev/null | grep –w “used_cpu_user_children” | awk –F‘:’ ‘{print $2}’ | cut –d‘.’ –f 1` echo $result ;; *) echo –e “\033[33mUsage: $0 PORT Parameter\033[0m” ;; esac elif [[ $# == 3 ]];then case $3 in keys) result=`$REDISCONN info 2> /dev/null | grep –w “$2” | grep –w “keys” | awk –F‘=|,’ ‘{print $2}’` echo $result ;; expires) result=`$REDISCONN info 2> /dev/null | grep –w “$2” | grep –w “keys” | awk –F‘=|,’ ‘{print $4}’` echo $result ;; avg_ttl) result=`$REDISCONN info 2> /dev/null | grep –w “$2” | grep –w “avg_ttl” | awk –F‘=|,’ ‘{print $6}’` echo $result ;; *) echo –e “\033[33mUsage: $0 PORT Parameter\033[0m” ;; esac fi |
监控项展示(如果同机同目录有多个redis配置并启用,zabbix3会自动生成新的项控项):
监控图形展示(如果同机同目录有多个redis配置并启用,zabbix3会自动生成新的图形)(点击放大):
redis的zabbix监控模板xml下载:
zbx_export_templates_for_redis
或者:
http://down.51cto.com/data/2453193
发表回复