
Às vezes, você precisa implementar rapidamente o monitoramento de um novo serviço, mas não possui a infraestrutura ou a experiência necessárias. Neste guia, vamos implementar uma ferramenta para monitorar qualquer serviço web em meia hora, usando apenas ferramentas integradas. ubuntu: bash, cron e curl. Usaremos o Telegram para enviar notificações.
A “cereja do bolo” será o envolvimento emocional dos utilizadores. Testado em pessoas - funciona.
Quando nós do serviço de telemedicina Doutor Perto criamos um chatbot para determinar o nível de estresse dos usuários, precisávamos de monitoramento. Em algumas horas, foi criado um miniprojeto que não só funciona muito bem, mas também agrega positividade com suas mensagens.
Primeiro, vamos obter um repositório com scripts:
git clone https://github.com/rshekhovtsov/msms.gitVá para a pasta msms e trabalhe nela.
Se o telegrama estiver bloqueado, use um proxy. A opção mais simples e confiável são as torsocks:
sudo apt install tor
sudo apt install torsocksComo exemplo, vamos configurar o monitoramento da página inicial do google.com em três etapas.
PASSO 1. Crie um bot no telegrama e obtenha o ID do usuário
- Na barra de pesquisa de contatos no telegrama procuramos :

- Lançamos com o botão Iniciar, digitamos o comando /newbot e respondemos às perguntas. Você precisa ter em mente que nome é o nome do bot que será exibido aos usuários, e nome de usuário é único e deve terminar com “bot”:

Entre outras coisas, o bot emitirá um token secreto para a API HTTP, que deve ser copiado e salvo no arquivo telegram-api-key.txt na pasta msms. - Digitamos o nome do nosso bot na barra de pesquisa do telegrama e o iniciamos.
- Como toque final, vamos nos adicionar à lista de destinatários de alertas de monitoramento:
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shO script exibirá uma lista de chamadas recentes para o bot; deve haver uma linha com nosso id e nome no telegrama. Pegamos esse ID e o salvamos no arquivo services/google-recipients.txt. Formato do arquivo: cada linha é um id. Exemplo:
123456789 987654321
Para adicionar um novo destinatário, você precisa pedir a ele para iniciar o bot no telegrama, executar destinatários-setup.sh e adicionar o id ao arquivo.
ETAPA 2. Configurar o monitoramento
O serviço é descrito criando um arquivo ini na pasta de serviços. Você precisa definir cinco parâmetros:
- MSMS_SERVICE_NAME: nome do serviço - será usado em alertas e log de monitoramento.
- MSMS_SERVICE_ENDPOINT: endpoint do serviço com o qual entraremos em contato com curl.
- MSMS_CURL_PARAMS: opções adicionais de curl, veja o exemplo abaixo.
- MSMS_EXPECTED: resposta esperada do serviço. Usado se a resposta for curta.
- MSMS_EXPECTED_FILE: nome do arquivo com a resposta de serviço esperada. Se especificado, substitui MSMS_EXPECTED.
- MSMS_RECIPIENTES: arquivo com uma lista de destinatários da notificação.
Uma solicitação para google.com retorna html fixo com um redirecionamento, usaremos isso como a resposta esperada do servidor:
curl google.com > services/google-response.htmlVamos criar o arquivo services/google.ini:
MSMS_SERVICE_NAME='google front page'
# service endpoint
MSMS_SERVICE_ENDPOINT='google.com'
# curl parameters
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'
# expected service response
MSMS_EXPECTED_FILE='google-response.html'
# recipients list file
MSMS_RECIPIENTS='google-recipients.txt' В MSMS_CURL_PARAMS você pode definir tudo o que o curl pode fazer, incluindo:
- Desative as mensagens curl para evitar sobrecarregar o console e o log:
-s - Defina o tempo limite de conexão com o serviço que está sendo verificado (em segundos):
--connect-timeout 3 - Defina o tempo limite de resposta:
-m 7 - Desative a verificação de certificado para SSL (por exemplo, se você estiver usando um certificado autoassinado):
--insecure - Especifique o tipo de solicitação http:
-X POST - Especifique os títulos:
-H "Content-Type: application/json" - Especifique o corpo da solicitação como uma string ou arquivo. Exemplo para um arquivo:
-d @request.json
Desativamos as notificações e definimos o tempo limite para 3 segundos. para conectar e 7 seg. para receber uma resposta de serviço.
Atenção: Especifique os valores dos parâmetros entre aspas simples, como no exemplo. Infelizmente, o bash é bastante frágil nesse sentido, e uma borboleta acidental com aspas erradas pode levar à morte do universo com erros difíceis de diagnosticar.
Montamos o monitoramento. Vamos verificar se está tudo bem:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shO script deve exibir uma mensagem como:
2020-01-10 12:14:31
health-check "google front page": OKETAPA 3. Configurando um cronograma
Vamos configurar um cronograma de monitoramento no cron:
sudo crontab -eVamos adicionar uma linha para verificar google.com a cada minuto:
*/1 * * * * torsocks <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.sh >> <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.log 2>&1Adicionaremos um alerta todos os dias às 11.00h, confirmando a funcionalidade do próprio monitoramento. Para isso, passaremos o parâmetro DAILY para o script:
0 11 * * * torsocks <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.sh DAILY >> <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.log 2>&1
2>&1 - uma técnica padrão que redireciona erros para o fluxo de saída principal. Como resultado, eles também irão parar no log de monitoramento.
Vamos salvar as alterações e retomá-las com o comando:
sudo service cron reloadVocê pode ler mais sobre como configurar o cron, por exemplo, .
Assim, a cada minuto será lançado um script de monitoramento, que entrará em contato com google.com via curl. Caso a resposta recebida seja diferente da esperada, o script enviará uma notificação por telegrama para a lista de destinatários. O log de auditoria é mantido no arquivo monitoração.log
Se precisarmos adicionar outro serviço, simplesmente criamos um novo arquivo ini para ele na pasta de serviços e, se necessário, criamos uma lista separada de destinatários. Todo o resto funcionará automaticamente.
Caso o serviço verificado fique indisponível, um alerta será enviado a cada minuto. Se não for possível restaurar o serviço rapidamente, você pode desativar temporariamente as notificações nas propriedades do telegrama do bot.
Agora vamos dar uma olhada mais de perto nos recursos adicionais e na implementação de scripts.
Padrões de mensagens e envolvimento emocional
Para tornar a comunicação com o bot mais dinâmica, chamamos-lhe Manechka, adicionamos uma imagem de avatar apropriada e contratamos especialistas profissionais em relações públicas para criar textos de mensagens. Você pode usar nossa experiência ou alterá-la ao seu gosto.
Por exemplo:

