redis服务器监控脚本

redis服务器监控脚本

我面临为 redis 服务器编写脚本的问题。我知道这将是非常正常的脚本,但由于我缺乏知识,我无法做到。

目前我可以在使用以下命令时退出

redis-cli -r -1 -i 300 INFO | grep slave
connected_slaves:4
slave0:ip=70.0.0.170,port=7000,state=online,offset=2425867354,lag=1
slave1:ip=70.0.0.227,port=7000,state=online,offset=2425870831,lag=0
slave2:ip=70.0.0.228,port=7000,state=online,offset=2425871141,lag=0
slave3:ip=70.0.0.171,port=7000,state=online,offset=2428745984,lag=1

我想要一个监控脚本,如果任何从站不处于在线状态或滞后超过5,它将发送电子邮件。

答案1

这是一个awk程序(在 bash 脚本中),它解析命令的输出并检测其中存在问题的行。我的awk已经生锈了,所以无疑不优雅,但很管用。

它采用标准输入并仅打印符合您要查找的条件的行。

我在注释掉之后留下了我用来调试它的打印语句。

为了避免仅为程序使用单独的临时或永久文件awk,整个文件都添加到awk命令行上,并用单引号引起来,使其成为一个参数并防止 bash 扩展它。

要使用它,您可以将其添加到当前管道的末尾,例如

redis-cli -r -1 -i 300 INFO | grep slave | parse_redis > some-file

如果some-file不为空,则通过电子邮件发送给自己。

awk 代码非常简单,可以轻松修改它以满足您的需要。

我没有介绍如何从 cron 等运行它。如果您需要集成它的帮助,请为此答案添加评论。

如果redis/your pipeline 可以发出示例中未列出的其他类型的输出,那么您必须修改您的管道或此awk程序来处理它们。

#!/bin/bash
## parse_redis
## parses redis output looking for state and lag problems

## sets awk's field separator to a comma to make things easy
## whole awk program is a single single-quoted string on the awk command line

awk -F ',' '

BEGIN {
  max_lag = 5 ## threshold for acceptable lag times
}

##{ print "input is "  NR " " $0 }
NR == 1 {next} ## skip first line of input

problem=0 ## flag for problem detected

## detect anything except online
##{ print "field 3 [" $3 "]" }
## If the third field does not contain state=online, then it is a problem
$3 !~ "state=online" {problem = 1}

## Get the value for lag and see if it is too large
## lag is in the 5th field starting at the 5th character
## extract the value from the 5th character to the end
## of the field and turn it into a number
## Probably would work without turning it into a number
{
  ##{ print "field 5 [" $5 "]" }
  lag = strtonum(substr($5, 5))
  ##{ print "lag [" lag "]" }
  if (lag > max_lag) problem = 1
}

##{ print "problem [" problem "]" }

{if (problem == 0) next}

{print}
'

相关内容