OpenTelemetry + Signoz
OpenTelemetry tem como objetivo padronizar a extração, transformação e exportação de dados por meio de um conjunto de SDKs e APIs evitando Vendor Lock-in. A instrumentação é “automática” e permite que você defina oque deseja instrumentar, por exemplo, Sql Server, HttpClient, Postgre, gRPC, etc. Opentelemetry atende os pilares da observabilidade (Trace, Metric e Log).
Para a visualização dos dados você pode escolher entre soluções gratuitas ou grandes player como Dynatrace, Microsoft, NewRelic, Datadog, Amazon, etc.
Muitos exemplos de OpenTelemetry utilizam um Agent Collector que pode estar dentro da mesma POD da sua aplicação ou em algum lugar no seu cluster. Na figura 1 , o agente está dentro da POD da Web API. O sistema envia os dados para o Collector que depois exporta para algum lugar.
Para deixar a prova de conceito (Proof Of Concept) mais simples utilizei o Signoz. Importante ressaltar que esse exemplo não quer dizer que é a melhor forma ou a pior. É mais uma forma de fazer.
Signoz é uma ferramenta de código aberto que possui o collector e dashboard para exibir os dados. Tem uma versão community e encontra-se no Github: https://github.com/SigNoz/signoz
A figura 2 demonstra como ficou os componentes, o collector encontra-se no Signoz e a aplicação exporta para utilizando o protocolo OTLP (OpenTelemetry Protocol). Várias soluções aceitam esse protocolo.
Vamos comentar trechos de códigos necessários para que a POC funcione. O Código encontra-se no Github:
https://github.com/hugobritobh/poc_opentelemetry
Na figura 3 abaixo apresenta a instrumentação das Métricas. Foi adicionado métricas para HttpClient (linha 30), AspNetCore (linha 31) e EventCounter (linha 32). Em modo debug visualizo os dados pelo console. Finalizando, exporto os dados para o Signoz (utilizando OTLP).
Na figura 4 abaixo apresenta a instrumentação do Trace. Foi adicionado para AWS (linha 58), AspNetCore (linha 59) e HttpClient (linha 60). Exportando os dados para o Signoz (utilizando OTLP).
É importante ressaltar que existem diversas instrumentações, mas para esse exemplo utilizei somente algumas. Outro ponto é que não utilizei a função de Log do OpenTelemetry, mas é possível fazer e visualizar no Signoz.
A figura 5 abaixo apresenta um tracing do projeto de exemplo Web API do C# exibido no Console.
A figura 6 abaixo apresenta um tracing do projeto Background Service (Console) do C#. Nesse código de exemplo, ocorre uma Application Exception (para exemplificar).
O próximo passo é instalar o Signoz para visualizar os dados. Você pode escolher um tutorial na própria página do Signoz. Nessa POC utilizei com docker: https://signoz.io/docs/install/docker/
Na figura abaixo apresenta um Dashboard do Signoz da aplicação Web API. É possível verificar tempo de resposta, percentual de erros e outros detalhes.
Na figura 8 pode-se ter uma visão geral do comportamento de uma aplicação que no caso foi a Test API.
É possível ver detalhes do Trace, isto é, percorrer o caminho que foi feito pela aplicação e até os valores das variáveis (dependendo da instrumentação que foi feita) conforme apresentado na figura abaixo.
Tem um menu onde podemos visualizar todas as exceções (Figura 10):
A Figura 11 apresenta detalhes de uma exception.
Quanto ao Dashboard para visualizar as métricas criei um somente para teste (para C#). Você pode importar o Json nesse link: https://github.com/hugobritobh/poc_opentelemetry/blob/main/Metric/Signoz/Dashboard/Metrics.json
Considero que o OpenTelemetry é o futuro (daqui um a dois anos). A sua utilização e instrumentação é bastante simples e você pode escolher algumas formas de fazer. Para ambiente que não possui nenhuma observabilidade utilizaria o OpenTelemetry. Entretanto, caso você tenha uma ferramenta de APM não substitua pelo OpenTelemetry nesse momento.
English version of the article: https://dev.to/hugobritobh/opentelemetry-signoz-49b3
Código no Github: https://github.com/hugobritobh/poc_opentelemetry
Github: https://github.com/hugobritobh