ou até mesmo assim:

Por que não?
O nome do bot e o avatar são definidos via .
Os modelos de mensagens estão na pasta modelos:
- curl-fail.txt: mensagem enviada quando curl retorna um código de erro diferente de zero. Geralmente fala da impossibilidade de chegar ao serviço.
- diário.txt: Mensagem diária confirmando que o monitoramento do serviço está funcionando.
- falha de serviço.txt: uma mensagem enviada quando a resposta do serviço é diferente do esperado.
Vejamos as opções de personalização usando modelos de mensagens integrados como exemplo.
Os modelos usam emoji. Infelizmente, o habr não os exibe.
Para selecionar emoji, é conveniente usar a pesquisa em :

Você simplesmente copia e cola o símbolo apropriado no texto do modelo (este é o Unicode normal).
- curl-fail.txt:
Котёнок, помоги мне... Не могу достучаться до сервиса "$MSMS_SERVICE_NAME" `CURL EXIT CODE: $EXIT_CODE`Usamos o nome do serviço que especificamos (variável
MSMS_SERVICE_NAME) e uma variável de script interna com código de saída curl (EXIT_CODE). Também formatamos a mensagem usando marcação : caracteres "`" circundam texto de largura fixa. Como aspas e apóstrofos são símbolos bash, nós os escapamos com "". Os nomes das variáveis são precedidos por um sinal “$”.Resultado:

- falha de serviço.txt:
Котёнок, помоги мне... Сервис "$MSMS_SERVICE_NAME" меня расстроил Он работает неправильно, вот что он мне отвечает: `$RESPONSE`Resultado:

Aqui usamos outra variável de script:RESPONSE. Ele contém a resposta do serviço. - diário.txt:
Малыш, привет! У меня всё хорошо, cлежу за сервисом: "$MSMS_SERVICE_NAME" каждую минутку... А как у тебя дела?Resultado:

