1. L'exportateur ClickHouse #
OpenTelemetry vers SQL.
Configuration #
# Collector OpenTelemetry (distribution contrib)
exporters:
clickhouse:
endpoint: tcp://clickhouse:9000?dial_timeout=10s
database: otel
username: otel
password: ${env:CLICKHOUSE_PASSWORD}
ttl: 168h # rétention 7 jours
create_schema: true # crée les tables au démarrage
logs_table_name: otel_logs
traces_table_name: otel_traces
service:
pipelines:
logs: { receivers: [otlp], processors: [batch], exporters: [clickhouse] }
traces: { receivers: [otlp], processors: [batch], exporters: [clickhouse] }L'exportateur crée des tables otel_logs, otel_traces et otel_metrics_* (par type de métrique) au format MergeTree, triées pour les requêtes par service et par temps.
2. Interroger en SQL #
Les colonnes principales.
Requêtes #
| Table | Colonnes utiles |
|---|---|
otel_traces | Timestamp, TraceId, SpanId, ParentSpanId, SpanName, ServiceName, Duration (ns), StatusCode, SpanAttributes (Map) |
otel_logs | Timestamp, TraceId, ServiceName, SeverityText, Body, LogAttributes (Map), ResourceAttributes (Map) |
-- Latence p95 par opération sur la dernière heure
SELECT ServiceName, SpanName,
quantile(0.95)(Duration) / 1e6 AS p95_ms, count() AS spans
FROM otel.otel_traces
WHERE Timestamp > now() - INTERVAL 1 HOUR AND SpanKind = 'Server'
GROUP BY ServiceName, SpanName
ORDER BY p95_ms DESC LIMIT 10;
-- Logs d'erreur d'une trace lente, en une jointure
SELECT l.Timestamp, l.ServiceName, l.Body
FROM otel.otel_logs AS l
WHERE l.TraceId IN (
SELECT TraceId FROM otel.otel_traces
WHERE Timestamp > now() - INTERVAL 1 HOUR AND Duration > 2e9 LIMIT 100)
AND l.SeverityText = 'ERROR'
ORDER BY l.Timestamp;
-- Attribut à haute cardinalité : top clients en erreur
SELECT SpanAttributes['client.id'] AS client, countIf(StatusCode = 'Error') AS erreurs
FROM otel.otel_traces WHERE Timestamp > now() - INTERVAL 1 DAY
GROUP BY client ORDER BY erreurs DESC LIMIT 10;3. Rétention et performance #
TTL et vues matérialisées.
Réglages #
-- Modifier la rétention d'une table existante
ALTER TABLE otel.otel_logs MODIFY TTL toDateTime(Timestamp) + INTERVAL 14 DAY;
-- Pré-agréger les métriques RED par minute
CREATE MATERIALIZED VIEW otel.red_par_minute
ENGINE = SummingMergeTree ORDER BY (ServiceName, SpanName, minute) AS
SELECT ServiceName, SpanName, toStartOfMinute(Timestamp) AS minute,
count() AS requetes, countIf(StatusCode = 'Error') AS erreurs
FROM otel.otel_traces WHERE SpanKind = 'Server'
GROUP BY ServiceName, SpanName, minute;
-- Place occupée et taux de compression
SELECT table, formatReadableSize(sum(data_compressed_bytes)) AS compresse,
round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 1) AS ratio
FROM system.parts WHERE database = 'otel' AND active GROUP BY table;Bonne Pratique : Avec le plugin ClickHouse de Grafana, ces requêtes deviennent des panneaux, avec des liens vers les traces : une option intéressante pour une équipe déjà sur Grafana.
Mon suivi
Connectez-vous pour suivre votre progression et prendre des notes. Se connecter
Articles recommandés
Les conventions sémantiques OpenTelemetry (semconv) : nommer la télémétrie
Comprendre et appliquer les conventions sémantiques OpenTelemetry : attributs de ressource, HTTP,...
Projet fil rouge : les quatre signaux de l'OpenTelemetry Demo dans la stack Grafana
Un projet fil rouge qui traverse les formations d'observabilité : déployer l'OpenTelemetry Demo, ...
Bonnes Pratiques Grafana Alloy : Optimiser sa Collecte de Télémétrie
Découvrez les règles d'or pour configurer Grafana Alloy de manière robuste : modularité, gestion ...
Collector OpenTelemetry : connecteurs, extensions et observabilité du Collector
Aller plus loin avec le Collector : connecteurs (spanmetrics, servicegraph, count, routing, failo...
OTLP expliqué : comprendre le protocole OpenTelemetry
Découvrez le protocole OTLP expliqué simplement. Comprendre les différences entre gRPC et HTTP po...
Grafana Alloy : L'importance de l'auto-supervision (Self-Monitoring)
Découvrez pourquoi et comment configurer Grafana Alloy pour qu'il se supervise lui-même, en colle...
Les logs avec OpenTelemetry : modèle de données, appenders, corrélation et collecte
Maîtriser le signal log : modèle de données LogRecord, Logs Bridge API et appenders (Logback, Log...
Instrumenter ses applications pour Jaeger avec OpenTelemetry
Envoyer des traces à Jaeger avec OpenTelemetry : auto-instrumentation (Java, Python, Node.js), SD...
OpenTelemetry : Instrumentation Automatique vs Manuelle
Comprenez les différences entre l'instrumentation automatique et manuelle avec OpenTelemetry, leu...