Configurando a Instrumentação
Existem várias coisas que valem a pena mencionar sobre a configuração do SDK.
Instrumentação
Precisamos entender o que é a instrumentação, onde definimos, e como podemos modificá-la ou configurá-la se necessário for.
A instrumentação é a parte do código no OpenTelemetry que vai gerar os spans (intervalos) e métricas para nós. Já vimos que quando recebemos uma chamada HTTP um intervalo é criado automaticamente, o que significa que há uma parte do código do OpenTelemetry que se conecta ao módulo HTTP e observa quando ele recebe e responde uma solicitação e com base nisso cria seu próprio span.
Isso aconteceu exatamente nesse momento do nosso projeto.
const instrumentations = [
getNodeAutoInstrumentations({
"@opentelemetry/instrumentation-express": {},
"@opentelemetry/instrumentation-ioredis": {},
"@opentelemetry/instrumentation-http": {},
"@opentelemetry/instrumentation-dns": {},
"@opentelemetry/instrumentation-net": {},
"@opentelemetry/instrumentation-fs": {},
}),
];
const sdk = new NodeSDK({
resource,
traceExporter,
instrumentations,
});
Para ficar simples, a parte do new NodeSDK
instanciamos toda a instrumentação antes e abaixo só utilizamos, mas poderia ter sido simplificado, como no código abaixo, fazendo o uso da biblioteca @opentelemetry/auto-instrumentations-node
de forma padrão.
const sdk = new NodeSDK({
resource,
traceExporter,
instrumentations: [getNodeAutoInstrumentations()]
});
Na verdade o getNodeAutoInstrumentations já traz tudo isso abaixo por default e muito mais e como não fizemos nenhuma modificação nem precisaríamos ter passado nada disso.
"@opentelemetry/instrumentation-express": {},
"@opentelemetry/instrumentation-ioredis": {},
"@opentelemetry/instrumentation-http": {},
"@opentelemetry/instrumentation-dns": {},
"@opentelemetry/instrumentation-net": {},
"@opentelemetry/instrumentation-fs": {},
Só precisamos interferir nessas instrumentações se quisermos modificar o comportamento ou desativar alguma coisa e como não fizemos nada, acabou ficando redundante.
Olhando para getNodeAutoInstrumentations temos isso já por padrão.
declare const InstrumentationMap: {
'@opentelemetry/instrumentation-amqplib': typeof AmqplibInstrumentation;
'@opentelemetry/instrumentation-aws-lambda': typeof AwsLambdaInstrumentation;
'@opentelemetry/instrumentation-aws-sdk': typeof AwsInstrumentation;
'@opentelemetry/instrumentation-bunyan': typeof BunyanInstrumentation;
'@opentelemetry/instrumentation-cassandra-driver': typeof CassandraDriverInstrumentation;
'@opentelemetry/instrumentation-connect': typeof ConnectInstrumentation;
'@opentelemetry/instrumentation-cucumber': typeof CucumberInstrumentation;
'@opentelemetry/instrumentation-dataloader': typeof DataloaderInstrumentation;
'@opentelemetry/instrumentation-dns': typeof DnsInstrumentation;
'@opentelemetry/instrumentation-express': typeof ExpressInstrumentation;
'@opentelemetry/instrumentation-fastify': typeof FastifyInstrumentation;
'@opentelemetry/instrumentation-fs': typeof FsInstrumentation;
'@opentelemetry/instrumentation-generic-pool': typeof GenericPoolInstrumentation;
'@opentelemetry/instrumentation-graphql': typeof GraphQLInstrumentation;
'@opentelemetry/instrumentation-grpc': typeof GrpcInstrumentation;
'@opentelemetry/instrumentation-hapi': typeof HapiInstrumentation;
'@opentelemetry/instrumentation-http': typeof HttpInstrumentation;
'@opentelemetry/instrumentation-ioredis': typeof IORedisInstrumentation;
'@opentelemetry/instrumentation-kafkajs': typeof KafkaJsInstrumentation;
'@opentelemetry/instrumentation-knex': typeof KnexInstrumentation;
'@opentelemetry/instrumentation-koa': typeof KoaInstrumentation;
'@opentelemetry/instrumentation-lru-memoizer': typeof LruMemoizerInstrumentation;
'@opentelemetry/instrumentation-memcached': typeof MemcachedInstrumentation;
'@opentelemetry/instrumentation-mongodb': typeof MongoDBInstrumentation;
'@opentelemetry/instrumentation-mongoose': typeof MongooseInstrumentation;
'@opentelemetry/instrumentation-mysql2': typeof MySQL2Instrumentation;
'@opentelemetry/instrumentation-mysql': typeof MySQLInstrumentation;
'@opentelemetry/instrumentation-nestjs-core': typeof NestInstrumentation;
'@opentelemetry/instrumentation-net': typeof NetInstrumentation;
'@opentelemetry/instrumentation-pg': typeof PgInstrumentation;
'@opentelemetry/instrumentation-pino': typeof PinoInstrumentation;
'@opentelemetry/instrumentation-redis': typeof RedisInstrumentationV2;
'@opentelemetry/instrumentation-redis-4': typeof RedisInstrumentationV4;
'@opentelemetry/instrumentation-restify': typeof RestifyInstrumentation;
'@opentelemetry/instrumentation-router': typeof RouterInstrumentation;
'@opentelemetry/instrumentation-socket.io': typeof SocketIoInstrumentation;
'@opentelemetry/instrumentation-tedious': typeof TediousInstrumentation;
'@opentelemetry/instrumentation-undici': typeof UndiciInstrumentation;
'@opentelemetry/instrumentation-winston': typeof WinstonInstrumentation;
};
Ou seja, se tivessemos usando grpc, kafka, graphql, etc, já estaria pronto, mas as vezes acabamos poluindo demais as coisas e podemos desativar ou modificar algumas delas.
O Opentelemetry Registry é o local que podemos encontrar todos os diferentes componentes do OpenTelemetry.
Filtrando por JavaScript + Instrumentation podemos ver tudo o que temos disponível.
Na lista apresentada temos o repositório de cada uma das bibliotecas, por exemplo para HTTP. Dentro de cada um desses repositórios temos como instalar, como usar, e o mais importante as configurações que podemos fazer.
Se observarmos os traces anteriores vimos que temos um monte de span que apareceram sobre filesystem e dns, coisas para os quais não escrevemos nenhum código e aparentemente não irão nos ajudar a solucionar nenhum problema. Afim de despoluir um pouco o trace podemos desativar isso.
const instrumentations = [
getNodeAutoInstrumentations({
"@opentelemetry/instrumentation-dns": {
enabled: false
},
"@opentelemetry/instrumentation-fs": {
enabled: false
},
}),
];
Veja como era antes.
E como fica agora sem esse span.
Nós desativamos, mas poderíamos somente alterar o comportamento se quisermos. Em cada uma dessas bibliotecas tem opções que podemos ajustar.