otel_socket_io_client

OpenTelemetry instrumentation for package:socket_io_client.

Wraps Socket.IO emit calls in PRODUCER-kind spans and on(...) handlers in CONSUMER-kind spans following the OTel messaging semantic conventions (messaging.system=socket.io, messaging.operation, messaging.destination.name=<event>).

Install

dependencies:
  socket_io_client: ^3.0.0
  otel_socket_io_client: ^0.1.0

Use

import 'package:dartastic_opentelemetry/dartastic_opentelemetry.dart';
import 'package:otel_socket_io_client/otel_socket_io_client.dart';
import 'package:socket_io_client/socket_io_client.dart' as sio;

Future<void> main() async {
  await OTel.initialize(
    serviceName: 'my-app',
  );

  final socket = sio.io('http://localhost:3000');
  socket.connect();

  // Outgoing — PRODUCER span around each emit.
  socket.emitTraced('chat:message', {'text': 'hello'});

  // Incoming — handler runs inside a CONSUMER span.
  socket.onTraced('chat:message', (data) {
    print('got $data');
  });
}

For more control, call the helpers directly:

tracedSocketEmit<void>(
  event: 'chat:message',
  namespace: '/chat',
  invoke: () => socket.emit('chat:message', payload),
);

final wrapped = tracedSocketHandler('chat:message', myHandler);
socket.on('chat:message', wrapped);

Span shape

OTel attribute Source
messaging.system hardcoded socket.io
messaging.operation publish (emit) / receive (on)
messaging.destination.name the event name
messaging.destination.namespace optional namespace: argument
error.type exception class (on throw)

Suppression

runWithoutSocketIoClientInstrumentation(() {
  socket.emit('hot-loop-event', payload);  // not spanned
});

License

Apache 2.0 — copyright Mindful Software LLC.

Libraries

otel_socket_io_client
OpenTelemetry instrumentation for package:socket_io_client.