Autoras: Ilana Cabral Coutinho, Alícia Oliveira e Anna Raphaela Berto
A observabilidade é um conceito fundamental no desenvolvimento de software moderno, especialmente em sistemas distribuídos e microsserviços. Neste artigo, vamos explorar o que é observabilidade, suas técnicas e as ferramentas de mercado que podem ser utilizadas para implementá-la em projetos.
O que é Observabilidade?
Observabilidade é a capacidade de medir o estado interno de um sistema com base em sua saída externa. Em outras palavras, é a habilidade de entender o que está acontecendo dentro de um sistema apenas observando os dados que ele gera, como logs, métricas e traces.
Diferença entre Monitoramento e Observabilidade
- Monitoramento: Envolve coleta de dados sobre o desempenho e a saúde do sistema.
- Observabilidade: Vai além do monitoramento, permitindo uma compreensão profunda e a capacidade de diagnosticar problemas complexos.
Logs: O Primeiro Pilar da Observabilidade
Os logs são registros de eventos e atividades realizadas por um sistema. Esses registros são essenciais para monitorar, diagnosticar problemas e garantir a segurança e o desempenho das operações. Na observabilidade, um dos principais objetivos do uso de logs é obter insights valiosos, identificar padrões comportamentais e antecipar tendências de funcionamento de uma aplicação.
Boas Práticas para Logs
- Estruturação: Para facilitar a observabilidade, é fundamental que os logs sejam estruturados de forma padronizada para facilitar a leitura, manutenção e análise. Cada mensagem de log no formato JSON representa um objeto com pares chave-valor, facilitando a identificação dos dados. Essa padronização é capaz de melhorar as análises, a legibilidade e o acesso às informações geradas pelos logs.
Um exemplo em Java com a biblioteca Logback pode ser visto abaixo mostrando os níveis de logs que podemos capturar:
- Níveis de Log: Os logs podem ser categorizados de acordo com seu nível, de acordo com o tipo e objetivo que o log é implementado.
- INFO: serve basicamente para registrar informações gerais do sistema, não necessitam necessariamente de uma ação. Registram por exemplo logs de envio e recebimento bem sucedidos para atividades da aplicação.
- DEBUG: utilizado para caracterizar os logs que são utilizados para identificar características específicas ou debugar alguma funcionalidade do sistema. Utilizado principalmente para "troubleshooting" fornecendo informações técnicas.
- ERROR: identifica logs que de fato representam algum erro ou comportamento indesejado que requer ação necessária para reverter este estado.
A utilização desses níveis na categorização dos logs além de ser uma boa prática, otimiza a detecção de informações e possíveis problemas, permitindo a identificação de forma mais rápida.
Ferramentas de Logs: ELK Stack
Uma solução popular para gerenciamento de logs é o ELK Stack (Elasticsearch, Logstash, Kibana):
Elasticsearch: Armazenamento e busca de grandes volumes de dados.
Logstash: Processamento e transformação dos logs.
Kibana: Visualização dos logs em uma interface gráfica.
Tipos de logs e suas aplicabilidades
Existem diversos tipos de logs, cada um capturando informações específicas que necessitam ser analisadas para diferentes propósitos. Alguns tipos comuns e suas aplicações:
- Logs de Alteração: Registra as modificações realizadas em um sistema, como atualizações de configuração ou mudanças de código. Eles podem identificar a autoria e demais informações fundamentais para a rastreabilidade de mudanças.
Exemplo: Sistema que registra logs durante uma atualização de software com informações de alteração como quais arquivos foram modificados e por qual desenvolvedor, garantindo que todas as mudanças sejam documentadas.
- Logs de Acesso: Registra informações de acesso a um sistema, registrando pedidos de acesso, solicitação a acesso de arquivos, autenticação de usuários, assim como os dados do usuário. Esses logs são fundamentais para auditorias de segurança.
Exemplo: Implementação de logs para um usuário acessar ou editar um documento sensível, o sistema gera um log de acesso que registra a data, hora e informações de usuário, permitindo o rastreamento dos acesso aos documentos.
- Logs de ameaças: São logs que registram atividades suspeitas que ameaçam a segurança de um sistema. São particularmente úteis rastrear comportamentos anômalos e prevenir incidentes de segurança, como invasões, ataques de negação de serviço, ataques de força bruta, ou vazamento de dados e exploração de vulnerabilidades.
Exemplo: Logs de registro caso um usuário faça várias tentativas de login fracassadas, um log de ameaça é gerado, contendo o endereço IP, o horário das tentativas e informações do usuário. Com base nesses logs, o sistema pode disparar alertas ou bloquear o acesso após um número anormal de tentativas.
Métricas: O Segundo Pilar da Observabilidade
Métricas são dados quantitativos que medem o desempenho de um sistema e são essenciais para monitorar sua saúde e identificar tendências. Elas geralmente se dividem em dois grupos principais: métricas de sistema e métricas de aplicação. As métricas de sistema monitoram recursos como uso de CPU, memória e disco, enquanto as métricas de aplicação identificam aspectos como taxas de requisição, latências e erros. Essas métricas fornecem uma visão geral do comportamento do sistema tornando o acompanhamento mais eficiente.
Ferramentas para Métricas: Prometheus e Grafana
As mais populares para monitoramento de métricas incluem:
Prometheus: Ferramenta de código aberto para coleta e armazenamento de métricas como séries temporais.
Grafana: Plataforma de análise e monitoramento de dados que suporta várias fontes de dados, incluindo o Prometheus, ideal para criação de dashboards interativos.
Exemplo de monitoramento
Traces: O Terceiro Pilar da Observabilidade
O que são traces?
Os traces rastreiam o fluxo de uma requisição através de diferentes serviços em um sistema distribuído. Eles são cruciais para entender a latência e identificar gargalos. Os traces possuem como componentes os spans, que representam uma unidade de trabalho, e o Tracing ID, que é um identificador único para uma requisição completa.
Ferramenta para Tracing: Jaeger
Uma ferramenta popular para tracing é o Jaeger, que ajuda a monitorar e solucionar problemas de transações em sistemas distribuídos, facilitando a detecção de problemas de latência e gargalos.
Exemplo de Código em Java com OpenTelemetry e Jaeger
O Jaeger facilita a visualização do caminho percorrido por uma requisição e identifica pontos de falha ou lentidão.
Conclusão
A observabilidade desempenha um papel crucial na garantia do desempenho, segurança e confiabilidade de sistemas modernos, especialmente em ambientes complexos como os de microsserviços e sistemas distribuídos. Ao combinar logs estruturados, métricas precisas e traces detalhados, as equipes de desenvolvimento conseguem uma visão completa do estado e comportamento de suas aplicações, permitindo uma resposta rápida a problemas e a otimização contínua dos serviços.
Ferramentas como ELK Stack, Prometheus, Grafana e Jaeger são essenciais para implementar essa abordagem, oferecendo suporte para monitoramento, análise de dados e identificação de falhas. Quando bem implementada, a observabilidade não apenas melhora a capacidade de resposta e solução de problemas, mas também promove um desenvolvimento mais eficiente e resiliente, preparando as organizações para enfrentar desafios e evoluir suas aplicações de forma sustentável.