Skip to main content

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.

alt text

E como fica agora sem esse span.

alt text

Nós desativamos, mas poderíamos somente alterar o comportamento se quisermos. Em cada uma dessas bibliotecas tem opções que podemos ajustar.