diff --git a/cameleer3-server-app/src/main/resources/db/migration/V1__init.sql b/cameleer3-server-app/src/main/resources/db/migration/V1__init.sql index 82cdb1ec..950f2ac8 100644 --- a/cameleer3-server-app/src/main/resources/db/migration/V1__init.sql +++ b/cameleer3-server-app/src/main/resources/db/migration/V1__init.sql @@ -147,13 +147,6 @@ SELECT create_hypertable('agent_metrics', 'collected_at', chunk_time_interval => CREATE INDEX idx_metrics_agent_name ON agent_metrics (agent_id, metric_name, collected_at DESC); --- Retention: drop agent_metrics chunks older than 90 days -SELECT add_retention_policy('agent_metrics', INTERVAL '90 days', if_not_exists => true); - --- Compression: compress agent_metrics chunks older than 7 days -ALTER TABLE agent_metrics SET (timescaledb.compress); -SELECT add_compression_policy('agent_metrics', INTERVAL '7 days', if_not_exists => true); - -- ============================================================= -- Route diagrams -- ============================================================= @@ -238,10 +231,6 @@ WHERE status IS NOT NULL GROUP BY bucket WITH NO DATA; -SELECT add_continuous_aggregate_policy('stats_1m_all', - start_offset => INTERVAL '1 hour', - end_offset => INTERVAL '1 minute', - schedule_interval => INTERVAL '1 minute'); CREATE MATERIALIZED VIEW stats_1m_app WITH (timescaledb.continuous, timescaledb.materialized_only = false) AS @@ -259,10 +248,6 @@ WHERE status IS NOT NULL GROUP BY bucket, application_name WITH NO DATA; -SELECT add_continuous_aggregate_policy('stats_1m_app', - start_offset => INTERVAL '1 hour', - end_offset => INTERVAL '1 minute', - schedule_interval => INTERVAL '1 minute'); CREATE MATERIALIZED VIEW stats_1m_route WITH (timescaledb.continuous, timescaledb.materialized_only = false) AS @@ -281,10 +266,6 @@ WHERE status IS NOT NULL GROUP BY bucket, application_name, route_id WITH NO DATA; -SELECT add_continuous_aggregate_policy('stats_1m_route', - start_offset => INTERVAL '1 hour', - end_offset => INTERVAL '1 minute', - schedule_interval => INTERVAL '1 minute'); CREATE MATERIALIZED VIEW stats_1m_processor WITH (timescaledb.continuous, timescaledb.materialized_only = false) AS @@ -302,13 +283,9 @@ FROM processor_executions GROUP BY bucket, application_name, route_id, processor_type WITH NO DATA; -SELECT add_continuous_aggregate_policy('stats_1m_processor', - start_offset => INTERVAL '1 hour', - end_offset => INTERVAL '1 minute', - schedule_interval => INTERVAL '1 minute'); CREATE MATERIALIZED VIEW stats_1m_processor_detail -WITH (timescaledb.continuous) AS +WITH (timescaledb.continuous, timescaledb.materialized_only = false) AS SELECT time_bucket('1 minute', start_time) AS bucket, application_name, @@ -321,9 +298,6 @@ SELECT MAX(duration_ms) AS duration_max, approx_percentile(0.99, percentile_agg(duration_ms)) AS p99_duration FROM processor_executions -GROUP BY bucket, application_name, route_id, processor_id, processor_type; +GROUP BY bucket, application_name, route_id, processor_id, processor_type +WITH NO DATA; -SELECT add_continuous_aggregate_policy('stats_1m_processor_detail', - start_offset => INTERVAL '1 hour', - end_offset => INTERVAL '1 minute', - schedule_interval => INTERVAL '1 minute'); diff --git a/cameleer3-server-app/src/main/resources/db/migration/V2__policies.sql b/cameleer3-server-app/src/main/resources/db/migration/V2__policies.sql new file mode 100644 index 00000000..76a087a7 --- /dev/null +++ b/cameleer3-server-app/src/main/resources/db/migration/V2__policies.sql @@ -0,0 +1,38 @@ +-- V2__policies.sql - TimescaleDB policies (must run outside transaction) +-- flyway:executeInTransaction=false + +-- Agent metrics retention & compression +ALTER TABLE agent_metrics SET (timescaledb.compress); +SELECT add_retention_policy('agent_metrics', INTERVAL '90 days', if_not_exists => true); +SELECT add_compression_policy('agent_metrics', INTERVAL '7 days', if_not_exists => true); + +-- Continuous aggregate refresh policies +SELECT add_continuous_aggregate_policy('stats_1m_all', + start_offset => INTERVAL '1 hour', + end_offset => INTERVAL '1 minute', + schedule_interval => INTERVAL '1 minute', + if_not_exists => true); + +SELECT add_continuous_aggregate_policy('stats_1m_app', + start_offset => INTERVAL '1 hour', + end_offset => INTERVAL '1 minute', + schedule_interval => INTERVAL '1 minute', + if_not_exists => true); + +SELECT add_continuous_aggregate_policy('stats_1m_route', + start_offset => INTERVAL '1 hour', + end_offset => INTERVAL '1 minute', + schedule_interval => INTERVAL '1 minute', + if_not_exists => true); + +SELECT add_continuous_aggregate_policy('stats_1m_processor', + start_offset => INTERVAL '1 hour', + end_offset => INTERVAL '1 minute', + schedule_interval => INTERVAL '1 minute', + if_not_exists => true); + +SELECT add_continuous_aggregate_policy('stats_1m_processor_detail', + start_offset => INTERVAL '1 hour', + end_offset => INTERVAL '1 minute', + schedule_interval => INTERVAL '1 minute', + if_not_exists => true);