-
Notifications
You must be signed in to change notification settings - Fork 607
Description
What version of OpenTelemetry are you using?
"@opentelemetry/api": "^1.9.0",
"@opentelemetry/auto-instrumentations-node": "^0.64.1",
"@opentelemetry/exporter-metrics-otlp-grpc": "^0.205.0",
"@opentelemetry/exporter-trace-otlp-grpc": "^0.205.0",
"@opentelemetry/instrumentation-socket.io": "^0.52.0",
"@opentelemetry/resources": "^2.1.0",
"@opentelemetry/sdk-metrics": "^2.1.0",
"@opentelemetry/sdk-node": "^0.205.0",
"@opentelemetry/sdk-trace-node": "^2.1.0",
"@opentelemetry/semantic-conventions": "^1.37.0",
What version of Node are you using?
v23.11.0
What did you do?
I have nestjs-pino
installed.
instrumentation.ts
:
import { NodeSDK } from '@opentelemetry/sdk-node';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
...
const sdk = new NodeSDK({
...,
instrumentations: [
getNodeAutoInstrumentations()
],
});
sdk.start();
WS Gateway:
@WebSocketGateway()
export class TestWebSocketGateway {
private readonly logger = new Logger(TestWebSocketGateway.name);
@SubscribeMessage('test-socket-io-event-name')
async handleGetGameInfo(): Promise<WsResponseDto<GameInfoDto>> {
this.logger.log('Test event');
}
}
What did you expect to see?
I expected to have the trace_id
/span_id
logged with Test event
message, in the way how it works when socket.io
library is used with .on('event-name', cb)
.
What did you see instead?
I see the log logged, without any additional context from the OTLP instrumentation.
Additional context
Looks like the problem is related to how the Nest.JS subscribes on the socket.io listener.
It uses the rxjs fromEvent(socket, message) to do that.
Under the hood that function tries to "guess" which methods are available on the target object to register the "listener". Based on my observations for Nest.JS it goes to the branch of "node style event emitter":

which means that the condition on whether methods addListener
/removeListener
are present on socket.io "Socket" instance.
So eventually it uses the addListener
and removeListener
methods.
Based on the source code it looks like "@opentelemetry/instrumentation-socket.io" patches only on
and emit
methods.
Also, they define both on
and addListener
in their separate component emitter library: https://github.com/socketio/emitter/blob/main/lib/esm/index.js#L35C1-L42C1
Tip: React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding +1
or me too
, to help us triage it. Learn more here.