Recomendações para instrumentar um aplicativo
Aplica-se a esta recomendação da lista de verificação do Azure Well-Architected Framework Operational Excellence:
OE:07 | Crie e implemente um sistema de monitoramento para validar as escolhas de design e informar futuras decisões de design e negócios. Esse sistema captura e expõe a telemetria operacional, as métricas e os logs emitidos da infraestrutura e do código da carga de trabalho. |
---|
Guia relacionado: Recomendações para projetar e criar um sistema de monitoramento
Este guia descreve as recomendações para habilitar a observabilidade do seu aplicativo usando instrumentação. Gere telemetria significativa que pode ser ingerida e integrada ao seu sistema de monitoramento. Usando a instrumentação, você pode coletar informações sem entrar em um servidor de produção remoto para executar manualmente o rastreamento ou a depuração. Os dados de instrumentação incluem métricas e logs que você pode usar para avaliar o desempenho, diagnosticar problemas e tomar decisões de carga de trabalho.
Principais estratégias de design
Para otimizar a telemetria para sua carga de trabalho, instrumente seu aplicativo para gerar os seguintes dados:
Os logs são registros com carimbo de data/hora de eventos discretos. Existem três formas de logs: texto simples, estruturado e binário.
Os logs de rastreamento distribuído permitem que você veja o caminho de uma solicitação à medida que ela passa por diferentes serviços e componentes.
Métricas são valores numéricos que descrevem um aspecto de um sistema em um determinado momento.
Observação
Você pode usar ferramentas como Application Insights, Dynatrace e Elastic Application Performance Monitoring para instrumentar automaticamente seu aplicativo. Essas ferramentas facilitam a instrumentação, mas também podem ser limitantes. Se você usar uma ferramenta de instrumentação automática, poderá adicionar mais recursos por meio de instrumentação manual, conforme necessário.
Usar logs estruturados e rastreamento
Use o registro estruturado para integrar facilmente os registros em plataformas de monitoramento e análise. Instrumente seu aplicativo para que os níveis de detalhamento possam ser alterados. O registro detalhado constante pode desperdiçar recursos de armazenamento, portanto, ele deve ser ativado e desativado conforme necessário para a solução de problemas.
Os logs de rastreamento contêm dados textuais ou dados binários criados a partir de um evento de rastreamento, se o aplicativo usar o ETW (Rastreamento de Eventos para Windows). Os logs do sistema geram conteúdo de log de rastreamento a partir de eventos na infraestrutura, como o servidor Web. O conteúdo do log textual foi projetado para ser lido por humanos, mas você deve garantir que ele seja escrito em um formato que um sistema automatizado também possa analisar.
Categorize os logs e use logs separados para registrar a saída de rastreamento de cada aspecto operacional do sistema. Se você categorizar seus logs, poderá filtrar rapidamente as mensagens de log em vez de processar um único arquivo longo. Nunca grave informações que tenham requisitos de segurança diferentes, como informações de auditoria e dados de depuração, no mesmo log.
Observação
Um log pode ser implementado como um arquivo no sistema de arquivos ou pode ser mantido em algum outro formato, como um blob no armazenamento de blobs. As informações de log também podem ser mantidas no armazenamento estruturado, como linhas em uma tabela.
Capturar métricas de aplicativos
Métricas, ou amostras, são uma contagem de algum aspecto ou recurso no sistema em um momento específico, com uma ou mais tags ou dimensões associadas. Uma única instância de uma métrica não é útil isoladamente, as métricas devem ser capturadas ao longo do tempo. Considere quais métricas você deve registrar e com que frequência. Os dados gerados com muita frequência podem impor uma carga pesada ao sistema, mas a captura de dados pouco frequente pode fazer com que você perca as circunstâncias que levam a um evento significativo. A frequência apropriada para a captura de dados pode variar de métrica para métrica. Por exemplo, o uso da CPU em um servidor pode variar significativamente de segundo para segundo, mas o alto uso só se torna um problema se for consistente por muitos minutos.
Facilite a correlação entre os componentes
Você pode monitorar facilmente contadores de desempenho individuais e no nível do sistema, capturar métricas para recursos e obter informações de rastreamento de aplicativos de vários arquivos de log. Alguns monitoramentos exigem correlação de dados durante o estágio de análise e diagnóstico no pipeline de monitoramento. Esses dados podem assumir várias formas e o processo de análise deve ser fornecido com dados de instrumentação suficientes para mapear essas diferentes formas. Por exemplo, no nível da estrutura do aplicativo, uma ID de thread pode identificar uma tarefa. Em um aplicativo, o mesmo trabalho pode ser associado ao ID do usuário que conclui essa tarefa.
É improvável que seja um mapa 1:1 entre threads e solicitações de usuário, pois as operações assíncronas podem reutilizar os mesmos threads para mais de um usuário. Para complicar ainda mais as coisas, uma única solicitação pode se correlacionar a mais de um thread à medida que flui pelo sistema. Se possível, associe cada solicitação a uma ID de atividade exclusiva que é propagada pelo sistema como parte do contexto da solicitação. A técnica para gerar e incluir IDs de atividade em informações de rastreamento depende da tecnologia usada para capturar os dados de rastreamento.
Todos os dados de monitoramento devem receber o selo de data/hora da mesma maneira. Para ter consistência, registre todas as datas e horas usando o Tempo Universal Coordenado.
Observação
Os computadores que operam em fusos horários e redes diferentes podem não estar sincronizados. Não dependa somente de carimbos de data/hora para correlacionar dados de instrumentação que abrangem várias máquinas.
Capture dados relevantes
Considere os seguintes pontos ao decidir quais dados de instrumentação você precisa coletar.
Dados legíveis por humanos
Certifique-se de que as informações capturadas por eventos de rastreamento sejam legíveis por máquina e por humanos. Adote esquemas bem definidos para essas informações para ajudar a implementar o processamento automatizado de dados de log em sistemas e fornecer consistência para a equipe de operações e engenharia que lê os logs.
Inclua as seguintes informações ambientais em seus dados:
- Ambiente de implantação
- Máquina de processamento
- Detalhes do processo
- Pilha de chamadas
Invista em rastreabilidade e correlação
Forneça contexto suficiente, como uma ID de atividade associada a uma instância específica de uma solicitação, para que o desenvolvedor ou administrador possa determinar a origem de cada solicitação.
O contexto de dados também pode incluir informações usadas para correlacionar uma atividade com o trabalho computacional realizado e os recursos usados. Este trabalho pode cruzar os limites do processo e da máquina.
Para medição, o contexto deve incluir direta ou indiretamente uma referência ao cliente que causou a solicitação. Esse contexto fornece informações valiosas sobre o estado do aplicativo no momento em que os dados de monitoramento foram capturados.
Capture todos os dados relevantes
Registre todas as solicitações e os locais ou regiões onde elas são feitas. Você pode usar essas informações para ajudar a identificar pontos de acesso específicos do local. Essas informações também podem ser úteis para determinar se é necessário reparticionar um aplicativo ou os dados que ele usa.
Registre e capture com cuidado os detalhes de exceções. As informações críticas de depuração geralmente são perdidas devido ao tratamento inadequado de exceções. Capture todos os detalhes de exceção que o aplicativo gera, incluindo exceções internas ou outras informações contextuais, como a pilha de chamadas, se possível.
Esforce-se para obter consistência de dados
Dados consistentes podem ajudá-lo a analisar eventos e correlacioná-los com as solicitações do usuário. Considere o uso de um pacote de log abrangente e configurável para coletar informações. Os pacotes de log podem ajudá-lo a evitar a dependência de desenvolvedores para adotar sua abordagem à medida que implementam diferentes partes do sistema.
Reúna dados, como volume de entrada/saída, número de solicitações e uso de memória, rede e CPU, dos principais contadores de desempenho. Alguns serviços de infraestrutura fornecem seus próprios contadores de desempenho, como:
- O número de conexões a um banco de dados.
- A taxa de transação.
- O número de transações que tiveram êxito ou falham.
Os aplicativos também podem definir seus próprios contadores de desempenho.
Considere dependências externas
Registre todas as chamadas de serviço externo. As chamadas externas podem ser feitas para:
- Sistemas de banco de dados.
- Serviços da Web.
- Outros serviços no nível do sistema que fazem parte da infraestrutura.
Registre informações sobre a duração de cada chamada e o sucesso ou falha da chamada. Se possível, capture informações sobre todas as tentativas de repetição e as falhas para quaisquer erros transitórios que ocorrem.
Garanta a compatibilidade do sistema de telemetria
Em muitos casos, as informações de instrumentação são geradas como uma série de eventos e passadas para um sistema de telemetria separado para processamento e análise. Um sistema de telemetria normalmente é independente de qualquer aplicativo ou tecnologia específica.
Os sistemas de telemetria usam esquemas definidos para analisar informações. O esquema especifica um contrato que define os campos e tipos de dados que o sistema de telemetria pode ingerir. Generalize o esquema para permitir que os dados cheguem de várias plataformas e dispositivos. Um esquema comum deve incluir campos relevantes para todos os eventos de instrumentação, como:
- Nome do evento.
- Hora do evento.
- Endereço IP do remetente.
- Detalhes necessários para correlação de eventos, incluindo:
- ID do Usuário
- ID do Dispositivo
- Application ID
Lembre-se de que muitos dispositivos podem gerar eventos para o mesmo aplicativo, portanto, o esquema não deve depender do tipo de dispositivo. O aplicativo deve dar suporte a roaming ou distribuição entre dispositivos. O esquema também pode incluir campos de domínio relevantes para um cenário específico que é comum em aplicativos, como:
- Informações sobre exceções.
- Eventos de início e término do aplicativo.
- Êxito ou falha de chamadas de API de serviço Web.
Estabeleça campos de domínio que produzam o mesmo conjunto de eventos para criar um conjunto de relatórios e análises comuns entre aplicativos. Talvez seja necessário configurar um esquema para conter campos personalizados para capturar os detalhes de eventos específicos do aplicativo.
O OpenTelemetry é uma coleção neutra de fornecedores de APIs, SDKs e outras ferramentas. Você pode usar o OpenTelemetry para instrumentar aplicativos e gerar telemetria significativa de forma consistente em todas as linguagens. O OpenTelemetry é independente de ferramentas, portanto, é compatível com muitas plataformas de observabilidade, incluindo ofertas comerciais e de software livre. A Microsoft está adotando o OpenTelemetry como a ferramenta padrão para instrumentação.
Otimizar o código de instrumentação
A lista a seguir resume as práticas recomendadas para instrumentar um aplicativo distribuído em execução na nuvem:
Logs facilitam a leitura e a análise. Use logs estruturados sempre que possível.
Seja conciso e descritivo nas mensagens de log.
Identifique a origem do log.
Adicione informações de carimbo de data/hora à medida que cada registro de log é gravado.
Use o mesmo fuso horário e formato para todos os selos de data/hora.
Categorize os logs e escreva mensagens no local apropriado.
Não revele informações confidenciais sobre o sistema ou informações pessoais sobre os usuários. Limpe essas informações antes de serem registradas, mas mantenha todos os detalhes relevantes.
Registre todas as exceções críticas, mas permita que o administrador ative e desative o logon conforme necessário para menos exceções e avisos.
Capture e registre todas as informações de lógica de repetição. Esses dados são úteis para monitorar a integridade transitória do sistema.
Rastreie chamadas fora do processo, como solicitações para serviços Web ou banco de dados externos.
Não misture mensagens de log com requisitos de segurança diferentes no mesmo arquivo de log.
Certifique-se de que todas as chamadas de log sejam operações de disparo e esquecimento que não bloqueiem o progresso das operações de negócios. Exclua eventos de auditoria dessa regra porque eles são críticos para os negócios.
Verifique se o registro em log é extensível e não tem dependências diretas de um destino concreto.
Certifique-se de que todos os registros em log sejam à prova de falhas e não disparem erros em cascata.
Trate a instrumentação como um processo iterativo contínuo e revise os logs regularmente.
Usar a criação de perfil do aplicativo
Implemente a criação de perfil somente quando necessário, pois ela pode impor uma sobrecarga significativa ao sistema. Usando a instrumentação, a criação de perfil registra um evento, como uma chamada de método, sempre que ele ocorre. No entanto, a amostragem registra apenas eventos selecionados.
As seleções de criação de perfil podem ser baseadas em tempo, como uma vez a cada n segundos, ou baseadas em frequência, como uma vez a cada n solicitações. Se os eventos ocorrerem com frequência, a criação de perfil poderá sobrecarregar demais o sistema e afetar o desempenho geral. Neste caso, a abordagem de amostragem é preferível. No entanto, se a frequência de eventos for baixa, a amostragem poderá perdê-los. Nesse caso, a criação de perfil pode ser a melhor abordagem.
Facilitação do Azure
A instrumentação automática está disponível para muitos tipos de aplicativos locais e do Azure monitorados com o Application Insights. A função de instrumentação automática configura automaticamente seu aplicativo para fornecer telemetria avançada ao Application Insights e fornece acesso fácil a experiências como o painel do aplicativo e o mapa do aplicativo. Para plataformas de hospedagem e linguagens de desenvolvimento com suporte, consulte Ambientes, idiomas e provedores de recursos com suporte.
Links relacionados
- Visão geral do Application Insights
- O que é instrumentação automática para o Application Insights?
- Visão geral dos logs do Azure Monitor
- Visão geral das métricas do Azure Monitor
- Coletando eventos ETW para análise de logs do Azure Monitor
- Recomendações para projetar e criar uma estrutura de observabilidade
- O que é o rastreamento distribuído e a correlação de telemetria?
Links da comunidade
Lista de verificação de Excelência Operacional
Consulte o conjunto completo de recomendações.