Data model and signals
Diting organizes data around one timeline. Every signal shares timestamps and correlation keys, so pages can hand off to each other.
Six signal types
| Signal | Source | Keys |
|---|---|---|
| Metrics | Hosts, containers, services, databases | host_id, service, pod |
| Logs | Files, containers, journald, syslog | host_id, service, trace_id |
| Traces | eBPF, OTLP | trace_id, span_id |
| Profiles | Host and runtime sampling | host_id, pid |
| Sessions | Browser RUM | session_id, trace_id |
| Database | Protocol parsing | trace_id, instance, statement |
Correlation
Three keys tie one request together:
trace_id: the call chain across services and hostssession_id: the browser sessionhost_id: the host identity
Traces jump to logs and sessions; sessions jump back to traces and replay. Time range and filters survive the hop.
Write path
agent → gateway → Kafka → collector → ClickHouse. The gateway handles auth and rate limiting, Kafka absorbs spikes, the collector writes columnar data.
Database statement digests use a separate topic, db-query-digests, and land in diting.dwd_db_query_digest.
Retention
Retention is configured per signal. Hot data serves live queries; cold data serves review. The exact window comes from your storage plan.
Clocks
Synchronize NTP before comparing timestamps across hosts. Diting corrects drift, but correction is not a substitute for a real time source.
OTLP
Teams already running OpenTelemetry can send to the gateway's OTLP endpoint without deploying an agent. Both sources share the same correlation keys.
Related: Traces and topology, API and OTLP.