Vamos passar para a implementação dos scripts.
Roteiro de monitoramento
monitoramento.sh faz uma descoberta automática simples - pega todos os arquivos ini da pasta de serviços e para cada um executa o script principal com a lógica de verificação e envio de alertas:
#!/bin/bash
cd $(dirname "$0")/services
for service_ini in $(ls *.ini); do
bash ../msms.sh "$1" "$service_ini"
donePara gerar uma mensagem diária sobre o status do monitoramento, pode-se passar o parâmetro DAILY para o script.
Observe que quando o script é iniciado, a pasta atual muda para serviços. Isso permite especificar caminhos de arquivos relativos a serviços em arquivos ini.
Script para verificação e envio de notificações
msms.sh contém a lógica principal para verificação do serviço e envio de alertas.
Trabalhando com telegrama:
# telegram endpoint
TG_API_URL="https://api.telegram.org/bot$(cat ../telegram-api-key.txt)/sendMessage"
#################################################################
# send message to telegram
# parameter: message text
#################################################################
function send_message {
for chat_id in $(cat ../$MSMS_RECIPIENTS); do
curl -s -X POST --connect-timeout 10 $TG_API_URL -d chat_id=$chat_id -d parse_mode="Markdown" -d text="$1"
echo
done
}
Geramos uma URL para acessar a API REST do telegrama usando a chave secreta salva no arquivo.
A função send_message usa curl para enviar mensagens para esta API REST, obtendo os IDs dos destinatários do arquivo que especificamos no arquivo ini. Nos dados que enviamos, indicamos que utilizamos marcação de mensagem: parse_mode="Markdown".
Vamos exibir a data e hora atuais e carregar o arquivo ini.
echo $(date '+%Y-%m-%d %H:%M:%S')
# load variables from .ini file:
. $2
Corda mágica . $2 executa o arquivo ini passado para a entrada como segundo parâmetro como um script normal, inserindo os valores nele especificados nas variáveis de ambiente.
Carregue a resposta esperada do arquivo se o parâmetro for especificado MSMS_EXPECTED_FILE:
if [ -n "$MSMS_EXPECTED_FILE" ]; then
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Verificaremos o serviço e enviaremos alertas se necessário:
RESPONSE="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; then
echo health-check "$MSMS_SERVICE_NAME" FAILED: CURL EXIT WITH $EXIT_CODE
MESSAGE="$(cat ../templates/curl-fail.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
elif [[ "$RESPONSE" != "$MSMS_EXPECTED" ]]; then
echo health-check "$MSMS_SERVICE_NAME" FAILED: "$RESPONSE"
MESSAGE="$(cat ../templates/service-fail.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
else
echo health-check "$MSMS_SERVICE_NAME": OK
fi
Primeiro atribuímos à variável RESPONSE o resultado da execução do comando curl para este serviço.
Expressão EXIT_CODE=$? coloca o resultado do último comando em uma variável, ou seja, ondulação. Caso seja necessário enviar um alerta, o modelo é lido do arquivo correspondente e enviado aos destinatários através send_message.
O último bloco processa o parâmetro DAILY:
if test "$1" = "DAILY"; then
echo health-check "$MSMS_SERVICE_NAME" DAILY
MESSAGE="$(cat ../templates/daily.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
fiEnvia uma mensagem confirmando a funcionalidade do próprio monitoramento.
Obtendo uma lista de IDs de usuários
destinatários-setup.sh chama a API do Telegram para obter as mensagens mais recentes endereçadas ao bot:
curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates
| python recipients-setup.pyIsso usa a magia python para exibir uma lista lindamente. Isso não é necessário, você pode simplesmente pegar o id desejado do json, que o comando irá gerar:
torsocks curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdatesConclusão
Assim, você pode utilizar scripts e modelos de mensagens prontos, configurando apenas serviços monitorados e listas para alertas; você pode criar uma nova “personalidade” para o bot; ou você pode tomar sua própria decisão com base no que foi proposto.
Opções para desenvolvimento adicional sugerem configurar e gerenciar o monitoramento no próprio bot, mas aqui você não pode prescindir do python. Se alguém conseguir antes de mim, você sabe onde enviar a solicitação pull :)
Fonte: habr.com



