From 6b15265ed873a842d0d1713cc1902c41fbdb62d5 Mon Sep 17 00:00:00 2001 From: discord9 <55937128+discord9@users.noreply.github.com> Date: Thu, 10 Sep 2026 18:32:27 +0800 Subject: [PATCH] test(perf): qualify constant-tag series concat Signed-off-by: discord9 <55937128+discord9@users.noreply.github.com> --- .../promql_constant_tag_concat/case.toml | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 tests/perf/query_cases/promql_constant_tag_concat/case.toml diff --git a/tests/perf/query_cases/promql_constant_tag_concat/case.toml b/tests/perf/query_cases/promql_constant_tag_concat/case.toml new file mode 100644 index 00000000000..f876d1d871a --- /dev/null +++ b/tests/perf/query_cases/promql_constant_tag_concat/case.toml @@ -0,0 +1,138 @@ +# CI performance qualification for the constant-tag concat experiment. +# +# This direct-SST fixture fixes file, row-group, and label layout independently +# of ingestion and SQL flush behavior; it does not claim to reproduce a +# SQL-flush baseline. With timestamp-major generation, every series occurs at +# every scrape timestamp and each series spans all 32 non-overlapping SSTs, +# exercising cross-file reads for the multi-evaluation queries. + +[case] +name = "promql_constant_tag_concat" +description = "PromQL selector and topk/bottomk qualification on a controlled constant-tag direct-SST fixture" + +[scenario] +kind = "direct_readable_sst" +seed = 4096 + +[[scenario.tables]] +database = "public" +name = "promql_constant_tag_concat" +engine = "mito" +append_mode = true +sst_format = "flat" +primary_key = ["host", "instance"] +time_index = "ts" + +[[scenario.tables.columns]] +name = "host" +type = "STRING" +semantic = "tag" +distribution = { kind = "cardinality", values = 16, prefix = "host" } + +[[scenario.tables.columns]] +name = "instance" +type = "STRING" +semantic = "tag" +distribution = { kind = "cardinality", values = 4096, prefix = "instance" } + +[[scenario.tables.columns]] +name = "reading" +type = "DOUBLE" +semantic = "field" +distribution = { kind = "deterministic_wave", min = 0.0, max = 1000.0 } + +[[scenario.tables.columns]] +name = "ts" +type = "TIMESTAMP(9)" +semantic = "timestamp" + +[scenario.layout] +regions = 1 +sst_count = 32 +rows_per_sst = 32768 +row_group_size = 8192 +series_count = 4096 +start_unix_nanos = 1_704_067_200_000_000_000 # 2024-01-01T00:00:00Z +step_nanos = 15_000_000_000 +time_range_layout = "non_overlapping_per_sst" +series_layout = "timestamp_major" + +[[scenario.queries]] +name = "selector_full" +kind = "tql" +query = "TQL ANALYZE VERBOSE (1704069000, 1704069900, '15s') promql_constant_tag_concat" +warmup = 3 +iterations = 9 + +[scenario.queries.thresholds] +max_candidate_latency_regression_pct = 10 + +[[scenario.queries]] +name = "selector_host1" +kind = "tql" +query = "TQL ANALYZE VERBOSE (1704069000, 1704069900, '15s') promql_constant_tag_concat{host='host1'}" +warmup = 3 +iterations = 9 + +[scenario.queries.thresholds] +max_candidate_latency_regression_pct = 10 + +[[scenario.queries]] +name = "topk_5_full" +kind = "tql" +query = "TQL ANALYZE VERBOSE (1704069000, 1704069900, '15s') topk(5, promql_constant_tag_concat)" +warmup = 3 +iterations = 9 + +[scenario.queries.thresholds] +max_candidate_latency_regression_pct = 10 + +[[scenario.queries]] +name = "topk_5_host1" +kind = "tql" +query = "TQL ANALYZE VERBOSE (1704069000, 1704069900, '15s') topk(5, promql_constant_tag_concat{host='host1'})" +warmup = 3 +iterations = 9 + +[scenario.queries.thresholds] +max_candidate_latency_regression_pct = 10 + +[[scenario.queries]] +name = "topk_100_full" +kind = "tql" +query = "TQL ANALYZE VERBOSE (1704069000, 1704069900, '15s') topk(100, promql_constant_tag_concat)" +warmup = 3 +iterations = 9 + +[scenario.queries.thresholds] +max_candidate_latency_regression_pct = 10 + +[[scenario.queries]] +name = "bottomk_5_full" +kind = "tql" +query = "TQL ANALYZE VERBOSE (1704069000, 1704069900, '15s') bottomk(5, promql_constant_tag_concat)" +warmup = 3 +iterations = 9 + +[scenario.queries.thresholds] +max_candidate_latency_regression_pct = 10 + +# One evaluation time is a likely single-batch selector control, not a guarantee: +# PromQL lookback can still require multiple batches. +[[scenario.queries]] +name = "instant_selector_single_evaluation_control" +kind = "tql" +query = "TQL ANALYZE VERBOSE (1704069000, 1704069000, '15s') promql_constant_tag_concat" +warmup = 3 +iterations = 9 + +[scenario.queries.thresholds] +max_candidate_latency_regression_pct = 10 + +# A single evaluation for output-parity inspection, separate from timed controls. +[[scenario.queries]] +name = "instant_topk_5_output_parity_control" +kind = "tql" +query = "TQL EVAL (1704069000, 1704069000, '15s') topk(5, promql_constant_tag_concat)" +warmup = 0 +iterations = 1