ObservabilitéOpenTelemetryDevOps

OpenTelemetry : instrumenter vos applications pour une observabilité complète

14 janvier 2026 · Sphinx-Digital

Le paysage de l’observabilité a longtemps été fragmenté : un agent pour les métriques, un autre pour les traces, un autre pour les logs. OpenTelemetry (OTel) est le projet CNCF qui standardise tout ça sous une API unifiée.

Les trois piliers de l’observabilité

Métriques : valeurs numériques mesurées dans le temps (CPU, latence P99, taux d’erreur). Répondent à : “Est-ce que le système est sain ?”

Traces : suivi d’une requête à travers plusieurs services distribués. Répondent à : “Où le temps a-t-il été passé dans ce parcours ?”

Logs : enregistrements d’événements structurés. Répondent à : “Qu’est-ce qui s’est passé exactement ?”

OpenTelemetry couvre les trois avec la même API.

Instrumenter une application Node.js

const { NodeSDK } = require('@opentelemetry/sdk-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
const { OTLPMetricExporter } = require('@opentelemetry/exporter-metrics-otlp-http');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');

const sdk = new NodeSDK({
  traceExporter: new OTLPTraceExporter({
    url: 'http://otel-collector:4318/v1/traces',
  }),
  metricReader: new PeriodicExportingMetricReader({
    exporter: new OTLPMetricExporter({
      url: 'http://otel-collector:4318/v1/metrics',
    }),
  }),
  instrumentations: [getNodeAutoInstrumentations()],
});

sdk.start();

L’auto-instrumentation capture automatiquement HTTP, Express, base de données, gRPC — sans modifier votre code métier.

Traces distribuées : corréler les services

const tracer = trace.getTracer('mon-service');

app.get('/orders/:id', async (req, res) => {
  const span = tracer.startSpan('get-order');
  span.setAttribute('order.id', req.params.id);
  
  try {
    const order = await orderService.getById(req.params.id);
    span.setStatus({ code: SpanStatusCode.OK });
    res.json(order);
  } catch (error) {
    span.recordException(error);
    span.setStatus({ code: SpanStatusCode.ERROR });
    res.status(500).json({ error: 'Internal Server Error' });
  } finally {
    span.end();
  }
});

L’OpenTelemetry Collector : le hub central

Le Collector reçoit les données de vos applications et les route vers vos backends (Prometheus, Jaeger, Elasticsearch…).

# otel-collector-config.yaml
receivers:
  otlp:
    protocols:
      http:
        endpoint: 0.0.0.0:4318

exporters:
  prometheus:
    endpoint: "0.0.0.0:8889"
  jaeger:
    endpoint: "jaeger:14250"
  elasticsearch:
    endpoints: ["http://elasticsearch:9200"]

service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [jaeger]
    metrics:
      receivers: [otlp]
      exporters: [prometheus]
    logs:
      receivers: [otlp]
      exporters: [elasticsearch]

Le trace ID : lier logs, métriques et traces

La vraie puissance d’OTel vient de l’injection du trace ID dans les logs. Vous pouvez alors passer d’une alerte Prometheus → trace Jaeger → log Elasticsearch en quelques clics, pour un même request ID.

Notre formation Prometheus & Grafana introduit OpenTelemetry dans son curriculum.