Reputation: 1
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