niklasf
niklasf

Reputation: 1

NestJS/OpenTelemetry auto-instrumentation exclude paths

I have a NestJS application that I have auto-instrumented using this example: https://www.npmjs.com/package/@opentelemetry/auto-instrumentations-node

Now I want to exclude certain paths from being monitored, e.g. health checks.

Setup:

git clone https://github.com/nestjs/typescript-starter.git
nvm use 22
npm i
npm i @opentelemetry/api @opentelemetry/auto-instrumentations-node @opentelemetry/exporter-trace-otlp-http @opentelemetry/exporter-collector

Add line 1 to src/main.ts:

import './tracing';

Copy from the example to src/tracing.ts:

import { Span } from "@opentelemetry/api";
import { ClientRequest, IncomingMessage } from "node:http";

const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { CollectorTraceExporter } = require('@opentelemetry/exporter-collector');
const { Resource } = require('@opentelemetry/resources');
const { SEMRESATTRS_SERVICE_NAME } = require('@opentelemetry/semantic-conventions');
const { SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');
const { registerInstrumentations } = require('@opentelemetry/instrumentation');

const exporter = new CollectorTraceExporter();
const provider = new NodeTracerProvider({
  resource: new Resource({
    [SEMRESATTRS_SERVICE_NAME]: 'basic-service',
  }),
});
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
provider.register();

registerInstrumentations({
  instrumentations: [
    getNodeAutoInstrumentations({
      // load custom configuration for http instrumentation
      '@opentelemetry/instrumentation-http': {
        applyCustomAttributesOnSpan: (span) => {
          console.log('setting foo2 attribute!');
          span.setAttribute('foo2', 'bar2');
        },
        requestHook: (span: Span, request: ClientRequest | IncomingMessage): void => {
          console.log(`Request: ${request.method} ${request}`);
        }, 
        ignoreIncomingRequestHook: (request: IncomingMessage): boolean => {
          console.log('ignoring incoming request!')
          return true;
        },
      },
    }),
  ],
});

Run:

export OTEL_TRACES_EXPORTER="otlp"
export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
export OTEL_EXPORTER_OTLP_COMPRESSION="gzip"
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="http://localhost:8318/v1/traces"
export OTEL_EXPORTER_OTLP_HEADERS="x-api-key=your-api-key"
export OTEL_EXPORTER_OTLP_TRACES_HEADERS="x-api-key=your-api-key"
export OTEL_RESOURCE_ATTRIBUTES="service.namespace=my-namespace"
export OTEL_NODE_RESOURCE_DETECTORS="env,host,os,serviceinstance"
export OTEL_SERVICE_NAME="client"
export NODE_OPTIONS="--require @opentelemetry/auto-instrumentations-node/register"
npm run start

What I get: Traces with no "foo2" attribute, no log messages.

What I want: Either applyCustomAttributesOnSpan, requestHook or ignoreIncomingRequestHook to be called.

EDIT: As usual what it takes to figure out is to ask for help online. This works:

import { Span } from "@opentelemetry/api";
import { ClientRequest, IncomingMessage } from "node:http";
import { registerInstrumentations } from '@opentelemetry/instrumentation';
import { HttpInstrumentation } from '@opentelemetry/instrumentation-http';

registerInstrumentations({
  instrumentations: [
    new HttpInstrumentation({
      requestHook: (span: Span, request: ClientRequest | IncomingMessage): void => {
        console.log(`Request: ${request.method} ${request}`);
      },
    }),
  ],
});

Upvotes: 0

Views: 119

Answers (0)

Related Questions