Skip to content

Traces Schema

  • Version 0.113.0

otel_logs

sql
CREATE TABLE otel_logs
(
    `Timestamp` DateTime64(9) CODEC(Delta(8), ZSTD(1)),
    `TimestampTime` DateTime DEFAULT toDateTime(Timestamp),
    `TraceId` String CODEC(ZSTD(1)),
    `SpanId` String CODEC(ZSTD(1)),
    `TraceFlags` UInt8,
    `SeverityText` LowCardinality(String) CODEC(ZSTD(1)),
    `SeverityNumber` UInt8,
    `ServiceName` LowCardinality(String) CODEC(ZSTD(1)),
    `Body` String CODEC(ZSTD(1)),
    `ResourceSchemaUrl` 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) CODEC(ZSTD(1)),
    `ScopeAttributes` Map(LowCardinality(String), String) CODEC(ZSTD(1)),
    `LogAttributes` 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_key mapKeys(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1,
    INDEX idx_scope_attr_value mapValues(ScopeAttributes) TYPE bloom_filter(0.01) GRANULARITY 1,
    INDEX idx_log_attr_key mapKeys(LogAttributes) TYPE bloom_filter(0.01) 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 8
)
ENGINE = MergeTree
PARTITION BY toDate(TimestampTime)
PRIMARY KEY (ServiceName, TimestampTime)
ORDER BY (ServiceName, TimestampTime, Timestamp)
TTL toDateTime(Timestamp) + toIntervalDay(7)
SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1;

otel_logs_tags

sql
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_mv

sql
CREATE MATERIALIZED VIEW otel_logs_tags_mv
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

sql
CREATE TABLE otel_logs_stats_minute
(
    `Timestamp` DateTime CODEC(Delta(4), ZSTD(1)),
    `ServiceName` LowCardinality(String) CODEC(ZSTD(1)),
    `Count` UInt64 CODEC(ZSTD(1))
)
ENGINE = SummingMergeTree
PARTITION BY toDate(Timestamp)
ORDER BY (ServiceName, Timestamp)
TTL toDate(Timestamp) + toIntervalDay(7)
SETTINGS index_granularity = 8192, ttl_only_drop_parts = 1;

otel_logs_stats_minute_mv

sql
CREATE MATERIALIZED VIEW otel_logs_stats_minute_mv
TO otel_logs_stats_minute
(
    Timestamp DateTime,
    ServiceName LowCardinality(String),
    Count UInt64
) AS
SELECT
    toStartOfMinute(Timestamp) AS Timestamp,
    ServiceName,
    count() AS Count
FROM otel_logs
WHERE ServiceName != ''
GROUP BY
    Timestamp,
    ServiceName

API Test

Get Logs

bash
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 = '\''foobar-one'\''",
    "paginator": {
      "lastTimestamp": ""
    }
  }'

Field Stats

predefined
bash
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
bash
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

bash
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
    }
  }'