A implementação de métricas e observabilidade em sistemas distribuídos, como microserviços, é uma necessidade crescente em ambientes de produção. O uso de ferramentas como Grafana, Prometheus, Tempo, Loki e OpenTelemetry facilita o monitoramento de métricas essenciais, além de permitir a coleta e visualização de traces, logs e outros sinais de observabilidade. No entanto, a configuração e integração dessas ferramentas podem parecer desafiadoras sem uma abordagem clara.

Neste contexto, uma demonstração prática é útil para visualizar o processo de geração de métricas automaticamente a partir de traces, utilizando a tecnologia de spanmetrics. O processo começa com a configuração de servidores e aplicações, como Prometheus, Loki, Tempo e Promtail, que juntos geram e coletam métricas e traces.

Primeiramente, é necessário instalar as ferramentas em servidores distintos. No servidor A, instalam-se Prometheus, Promtail e Tempo. No servidor B, o Loki é configurado. O processo inicia com a execução do Grafana, que deve ser iniciado através do comando systemctl start grafana-server. Em seguida, o Tempo e o Promtail são configurados para começar a coleta de métricas, enquanto o Prometheus é responsável por monitorar essas métricas, configurando o arquivo de configuração adequado para os parâmetros de coleta e armazenamento.

A configuração do Tempo é crucial para garantir que ele funcione corretamente. A opção metrics_generator_enabled deve ser ativada, e o parâmetro metrics_generator_processors deve ser configurado para incluir as métricas relevantes, como service-graphs e span-metrics. Adicionalmente, a configuração de remote_write deve apontar para o endereço do Prometheus, para garantir que os dados gerados sejam enviados corretamente para a coleta e visualização.

Uma parte importante da observabilidade é a capacidade de conectar diferentes sinais de dados, como logs e traces. Em Grafana, é possível configurar facilmente a correlação entre logs e traces, o que permite identificar a origem de problemas com maior agilidade. Essa correlação pode ser realizada através de campos derivados que incluem o ID do trace nos logs, ou até mesmo incluindo logs dentro do contexto de um trace. Essas configurações são feitas de maneira simples no painel de configuração do Grafana, sem a necessidade de grandes desenvolvimentos.

Além disso, a implementação de observabilidade em uma aplicação real é muitas vezes mais complexa. Para gerar dados significativos, é necessário um gerador de carga, que simula tráfego de produção, incluindo erros, para garantir que o sistema seja testado de forma realista. Isso pode ser feito com ferramentas como o Docker, mas o Kubernetes é preferível em ambientes de produção devido à sua escalabilidade, resiliência e suporte para sistemas distribuídos.

No exemplo dado, o "New Stack" (TNS) serve como uma aplicação de demonstração de observabilidade, composta por três camadas: frontend, backend e gestão de dados. O frontend é responsável por enviar requisições, enquanto o backend recebe essas requisições e interage com a camada de armazenamento. Para fins de demonstração, o armazenamento utilizado não é um banco de dados físico, mas uma aplicação que simula esse comportamento. A configuração de métricas e logs em TNS segue as melhores práticas de observabilidade, utilizando Prometheus para coleta de métricas e OpenTelemetry para rastreamento de traces.

Em relação ao armazenamento de métricas, o Prometheus pode ser configurado para coletar dados diretamente do TNS, e o Grafana pode ser utilizado como gateway para gerenciar as métricas, logs e traces. Para habilitar o recurso de exemplares, é necessário configurar o OpenMetrics e garantir que os dados de métricas sejam enviados para o servidor Prometheus corretamente.

A observabilidade é uma prática essencial para garantir que sistemas distribuídos e microserviços funcionem corretamente. A combinação de ferramentas como Grafana, Tempo, Loki e Prometheus, junto com práticas de configuração e integração, fornece uma base robusta para monitoramento, coleta de métricas e análise de dados de logs e traces.

É importante lembrar que a observabilidade vai além da simples coleta de dados. É fundamental configurar corretamente as ferramentas e garantir que elas possam trabalhar em conjunto para fornecer uma visão clara e precisa do estado da aplicação. O uso adequado das tecnologias de OpenTelemetry, Grafana e Prometheus, em particular, permite aos desenvolvedores monitorar eficientemente sistemas complexos, identificar gargalos e problemas de desempenho, e realizar análises detalhadas de falhas, o que leva a uma maior confiabilidade e desempenho do sistema.

Como Organizar a Observabilidade em Sistemas Complexos e Legados

A implementação da observabilidade em sistemas complexos, particularmente aqueles que combinam tecnologias modernas com legados, é um desafio constante para engenheiros de confiabilidade de sites (SREs) e equipes de desenvolvimento. A principal dificuldade reside na capacidade de correlacionar sinais de diferentes fontes e gerar insights a partir deles de forma eficiente, sem sobrecarregar os sistemas ou os engenheiros envolvidos. O uso de tags e painéis de visualização é comum, mas a adição manual de tags e a criação de pipelines muitas vezes se tornam ineficazes e dispendiosas. A verdadeira força da observabilidade reside na capacidade de minimizar o trabalho manual e permitir que as correlações entre dados sejam feitas automaticamente, proporcionando uma visão clara e integrada da infraestrutura e das aplicações.

As ferramentas de visualização, por exemplo, desempenham um papel fundamental na análise de causas raízes. No entanto, a criação de dashboards eficientes exige mais do que simplesmente aplicar gráficos de forma aleatória. Antes de apresentar um gráfico, é essencial organizar os dados de maneira padronizada, de acordo com um modelo de dados de análise de causas raízes. Ao fazer isso, torna-se possível aplicar filtros, junções e buscas que resultam em painéis interativos e dinâmicos, capazes de correlacionar diferentes sinais de forma inteligente. Essa estrutura de dados bem organizada não apenas facilita a análise de problemas, mas também torna a resolução mais rápida e precisa.

Em um contexto de observabilidade, não é necessário o uso de múltiplos painéis de controle. Dois painéis bem projetados são suficientes para a análise de causas raízes, desafiando a ideia de que é necessário um número infinito de dashboards para lidar com a complexidade das operações modernas. Ao desenvolver um painel de controle de causa raiz, é fundamental que ele não seja apenas uma lista de métricas, mas sim uma ferramenta que conte uma história. Este painel deve proporcionar contexto e clareza sobre a situação atual, ajudando o usuário a identificar quais dados precisam ser analisados mais profundamente, e apontando possíveis causas para o problema. Painéis que não fazem essa correlação entre causa e efeito são inúteis, pois não oferecem uma visão real do que está acontecendo no sistema.

A implementação eficaz da observabilidade, em particular por meio de traces, é outro aspecto essencial. Embora as métricas e os logs sejam ferramentas valiosas, elas não fornecem o nível de detalhamento necessário para diagnosticar e solucionar problemas complexos. Tracing, por outro lado, permite uma visibilidade mais profunda, mostrando não apenas o comportamento de um sistema como um todo, mas também a interação entre diferentes componentes. Esse nível de detalhamento é especialmente importante em ambientes distribuídos, como os que envolvem microserviços. Ao configurar o tracing, no entanto, surgem diversos desafios, especialmente quando se lida com sistemas legados.

A configuração de traces não é uma tarefa simples, principalmente quando se trata de sistemas legados ou quando se trabalha com múltiplas tecnologias e protocolos diferentes. O uso de soluções comerciais, como Datadog ou Dynatrace, pode ser vantajoso pela sua maturidade e suporte, mas também apresenta o risco de dependência de fornecedor e custos elevados. Por outro lado, as soluções de código aberto, embora mais flexíveis, frequentemente enfrentam desafios em termos de suporte técnico e uma curva de aprendizado íngreme. A solução ideal pode ser uma combinação de ambas as abordagens, permitindo o aproveitamento das vantagens de cada uma, ao mesmo tempo em que minimiza suas desvantagens.

Em sistemas que misturam tecnologia moderna com legados, o grande desafio está na integração das diferentes formas de tracing. Muitos sistemas legados, como mainframes e servidores de mensagens (JMS, por exemplo), não possuem suporte nativo para tracing ou requerem configurações manuais que são complexas e suscetíveis a erros. Além disso, as diferenças entre as tecnologias podem tornar a correlação de dados um processo trabalhoso e suscetível a falhas. A chave para o sucesso é organizar os traces de forma sistemática, utilizando ferramentas como o KUtrace, que permite organizar e correlacionar traces distribuídos com os recursos do sistema, algo que ainda não é amplamente suportado pelas soluções comerciais.

Em um ambiente corporativo, a presença de sistemas legados é praticamente garantida, especialmente em organizações de médio e grande porte. Tais sistemas são muitas vezes responsáveis por processar transações críticas, o que torna a migração para novas tecnologias um processo delicado. Além disso, a adoção de novas tecnologias é frequentemente retardada pela resistência a mudanças, pela falta de habilidades internas ou pelo medo de riscos associados ao desconhecido. Mesmo quando se trata de startups, a falta de uma infraestrutura de TI madura pode ser uma barreira significativa, tornando a adoção de tecnologias modernas mais difícil do que parece à primeira vista.

Portanto, a implementação de tracing e observabilidade em sistemas legados não deve ser tratada como um simples processo técnico, mas como um esforço contínuo de aprendizado e adaptação. Em muitos casos, os engenheiros e SREs precisam ser criativos, experimentando diferentes abordagens e soluções, enquanto lidam com as limitações e complexidades dos sistemas existentes. A colaboração entre equipes de desenvolvimento e operações é fundamental para o sucesso dessa jornada, pois é necessário que todos trabalhem em conjunto para superar as dificuldades e garantir que a observabilidade seja uma ferramenta eficaz de diagnóstico e solução de problemas.

É crucial que, ao adotar ferramentas de observabilidade, as empresas não apenas busquem soluções imediatas para seus problemas técnicos, mas também adotem uma mentalidade de longo prazo, focada em melhorias contínuas. A implementação de tracing e outras soluções de observabilidade não deve ser vista como uma atividade pontual, mas como uma parte essencial da estratégia operacional da empresa. Afinal, a verdadeira eficiência vem da capacidade de antecipar problemas antes que eles se tornem críticos e de reagir rapidamente quando algo der errado.