-- Cameleer3 ClickHouse Schema -- Tables for route executions, route diagrams, and agent metrics. CREATE TABLE IF NOT EXISTS route_executions ( execution_id String, route_id LowCardinality(String), agent_id LowCardinality(String), status LowCardinality(String), start_time DateTime64(3, 'UTC'), end_time Nullable(DateTime64(3, 'UTC')), duration_ms UInt64, correlation_id String, exchange_id String, error_message String DEFAULT '', error_stacktrace String DEFAULT '', -- Nested processor executions stored as parallel arrays processor_ids Array(String), processor_types Array(LowCardinality(String)), processor_starts Array(DateTime64(3, 'UTC')), processor_ends Array(DateTime64(3, 'UTC')), processor_durations Array(UInt64), processor_statuses Array(LowCardinality(String)), -- Metadata server_received_at DateTime64(3, 'UTC') DEFAULT now64(3, 'UTC'), -- Skip indexes INDEX idx_correlation correlation_id TYPE bloom_filter GRANULARITY 4, INDEX idx_error error_message TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 4 ) ENGINE = MergeTree() PARTITION BY toYYYYMMDD(start_time) ORDER BY (agent_id, status, start_time, execution_id) TTL toDateTime(start_time) + toIntervalDay(30) SETTINGS ttl_only_drop_parts = 1; CREATE TABLE IF NOT EXISTS route_diagrams ( content_hash String, route_id LowCardinality(String), agent_id LowCardinality(String), definition String, created_at DateTime64(3, 'UTC') DEFAULT now64(3, 'UTC') ) ENGINE = ReplacingMergeTree(created_at) ORDER BY (content_hash); CREATE TABLE IF NOT EXISTS agent_metrics ( agent_id LowCardinality(String), collected_at DateTime64(3, 'UTC'), metric_name LowCardinality(String), metric_value Float64, tags Map(String, String), server_received_at DateTime64(3, 'UTC') DEFAULT now64(3, 'UTC') ) ENGINE = MergeTree() PARTITION BY toYYYYMMDD(collected_at) ORDER BY (agent_id, metric_name, collected_at) TTL toDateTime(collected_at) + toIntervalDay(30) SETTINGS ttl_only_drop_parts = 1;