A telemetria é uma tecnologia essencial para a coleta, transmissão e análise de dados remotos para um sistema central, permitindo o monitoramento e a gestão eficiente do sistema e seus processos. Facilita o acompanhamento em tempo real de parâmetros críticos. Ao integrar sensores, sistemas de comunicação e plataformas de análise de dados, a telemetria proporciona maior eficiência, segurança e precisão na gestão de recursos e processos.
A importância da telemetria é agilizar os processos de análise da aplicação, permitindo visualizar onde estão ocorrendo erros, fazer comparações entre aplicações de diferentes usuários, verificar e identificar causadores de lentidão e gargalos no sistema.
OpenTelemetry é um framework de observabilidade e toolkit projetado para criar e gerenciar dados de telemetria, como rastreamentos, métricas e logs. No momento, estamos usando apenas traces de OpenTelemetry no sistema.
Para que a telemetria seja habilitada dentro do T6, adicione uma entrada em seu appsettings.json
para informar a URL para onde os dados da telemetria serão enviados. Conforme o exemplo abaixo:
{
"TELEMETRY_TRACE_URL" : "<verifique o endereço do endpoint com um administrador>"
}
Para que a telemetria funcione, após adicionar a entrada da URL, é necessário executar o T6 Enterprise. Caso o T6 já esteja sendo executado, pare a execução e inicie ela novamente.
Tracing: Sempre que quisermos mensurar o consumo de tempo de uma ação, usamos o tracing, internamente ele tem um objeto chamado "span".
Logs: O log nada mais é do que uma ocorrência em determinado momento durante a execução da ação.
Métricas: Podemos adicionar e criar métricas no produto, um exemplo de métrica poderia ser o número de requests por segundo.
Tag: é um atributo que colocamos no span.
Baggage: a diferença do baggage e da tag é que o baggage pertence à hierarquia dos spans, ou seja, quem for herdeiro de uma span que contém baggage, vai herdá-la também.
A seguir, um exemplo de um trace composto de 6 Spans (relações causais entre Spans em um único trace) :
Nossa primeira unidade é o request (span A), dentre as propriedades do span temos, um momento de início, um momento final (conseguimos delimitar a duração dele) e pontos internos, dentro de um span podemos ter vários outros spans. O span pode ter tags, para podermos filtrar e podermos identificar o span futuramente.
As vezes é mais fácil visualizarmos traces com um eixo de tempo como na imagem abaixo:
Para informações complementares, acesse OpenTelemetry.
O OpenTelemetry suporta os protocolos, gRPC (Google Remote Procedure Call) ou Proto Buffer.
Para visualizarmos o funcionamento, podemos utilizar em conjunto o Docker que permite criar, implantar e gerenciar arquivos em containers, garantindo que o software e suas dependências sejam executados em qualquer ambiente, e o projeto Jaeger, que é uma ferramenta de visualização de dados de telemetria open source. Ela recebe as informações do T6 Enterprise.
Com o Docker rodando, vamos executar o arquivo docker-compose.yml (arquivo utilizado para definir e executar aplicativos Docker multi-contêiner.) que irá habilitar o contêiner do Jaeger com a porta de destino para que possamos acessá-lo na web.
Observe um exemplo de arquivo docker-compose.yml:
version: "3.5"
services:
jaeger:
networks:
- backend
image: jaegertracing/all-in-one:${JAEGER_IMAGE_TAG:-latest}
volumes:
- "./jaeger-ui.json:/etc/jaeger/jaeger-ui.json"
command: --query.ui-config /etc/jaeger/jaeger-ui.json
environment:
- METRICS_STORAGE_TYPE=prometheus
- PROMETHEUS_SERVER_URL=http://prometheus:9090
- PROMETHEUS_QUERY_SUPPORT_SPANMETRICS_CONNECTOR=${PROMETHEUS_QUERY_SUPPORT_SPANMETRICS_CONNECTOR:-true}
- PROMETHEUS_QUERY_NAMESPACE=${PROMETHEUS_QUERY_NAMESPACE:-}
- PROMETHEUS_QUERY_DURATION_UNIT=${PROMETHEUS_QUERY_DURATION_UNIT:-}
- PROMETHEUS_QUERY_NORMALIZE_CALLS=true
- PROMETHEUS_QUERY_NORMALIZE_DURATION=true
ports:
- "16686:16686"
- "4317:4317"
networks:
backend:
jaegertracing/all-in-one
, que é uma solução para monitoramento e rastreamento distribuído.jaegertracing/all-in-one:${JAEGER_IMAGE_TAG:-latest}:
Utiliza uma imagem que permite o rastreamento distribuído. A tag da imagem é definida pela variável JAEGER_IMAGE_TAG
, ou latest
se não estiver definida../jaeger-ui.json
no contêiner no caminho /etc/jaeger/jaeger-ui.json
. Isso permite que o Jaeger use uma configuração de interface personalizada.--query.ui-config /etc/jaeger/jaeger-ui.json:
Configura o Jaeger para usar o arquivo de configuração especificado para a interface do usuário.Na tela do Jaeger, conseguimos ter uma visão de todos os traces que estão sendo executados na aplicação e o tempo de execução de cada um.
Podemos comparar os traces e exibir o detalhamento de cada um, exibindo a data e hora da execução, a duração de todas as requests juntas, o número de serviços, o grau de profundidade, os spans e suas tags, os processos e o tempo de duração de cada request. Observe os exemplos abaixo: