Hoje, tive a tarefa de "escrever uma verificação de integridade" para um serviço de longa duração que é um sistema de orquestração para implantar um aplicativo da web.
Estou tentando determinar qual seria o escopo de uma verificação de saúde e fiz estas perguntas relacionadas ao escopo da verificação de saúde:
- É bom considerar o serviço íntegro se o sistema de orquestração relatar que a tarefa está em execução?
- Ou devemos executar ping manualmente em cada serviço?
- Ou deveria ir além e tentar garantir que o aplicativo Web faça o que deveria fazer, como mostrar uma página da Web?
- A verificação de integridade também precisa verificar se alguns serviços dependentes também estão em execução? Como um banco de dados ou o próprio sistema de orquestração. Ou isso é responsabilidade de outro exame de saúde?
- E, finalmente, se um dos serviços dependentes estiver morto e o aplicativo Web falhar posteriormente, o aplicativo Web deve relatar um problema de saúde ou é bom, porque não é culpa dos aplicativos da Web?
Eu sei que essas são cinco perguntas separadas, mas todas elas se relacionam ao escopo de uma verificação de integridade para um serviço de longa duração que implanta um aplicativo Web, então pensei que faria mais sentido mantê-los agrupados em uma única pergunta.
Isso é difícil de implementar para mim, porque não tenho certeza da definição do que é saudável ou de como deve ser uma verificação de integridade padrão para algo assim.
O que deve conter uma verificação de integridade para este serviço específico?
fonte
Respostas:
Você respondeu sua própria pergunta aqui. A definição de uma verificação de saúde vai variar, porque o que é saudável varia. Também depende do que está emitindo a verificação de saúde.
Uma boa pergunta é: "do ponto de vista do solicitante, o serviço verificado está funcionando como esperado?" Se este é você, você pode defini-lo. Se for outra equipe / serviço, você precisará identificar qual é o padrão / especificação para verificações de saúde.
Provavelmente em uma organização grande, você terá algum tipo de padrão para o que uma verificação de saúde deve fazer. Resolver aquilo.
Especificamente aqui, seu exemplo de aplicativo da web significa que ele não deve retornar íntegro porque o aplicativo da web não está íntegro. Mas talvez sua definição de "saudável" inclua isso como "ok". Isso faz parte da discussão de requisitos acima (novamente, mesmo que seja apenas seu próprio código).
Minha recomendação, supondo que não seja especificado em outro lugar, seria ter algum tipo de código de status associado a diferentes falhas. Quando você consulta o aplicativo da web, ele pode retornar um erro que diz "o serviço dependente está inoperante" e assim seu cliente (ou o que estiver executando a verificação de integridade) pode saber o motivo pelo o cliente está inoperante.
Para as perguntas editadas:
Não, apenas porque um processo está em execução não significa que ele não esteja travado, totalmente não funcional ou com uma grande variedade de outras possibilidades.
Isso pode funcionar, dependendo do escopo da funcionalidade do seu aplicativo. Se a verificação do serviço responder a um "você está vivo?" ping, isso pode ser tudo o que é necessário. Mas se o serviço puder ser "vivo e responsivo, mas não estiver funcionando", talvez seja necessário verificar outras coisas também.
Sua verificação de saúde precisa garantir que a funcionalidade necessária esperada funcione conforme o esperado.
Se seu aplicativo retorna "saudável" e não pode fazer o que precisa fazer, assim como você pode se livrar de toda a healthcheck como ele vai te dar falsos positivos (para não mencionar confundir o Parreira fora de pessoas tentando depurar o problema - 'hey nosso servidor da web mostra boa saúde, por que não conseguimos ver a página? ').
Isso depende um pouco. Se o seu serviço depende de outro serviço, a natureza dessa interação deve ser refletida nas chamadas de API / rede enviadas a ele no seu aplicativo e incorporadas à verificação de saúde.
Por exemplo, um servidor da web que lê um banco de dados precisa ter informações de status sobre o banco de dados embutido nele - ou o aplicativo da web simplesmente trava se a chamada da API falhar. Você pode modificar trivialmente essas chamadas para serem incorporadas à sua verificação de saúde.
No entanto, se seu serviço estiver enviando eventos para consumidores que ouvem, sem nenhuma validação, será menos importante para a funcionalidade do seu aplicativo que os consumidores estejam vivos. "Saudável" para o seu aplicativo está enviando as mensagens, na verdade não as recebe.
Basicamente, se o seu serviço precisar conversar com outros serviços e verificar a saúde deles de qualquer maneira, faz sentido ter pelo menos um nível básico de verificação para verificar a integridade do serviço. Isso deve fazer sentido conceitualmente, considerando o que acabei de dizer, pois seu aplicativo já estará lidando com isso (ou travando aleatoriamente, eu acho).
Isso é basicamente respondido acima. Minha recomendação seria que sua verificação de saúde retornasse um código / mensagem / o que for que der essas informações. As duas informações são importantes: que o serviço dependente de que seu serviço precisa está morto e que seu serviço não funcionará conforme o esperado.
fonte
Geralmente, um exame de saúde significa apenas "está vivo e está respondendo". As verificações adicionais são altamente especializadas e dependem inteiramente do uso do sistema. Se você faz o possível para verificar se um sistema está processando solicitações corretamente, é com você, mas você deve fazer o básico primeiro - verifique se está lá, verifique se pode receber solicitações e retornará uma resposta.
A maneira mais fácil de implementar uma verificação de saúde é simplesmente escrever um comando que o serviço processa usando o mesmo mecanismo usado por outros comandos, que nada faz além de retornar uma confirmação. Isso mostrará vivacidade e que o sistema está recebendo e processando respostas.
A verificação de sistemas dependentes não faz parte da verificação de integridade. Você precisa mantê-lo simples e independente. Adicione uma verificação de integridade a cada serviço dependente por vez. Dessa forma, você pode obter uma lista de sistemas saudáveis em execução e saber facilmente quando alguém fica mal e qual é!
fonte
Na minha experiência, serviços críticos tendem a ter os seguintes recursos:
Batimento cardiaco
Se o serviço for executado regularmente, isso apenas grava uma linha em um arquivo de log ou similar, juntamente com um carimbo de data / hora para indicar que o corpo do serviço entrou em ação em um determinado momento.
Migalhas de pão
De maneira semelhante ao acima, as trilhas de navegação geralmente são apenas um despejo do nome do método (e ocasionalmente dos parâmetros) para mostrar que o serviço está processando o corpo do serviço conforme o esperado e o paradeiro do fluxo. Como eles podem gerar mais saída, geralmente são controlados por arquivos de configuração ou similares, para que possam ser desativados assim que o serviço for instalado.
Pode ser tentador adicionar muitas outras coisas, como o estado de vários servidores, serviços e bancos de dados, etc. Embora isso seja sem dúvida valioso, eu aconselho a não escrever nada muito extenso. Isso pode ser útil para sua própria paz de espírito, mas essas salvaguardas tendem a ser abusadas quando as partes encarregadas dos vários pontos de contato souberem que estão lá. Antes que você perceba, você pode escrever um aplicativo de diagnóstico para toda a empresa.
fonte