Para desenvolver regras de gravação e alerta no Grafana Mimir, é necessário configurar adequadamente o ambiente de armazenamento e as métricas associadas a essas regras. A configuração básica começa com a definição do armazenamento de regras, com a opção ruler_storage, onde o backend será o filesystem, e o diretório de armazenamento será configurado em /tmp/mimir/rules. O papel principal das regras de alerta é o monitoramento das métricas, já que logs, traces e profiles não são adequados para o desenvolvimento de regras complexas. Por isso, a conversão de sinais em métricas e a criação de regras baseadas nelas se torna uma prática essencial.

Para o Loki, que é uma ferramenta de logs integrada ao Grafana, pode-se usar uma regra de gravação baseada no Prometheus. Com isso, é possível criar uma métrica para o Loki e utilizá-la em uma regra de alerta. Por exemplo, a configuração de uma regra para monitorar o uso do disco pode ser feita da seguinte maneira:

yaml
groups:
- name: Loki logs disk usage
interval: 1m rules: - record: logs_bytes_over_time_1m expr: | bytes_over_time({job="hotrod"}[1m])

Neste exemplo, a métrica logs_bytes_over_time_1m é gerada para monitorar o uso de disco em logs ao longo do tempo. Essa abordagem pode ser adaptada para outros tipos de dados de logs, ajustando as expressões conforme necessário.

A configuração do Loki também é importante para garantir que o sistema funcione adequadamente. Por exemplo, é possível definir o armazenamento de regras no Loki como local, especificando o diretório onde as regras serão armazenadas. A configuração de escrita remota também pode ser ativada para enviar dados para um endpoint de API Prometheus, como no caso do Loki configurado para http://localhost:9090/api/v1/write.

Em ambientes com múltiplos inquilinos (multitenancy), é importante lembrar que as regras de gravação e alerta devem ser desenvolvidas individualmente para cada inquilino. Isso implica que os logs, traces e métricas precisam ser isolados por inquilino para evitar sobreposição de dados e garantir a integridade das informações de cada usuário ou cliente. Embora a multitenância possa aumentar a confiabilidade do sistema, sua configuração pode ser complexa, especialmente em organizações com estruturas difíceis. Caso sua estrutura organizacional não exija multitenância, não há necessidade de forçar essa configuração.

Além disso, a propagação de traces a partir de sistemas de monitoramento front-end (como o RUM - Real User Monitoring) para os traces do backend também é um aspecto relevante quando se fala em observabilidade. O Dynatrace, por exemplo, oferece funcionalidades para monitorar o frontend e associar as sessões e ações do usuário com traces de backend. Contudo, a falta de um padrão claro para a propagação de dados de RUM para traces tem sido um desafio. O OpenTelemetry fornece APIs que permitem o desenvolvimento de traces em web apps utilizando JavaScript, Swift e Kotlin, mas é comum que diferentes soluções de RUM adotem abordagens variadas para essa propagação.

No caso de soluções comerciais, o RUM frequentemente não suporta traces distribuídos e, ao invés disso, passa as informações de sessão e ação de usuários por cookies, o que pode dificultar a integração com o sistema de traces backend. Por outro lado, em soluções open-source, o RUM já está integrado diretamente no trace, fazendo com que tanto o frontend quanto o backend compartilhem a mesma estrutura de trace.

É importante compreender que, em soluções comerciais, as ações do usuário e as interações com o frontend são armazenadas em eventos e não diretamente em traces. Esses eventos podem ser gerados de diversas formas, como ao capturar cabeçalhos e corpos de requisições ou por meio de hooks externos. Para correlacionar os dados de RUM com traces, a conexão entre os eventos e os traces é feita via cookies, o que pode requerer o uso de bancos de dados separados para armazenar essa estrutura. A análise de dados e a criação de relatórios empresariais podem ser realizadas por meio da utilização dos IDs gerados pelos RUM para construir consultas em dashboards e alertas.

É fundamental entender que no contexto de RUM, há diversos identificadores (IDs) envolvidos, como o ID de sessão e o ID de ação do usuário. Cada evento de carregamento ou ação do usuário pode gerar múltiplos traces, dependendo da interação realizada. Se um servidor API ou CDN não suporta a geração de traces, a análise e a resolução de problemas relacionados a falhas podem ser mais difíceis, uma vez que o fluxo de tráfego não será visível de forma clara nos traces.

Por fim, a configuração e implementação de um sistema de observabilidade eficaz dependem da integração correta entre os dados gerados no frontend, as métricas e as traces no backend. A correta configuração das ferramentas, o entendimento do fluxo de dados e a adoção de práticas como a criação de métricas baseadas em logs são essenciais para garantir que as regras de alerta e monitoramento funcionem corretamente, proporcionando insights valiosos para a análise de causas raiz e a otimização da infraestrutura de TI.

Como as Traces, Logs e Métricas Se Relacionam na Observabilidade de Microserviços?

