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/todo
s para observar a resposta.
E vamos conferir o que aconteceu no Jaeger que roda em localhost:16686
. Já temos o nosso primeiro trace.
Veja que as cores são diferentes (azul e amarelo) justamente por que estamos usando nomes diferentes nos exporters.
Essa parte do projeto esta na branch base_com_otel.