MELT: Metricas, Eventos, Logs e Rastreamentos (para melhoria de performance)
Métricas para Monitoramento de Desempenho
Métricas são indicadores numéricos que fornecem uma visão geral do desempenho de um sistema. Elas permitem modelagem matemática e previsão, que podem ser representadas em estruturas de dados específicas. Exemplos de métricas úteis para entender o comportamento do sistema incluem:
- Utilização de CPU
- Taxa de erros
Utilizar métricas tem várias vantagens, como facilitar a retenção de dados a longo prazo e simplificar consultas. Isso as torna excelentes para a construção de painéis que exibem tendências passadas através de múltiplos serviços.
Eventos para Rastreamento e Detecção de Problemas
Eventos no monitoramento são ocorrências discretas com valores temporais e numéricos precisos, permitindo rastrear eventos críticos e detectar possíveis problemas relacionados a solicitações de usuários. Ou seja, são ações que aconteceram em um sistema em um determinado momento.
Como os eventos são extremamente sensíveis ao tempo, eles geralmente vêm com marcas de tempo. Os eventos também fornecem contexto para os dados de métricas. Podemos usar eventos para identificar os pontos mais críticos do nosso aplicativo, dando maior visibilidade sobre os comportamentos do usuário que podem afetar o desempenho ou a segurança. Exemplos de eventos incluem:
- Tentativas de login
- Notificações de alerta
- Solicitações e respostas HTTP
Logs para Depuração e Monitoramento
Os logs fornecem um registro descritivo do comportamento do sistema em um determinado momento, sendo uma ferramenta essencial para depuração. Analisando os dados de log, podemos obter insights sobre o desempenho do aplicativo que não são acessíveis por meio de APIs ou bancos de dados.
Uma explicação simples é que os logs são um registro de todas as atividades que ocorrem dentro do sistema.
Os logs podem assumir várias formas, como texto simples ou objetos JSON, permitindo diversas técnicas de consulta. Isso torna os logs um dos dados mais úteis para investigar ameaças de segurança e problemas de desempenho.
Para obter o máximo proveito dos logs, é essencial agregá-los em uma plataforma centralizada. Isso ajuda a encontrar e corrigir erros rapidamente, além de monitorar o desempenho do aplicativo.
Rastreamentos para Visibilidade de Sistemas Distribuídos
Um rastreamento se refere ao caminho completo de uma solicitação ou fluxo de trabalho à medida que ela progride através dos componentes de um sistema distribuído, capturando o fluxo da ponta a ponta.
Portanto, é uma coleção de operações que representam uma transação única manipulada por um aplicativo e seus serviços constituintes. Um span representa uma única operação dentro de um rastreamento. O span é um elemento fundamental em um sistema distribuído e no rastreamento distribuído.
Os rastreamentos oferecem insights sobre a direcionalidade e os relacionamentos entre dados, fornecendo informações sobre interações de serviço e os efeitos da assincronicidade. Analisando os dados de rastreamento, podemos entender melhor o desempenho e o comportamento de um sistema distribuído.
Alguns exemplos de rastreamentos incluem:
- Execução de consultas SQL
- Chamadas de função durante solicitações de autenticação
A instrumentação para rastreamento pode ser desafiadora, pois cada componente de uma solicitação deve ser modificado para transmitir dados de rastreamento. Além disso, muitos aplicativos são baseados em estruturas ou bibliotecas de código aberto que podem exigir instrumentação adicional.
Tipos de Logs
Existem vários tipos comuns de logs que são importantes para engenheiros de software e administradores de sistemas:
-
Logs de Auditoria: Registram informações sobre atividades do usuário, mudanças de configuração, autenticação e autorização. Geralmente incluem informações como identificação do usuário, endereço IP, data/hora, ação realizada, status, etc.
-
Logs de Sistema: Registram mensagens e eventos do sistema operacional, serviços ou aplicações. Incluem informações sobre erros, falhas, execução de processos, uso de recursos, etc.
-
Logs de Depuração (Debug): Fornecem informações detalhadas e em nível técnico para depuração de erros e problemas. Costumam incluir variáveis, estados de execução de funções/métodos, queries, etc.
OpenTelemetry
O OpenTelemetry é um conjunto de APIs, bibliotecas, agentes e coletores que ajudam a capturar e registrar informações sobre o desempenho e o comportamento de aplicativos distribuídos. Com o OpenTelemetry, você pode coletar, analisar e visualizar dados de telemetria, como rastreamento, métricas e logs, de uma maneira padronizada e interoperável.
Leia sobre o OpenTelemetry, um Framework de observabilidade de código aberto que ajuda a coletar dados de telemetria de uma variedade de fontes na nuvem.
Emissão e Captura de Logs
As principais ferramentas e tecnologias para emissão e captura de logs incluem:
-
Bibliotecas de Logging: Fornecem APIs e recursos para que aplicações gerem e gravem logs de maneira padronizada (ex: log4j, log4net).
-
Agentes de Coleta de Logs: Instalados junto às aplicações para capturar logs e enviá-los a um servidor central (ex: Splunk Universal Forwarder, Logstash).
-
Syslog: Protocolo padrão para mensagens de log, permitindo envio em rede para servidores syslog (ex: rsyslog, syslog-ng).
-
Beats: Leves agentes de coleta de logs e métricas para o Elasticsearch (ex: Filebeat, Metricbeat).
Processamento e Análise de Logs
Uma vez coletados, os logs precisam ser processados e analisados. Algumas soluções incluem:
-
Splunk: Plataforma líder para indexação, análise e visualização de logs com recursos avançados de busca, alertas, painéis e integrações.
-
Elastic Stack: Conjunto de ferramentas open-source da Elastic para ingestão (Logstash), armazenamento (Elasticsearch), visualização (Kibana) e análise de logs.
-
Datadog: Serviço de monitoramento com capacidades de processamento e análise de logs em grande escala na nuvem.
-
Graylog: Solução open-source para gerenciamento centralizado de logs com busca em texto completo, análises, alertas e painéis.
-
Sentry.io: Plataforma de monitoramento de erros e desempenho de aplicações. Captura exceções, erros e problemas de desempenho em tempo real. Possui recursos avançados de agrupamento de erros, rastreamento de problemas, alertas e integrações com ferramentas de desenvolvimento. Se destaca por permitir uma rápida detecção e triagem de bugs de software, especialmente em ambientes de produção. É amplamente utilizado para aplicações web e mobile.
-
Grafana Logs: é o sistema de agregação de logs totalmente gerenciado desenvolvido pela Grafana Loki que permite armazenar e consultar logs de todos os seus aplicativos e infraestrutura – sem se preocupar com volumes de log, custos ou limites de armazenamento.
O que é APM?
-
APM (Application Performance Management/Monitoring) é um conjunto de ferramentas para monitorar e gerenciar o desempenho e disponibilidade de aplicações.
-
Fornece visibilidade sobre como as aplicações se comportam em produção.
-
Permite que equipes identifiquem e resolvam problemas de desempenho.
Principais componentes:
-
Monitoramento: coleta métricas como tempos de resposta e taxas de erro.
-
Análise: identifica padrões e tendências nos dados coletados.
-
Diagnóstico: determina as causas raiz dos problemas de desempenho.
Diferenças para ferramentas tradicionais:
-
Foco na experiência do usuário final e no desempenho geral da aplicação.
-
Análises no nível da função e distribuição de uso de recursos no código.
-
Insights específicos para melhoria de código e desempenho.
Benefícios do APM:
-
Melhor visibilidade em tempo real do desempenho.
-
Detecção e resolução mais rápida de problemas.
-
Otimização do desempenho e eficiência da aplicação.
APM para Node.js:
-
Ajuda a identificar gargalos de I/O assíncrono e vazamentos de memória.
-
Fornece insights para melhor gerenciamento de concorrência e escalabilidade.
-
N|Solid da NodeSource é especializado para Node.js: mais eficiente, foco em segurança, métricas específicas.
Caso de Uso - Melhorando a Latência Entre Serviços
Problema
Através do monitoramento do Datadog, identificamos que o endpoint /test tem duas solicitações:
- Uma para o app1
- Outra para o app2
Ambas com latência considerável.
O que é AWS Service Discovery?
O AWS Service Discovery é um serviço da AWS que permite que aplicativos localizem e se conectem automaticamente a outros serviços em tempo de execução, sem precisar saber a localização física desses serviços. Isso é particularmente útil em ambientes de microsserviços, onde novos serviços estão constantemente sendo adicionados, removidos ou movidos.
Como o Service Discovery melhora a latência?
Sem o Service Discovery, quando um aplicativo precisa se comunicar com outro, geralmente precisa passar pelo API Gateway, que atua como um ponto de entrada centralizado. Isso pode adicionar latência à comunicação, especialmente se os serviços estiverem em regiões ou redes diferentes.
Com o Service Discovery, os aplicativos podem se conectar diretamente uns aos outros, sem precisar passar pelo API Gateway. Isso reduz o número de "saltos" na rede, diminuindo a latência entre os serviços.
Além disso, o Service Discovery permite que os aplicativos encontrem dinamicamente os endereços e portas dos serviços com os quais precisam se comunicar, eliminando a necessidade de configuração manual ou do uso de um serviço DNS externo.
Como o Service Discovery funciona na AWS?
O Service Discovery na AWS é fornecido pelo serviço AWS Cloud Map. O Cloud Map permite que você registre seus serviços e os torne descobríveis para outros aplicativos.
Quando um aplicativo precisa se comunicar com outro serviço, ele consulta o Cloud Map para obter as informações necessárias, como o endereço IP e a porta do serviço de destino. Isso é feito de forma transparente para o aplicativo, que simplesmente usa o nome do serviço em sua URL.
O Cloud Map também pode fornecer recursos adicionais, como verificações de integridade e failover automático, para garantir a disponibilidade e a resiliência dos serviços.
Solução
O que fizemos foi, através do AWS Cloud Map, conectar os dois serviços diretamente na mesma rede, o que resultou em um melhor resultado.
Configure o Service Discovery seguindo este artigo.
No Cloud Map, obtenha o nome do seu serviço:
No Route53, obtenha o nome do registro A:
Também precisamos da porta do contêiner, que você pode obter da definição de tarefa do contêiner:
A etapa final é substituir a URL base no aplicativo por:
http://{register-name}:{containerPort}
Saiba mais aqui.