Skip to main content

Adicionando OTel ao Projeto Base

Uma vez com o projeto base na mão podemos adicionar a instrumentação deste código. Aqui temos um passo a passo como a sdk do OTel com NodeJS

Na pasta do projeto precisamos instalar algumas dependências.

npm install @opentelemetry/sdk-node \
@opentelemetry/api \
@opentelemetry/auto-instrumentations-node \
@opentelemetry/sdk-metrics \
@opentelemetry/sdk-trace-node

Isso irá atualizar o package.json que são todos os pacotes disponíveis para o código quando fazemos o npm install que cria a pasta node_modules que podemos usar no nosso código.

Para não precisar colocar isso ambos os códigos auth e todos vamos criar o instrumentation.js que será será o instrumentador e vamos instanciá-lo em auth e todos.

/*instrumentation.ts*/
// Importa os módulos necessários do OpenTelemetry
// NodeSDK é o componente principal para configuração da telemetria
import { NodeSDK } from '@opentelemetry/sdk-node';
// Fornece instrumentação automática para módulos Node.js comuns
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
// Exportador de traces no formato OTLP (OpenTelemetry Protocol)
import {OTLPTraceExporter} from '@opentelemetry/exporter-trace-otlp-proto';

// Função que inicializa a instrumentação do OpenTelemetry
// Recebe o nome do serviço como parâmetro
function start(serviceName: string) {
// Configura o exportador para enviar traces para o Jaeger
// através do protocolo OTLP na porta 4318
const traceExporter = new OTLPTraceExporter({
url: 'http://jaeger:4318/v1/traces',
});

// Cria e configura uma nova instância do SDK OpenTelemetry
const sdk = new NodeSDK({
traceExporter, // Exportador de traces configurado acima
serviceName:serviceName, // Nome do serviço para identificação
instrumentations: [getNodeAutoInstrumentations()] // Habilita instrumentação automática
});

// Inicia o SDK para começar a coletar e exportar telemetria
sdk.start();
}

// Exporta a função start para ser usada em outros módulos
export default start

Esse projeto vamos utilizar um exporter ao invés de utilizar um collector, ou seja vamo enviar direto para o Jaeger que vamos subir também colocando no docker-compose.yml.

version: '3.8'

services:
todo:
build:
context: .
dockerfile: docker/Dockerfile.todo
volumes:
- .:/usr/src/app:rw
- /usr/src/app/node_modules
ports:
- 8081:8080
depends_on:
- redis

auth:
build:
context: .
dockerfile: docker/Dockerfile.auth
volumes:
- .:/usr/src/app:rw
- /usr/src/app/node_modules
ports:
- 8080:8080

redis:
image: redis:alpine
ports:
- '6380:6379'

jaeger:
image: jaegertracing/all-in-one
ports:
- 4318
- 16686:16686
environment:
COLLECTOR_OTLP_ENABLED: true

Porém é necessário iniciar esse instrumentador em ambos os serviços auth e todos antes antes dos outros serviços iniciarem.

auth-service.ts

import start from './instrumentation';
start('auth-service')
// Restande do código...

todos-service.ts

import start from './instrumentation';
start('todo-service')
// Restande do código...

Cada aplicação precisar quer uma nome único para que possa saber de onde esta vindo e separar os sistemas. Se manter o mesmo nome irá mostra tudo de uma única cor no Jaeger depois.

Agora podemos subir novamente o docker compose.

docker componse up --build

No navegador faça acesse localhost:8081/todos para observar a resposta.

alt text

E vamos conferir o que aconteceu no Jaeger que roda em localhost:16686. Já temos o nosso primeiro trace.

alt text

Veja que as cores são diferentes (azul e amarelo) justamente por que estamos usando nomes diferentes nos exporters.

alt text

Essa parte do projeto esta na branch base_com_otel.