A observabilidade em arquiteturas de microserviços envolve uma análise detalhada de logs, traces e métricas, cada uma oferecendo uma perspectiva diferente dos eventos que ocorrem em um sistema. Para melhorar a visibilidade de um sistema complexo, a combinação de dados provenientes dessas fontes é essencial. Um dos métodos mais eficazes de melhorar a observabilidade de um serviço sem a necessidade de modificar o código da aplicação é ajustar a configuração de arquivos de log. Isso é simples de implementar e proporciona insights imediatos, especialmente quando se busca resolver problemas em um curto período de tempo.

Quando se trabalha com ferramentas como OpenTelemetry ou agentes comerciais de observabilidade, o foco está na reutilização das bibliotecas específicas de cada linguagem, expandindo suas funcionalidades. As traces, geradas por diferentes ferramentas, podem ter anotações variadas, mas todas têm um ponto em comum: a identificação do contexto de execução. Por exemplo, o OpenTelemetry usa trace_id e span_id, enquanto soluções comerciais como Dynatrace e Datadog utilizam dt.trace_id e dt.span_id. O mesmo se aplica ao uso de "x-" em cabeçalhos de mensagens, como x-dynatrace, onde o contexto do trace é crucial para a correlação entre logs e traces.

A correlação entre logs e traces não deve se limitar apenas às mensagens de erro, mas também ao código de erro associado. É importante entender que os erros gerados pelas traces podem ser mais detalhados, uma vez que são originados diretamente pelos microserviços, enquanto os logs refletem a perspectiva do usuário final. Por exemplo, um erro gerado por uma trace no backend será mais técnico e específico, enquanto um erro registrado no log provavelmente refletirá a experiência do usuário com um código de erro mais genérico, associado a falhas de rede ou de serviço. A discrepância entre os erros nos diferentes níveis do sistema (backend e frontend) requer uma análise cuidadosa para determinar qual erro está mais próximo da causa raiz e como ele afeta o usuário final.

No contexto de microserviços, os erros podem se propagar ao longo da arquitetura, gerando uma gama de códigos de erro que exigem uma gestão eficiente. A primeira consideração é: qual erro está mais próximo da causa raiz? Quanto mais perto você estiver dessa origem, mais rápido será o processo de resolução. Contudo, não se deve negligenciar o impacto desses erros sobre os usuários, que pode ser mais significativo. Se um serviço falhar ou parar de funcionar, é crucial determinar a quantidade de usuários afetados e aplicar estratégias de recuperação. A perspectiva técnica do problema se conecta diretamente com a visão de negócios, pois é necessário compreender o impacto da falha e quantificar as perdas, para que decisões informadas sejam tomadas.

Além disso, em um ambiente de microserviços, muitas vezes é necessário investigar as causas de falhas a partir de diferentes pontos de vista: o impacto na infraestrutura ou na aplicação. Usar ferramentas como o Cilium, que fornece dados detalhados sobre protocolos de rede, pode ajudar a distinguir se o problema está na rede ou na aplicação. Quando ocorre uma falha em um serviço, a primeira questão que surge é: essa falha foi causada pela rede ou pela aplicação? Saber a resposta imediatamente pode agilizar o processo de resolução, evitando discussões longas e ineficazes entre diferentes equipes.

Outro aspecto importante na observabilidade é a conexão entre traces e métricas. Ferramentas como Grafana permitem explorar traces e transformá-los em métricas, oferecendo uma visão mais clara dos dados relacionados a cada span. A utilização dessa funcionalidade pode ser ativada por meio de ajustes na configuração do Grafana, permitindo que os dados dos spans sejam consultados e analisados diretamente. A relação entre traces e métricas possibilita identificar tendências e agregações de dados, facilitando a detecção de problemas e padrões recorrentes no sistema.

Os mapas de serviços, frequentemente utilizados em observabilidade, ajudam a ilustrar o fluxo das execuções dos microserviços e suas dependências. O Grafana Tempo, por exemplo, gera automaticamente esses mapas, permitindo visualizar o caminho percorrido pelos serviços e identificar falhas no processo. No entanto, quando o número de microserviços é grande, esses mapas podem se tornar complexos e difíceis de interpretar. Por isso, é aconselhável exibir apenas os serviços diretamente relacionados ao problema, facilitando a análise do caminho crítico.

Entender as relações entre microserviços é essencial, mas isso não basta para solucionar os problemas. É preciso ir além e entender como cada microserviço impacta as métricas do sistema como um todo. O uso de métricas permite quantificar o impacto das falhas, oferecendo uma visão mais clara da performance e da estabilidade do sistema.

Em resumo, a chave para uma observabilidade eficaz em um ambiente de microserviços é a correlação entre logs, traces e métricas, permitindo que os problemas sejam identificados, analisados e resolvidos com rapidez e precisão. A implementação de um sistema bem configurado de observabilidade não apenas melhora a resolução de problemas técnicos, mas também ajuda a mitigar os impactos para os usuários finais, assegurando uma experiência mais confiável e contínua.