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.