Skip to main content

Traces Schema

  • Version 0.113.0

otel_logsotel_traces

CREATE TABLE otel_logsdefault.otel_traces
(
    `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)),
    `TimestampTime` DateTime DEFAULT toDateTime(Timestamp),
    `TraceId` String CODEC(ZSTD(1)),
    `SpanId` String CODEC(ZSTD(1)),
    `TraceFlags`ParentSpanId` UInt8,String CODEC(ZSTD(1)),
    `SeverityText`TraceState` String CODEC(ZSTD(1)),
    `SpanName` LowCardinality(String) CODEC(ZSTD(1)),
    `SeverityNumber` UInt8,
    `ServiceName`SpanKind` LowCardinality(String) CODEC(ZSTD(1)),
    `Body` String CODEC(ZSTD(1)),
    `ResourceSchemaUrl`ServiceName` LowCardinality(String) CODEC(ZSTD(1)),
    `ResourceAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)),
    `ScopeSchemaUrl` LowCardinality(String) CODEC(ZSTD(1)),
    `ScopeName` String CODEC(ZSTD(1)),
    `ScopeVersion` LowCardinality(String)String CODEC(ZSTD(1)),
    `ScopeAttributes`SpanAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)),
    `LogAttributes`Duration` UInt64 CODEC(ZSTD(1)),
    `StatusCode` LowCardinality(String) CODEC(ZSTD(1)),
    `StatusMessage` String CODEC(ZSTD(1)),
    `Events.Timestamp` Array(DateTime64(9)) CODEC(ZSTD(1)),
    `Events.Name` Array(LowCardinality(String)) CODEC(ZSTD(1)),
    `Events.Attributes` Array(Map(LowCardinality(String), String)) CODEC(ZSTD(1)),
    `Links.TraceId` Array(String) CODEC(ZSTD(1)),
    `Links.SpanId` Array(String) CODEC(ZSTD(1)),
    `Links.TraceState` Array(String) CODEC(ZSTD(1)),
    `Links.Attributes` Array(Map(LowCardinality(String), String)) CODEC(ZSTD(1)),
    INDEX idx_trace_id TraceId TYPE bloom_filter(0.001) GRANULARITY 1,
    INDEX idx_res_attr_key mapKeys(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1,
    INDEX idx_res_attr_value mapValues(ResourceAttributes) TYPE bloom_filter(0.01) GRANULARITY 1,
    INDEX idx_scope_attr_keyidx_span_attr_key mapKeys(ScopeAttributes)SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1,
    INDEX idx_scope_attr_valueidx_span_attr_value mapValues(ScopeAttributes)SpanAttributes) TYPE bloom_filter(0.01) GRANULARITY 1,
    INDEX idx_log_attr_keyidx_duration mapKeys(LogAttributes)Duration TYPE bloom_filter(0.01)minmax GRANULARITY 1,
    INDEX idx_log_attr_value mapValues(LogAttributes) TYPE bloom_filter(0.01) GRANULARITY 1,
    INDEX idx_body Body TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 81
)
ENGINE = MergeTree
PARTITION BY toDate(TimestampTime)
PRIMARY KEY (ServiceName, TimestampTime)Timestamp)
ORDER BY (ServiceName, TimestampTime, Timestamp)
TTLSpanName, toDateTime(Timestamp) + toIntervalDay(7)
SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1;

otel_logs_tags

CREATE TABLE otel_logs_tags
(
    `Timestamp` DateTime CODEC(Delta(4), ZSTD(1)),
    `TagKey` LowCardinality(String) CODEC(ZSTD(1)),
    `TagVal` String CODEC(ZSTD(1)),
    `Count` UInt64 CODEC(ZSTD(1)),
    INDEX idx_tag_key TagKey TYPE bloom_filter(0.01) GRANULARITY 1,
    INDEX idx_tag_val TagVal TYPE bloom_filter(0.01) GRANULARITY 1
)
ENGINE = SummingMergeTree()
PARTITION BY toDate(Timestamp)
ORDER BY (Timestamp, TagKey, TagVal)
TTL toDate(Timestamp) + toIntervalDay(7)
SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1;

otel_logs_tags_mvotel_traces_trace_id_ts

  • Store the start and end time of each TraceId.
  • CREATEts MATERIALIZEDis VIEWfor otel_logs_tags_mvTimestamp.
  • TO otel_logs_tags ( Timestamp DateTime, TagKey LowCardinality(String), TagVal String, Count UInt64 ) AS SELECT toStartOfMinute(Timestamp) AS Timestamp, tag.1 AS TagKey, tag.2 AS TagVal, count() AS Count FROM otel_logs ARRAY JOIN [ ('log.service.name', ServiceName), ('log.severity.text', SeverityText), ('log.severity.number', toString(SeverityNumber)), ('log.attributes.namespace', LogAttributes['namespace']), ('log.attributes.container_image', LogAttributes['container_image']), ('log.attributes.container_name', LogAttributes['container_name']), ('log.attributes.pod_name', LogAttributes['pod_name']), ('log.attributes.pod_ip', LogAttributes['pod_ip']) ] AS tag WHERE tag.2 IS NOT NULL AND tag.2 != '' GROUP BY Timestamp, TagKey, TagVal

otel_logs_stats_minute

CREATE TABLE otel_logs_stats_minutedefault.otel_traces_trace_id_ts
(
    `Timestamp`TraceId` String CODEC(ZSTD(1)),
    `Start` DateTime CODEC(Delta(4), ZSTD(1)),
    `ServiceName`End` LowCardinality(String)DateTime CODEC(Delta(4), ZSTD(1)),
    `Count`INDEX UInt64idx_trace_id CODEC(ZSTD(1))TraceId TYPE bloom_filter(0.01) GRANULARITY 1
)
ENGINE = SummingMergeTreeMergeTree
PARTITION BY toDate(Timestamp)Start)
ORDER BY (ServiceName,TraceId, Timestamp)Start)
TTL toDate(Timestamp)Start) + toIntervalDay(7)1)
SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1;

otel_logs_stats_minute_mvotel_traces_trace_id_ts_mv

  • mv is for Materialized View.
CREATE MATERIALIZED VIEW otel_logs_stats_minute_mvdefault.otel_traces_trace_id_ts_mv
TO otel_logs_stats_minutedefault.otel_traces_trace_id_ts
(
    Timestamp`TraceId` DateTime,String,
    ServiceName`Start` LowCardinality(String)DateTime64(9),
    Count`End` UInt64DateTime64(9)
) AS
SELECT
    toStartOfMinute(TraceId,
    min(Timestamp) AS Timestamp,Start,
    ServiceName,
    count()max(Timestamp) AS CountEnd
FROM otel_logsdefault.otel_traces
WHERE ServiceNameTraceId != ''
GROUP BY Timestamp,
    ServiceNameTraceId;

API Test

Get Logs

curl 'http://localhost:3000/api/v1/logs/query' \
  -X POST \
  -H 'Content-Type: application/json' \
  -b 'EnvironmentID=1; JSESSIONID=48facfbe9f23884ca89611dbffa62c6c' \
  -d '{
    "envId": 1,
    "timeFrame": {
      "startTime": 1750405400,
      "endTime": 1750405445
    },
    "whereClause": "ServiceName = '\''one'\''",
    "paginator": {
      "lastTimestamp": ""
    }
  }'

Field Stats

predefined
curl 'http://localhost:3000/api/v1/logs/field/stats' \
  -X POST \
  -H 'Content-Type: application/json' \
  -b 'EnvironmentID=1; JSESSIONID=48facfbe9f23884ca89611dbffa62c6c' \
  -d '{
    "envId": 1,
    "field": "log.service.name",
    "timeFrame": {
      "startTime": 1750405400,
      "endTime": 1750405445
    }
  }'
ad-hoc
curl 'http://localhost:3000/api/v1/logs/field/stats' \
  -X POST \
  -H 'Content-Type: application/json' \
  -b 'EnvironmentID=1; JSESSIONID=48facfbe9f23884ca89611dbffa62c6c' \
  -d '{
    "envId": 1,
    "field": "log.scope.name",
    "timeFrame": {
      "startTime": 1750405400,
      "endTime": 1750405445
    }
  }'

Get Histogram

curl 'http://localhost:3000/api/v1/logs/histogram' \
  -X POST \
  -H 'Content-Type: application/json' \
  -b 'EnvironmentID=1; JSESSIONID=48facfbe9f23884ca89611dbffa62c6c' \
  -d '{
    "envId": 1,
    "timeFrame": {
      "startTime": 1750405400,
      "endTime": 1750405445
    }
  }'