test(perf): qualify constant-tag series concat

Signed-off-by: discord9 <55937128+discord9@users.noreply.github.com>
This commit is contained in:
discord9
2026-09-10 18:32:27 +08:00
parent 9715dd6237
commit 6b15265ed8
@@ -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