Script de monitoramento para o servidor redis

2

Estou enfrentando problema para escrever um script para o servidor redis. Eu sei que será um roteiro muito normal, mas devido à minha falta de conhecimento eu não posso.

Atualmente, posso sair colocando quando usando o comando abaixo

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

Eu quero um script de monitoramento, se algum escravo não estiver no estado on-line ou o atraso for maior que 5, ele enviará e-mail.

    
por Arya Ray 16.09.2016 / 07:10

1 resposta

3

Aqui está um programa awk (em um script bash) que analisa a saída de seus comandos e detecta linhas com problemas nelas. Meu awk está enferrujado, então, sem dúvida, não é elegante, mas funciona.

É necessária uma entrada padrão e imprime apenas as linhas com as condições que você está procurando.

Eu deixei as declarações de impressão que usei para depurar depois de comentá-las.

Para evitar o uso de um arquivo temporário ou permanente separado apenas para o programa awk , a coisa toda é adicionada à linha de comando awk , entre aspas simples para torná-lo um argumento e para evitar que o bash o expanda. / p>

Para usá-lo, você o adicionaria ao final do seu pipeline atual com algo como

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

Se some-file não estiver vazio, envie-o em um e-mail para você mesmo.

O código awk é bastante simples, facilitando a sua modificação para atender às suas necessidades.

Não falei sobre como executar isso no cron, etc. Se precisar de ajuda para integrá-lo, adicione um comentário a essa resposta.

Se redis / seu canal puder emitir outros tipos de saída não listados em seu exemplo, você terá que modificar seu canal ou este programa awk para manipulá-los.

#!/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}
'
    
por 17.09.2016 / 00:18