From 5ff4f5b911294b7841dc2f1154ef9be950139ec4 Mon Sep 17 00:00:00 2001 From: discord9 Date: Fri, 23 Oct 2026 14:30:51 +0800 Subject: [PATCH 1/2] refactor(datatypes): name the PromQL series label set by what it is `MetricName` held the whole PromQL-visible label set of a series -- the `__name__` value plus its ordinary labels -- not one metric name. Rename it to `SeriesLabels` so the type says what it holds, and record in its doc comment that it is neither a canonical matching/grouping identity nor a storage identity. Signed-off-by: discord9 (cherry picked from commit c69827ae8936d026e2aa93d9b0ba44cbade3d9e2) --- src/common/query/src/series_frame.rs | 4 +- .../query/src/series_frame/record_batches.rs | 8 +-- src/common/query/src/series_frame/tests.rs | 12 ++-- .../query/src/series_frame/tests/lifecycle.rs | 6 +- src/datatypes/src/series.rs | 12 +++- src/datatypes/src/series/frame.rs | 8 +-- src/datatypes/src/series/frame/tests.rs | 8 +-- src/datatypes/src/series/raw.rs | 6 +- src/datatypes/src/series/raw/tests.rs | 6 +- src/datatypes/src/series/samples.rs | 6 +- src/datatypes/src/series/samples/tests.rs | 18 +++--- src/datatypes/src/series/tests.rs | 16 +++--- src/datatypes/src/series/time/tests.rs | 4 +- src/mito-codec/src/labels.rs | 8 +-- src/mito2/src/engine/scan_test.rs | 2 +- src/promql/src/aggregate.rs | 18 +++--- src/promql/src/aggregate/state.rs | 4 +- src/promql/src/aggregate/tests.rs | 27 +++++---- src/promql/src/evaluated.rs | 6 +- src/promql/src/extension_plan/fused_series.rs | 2 +- .../src/extension_plan/fused_series/tests.rs | 12 ++-- .../instant_manipulate/native.rs | 4 +- .../instant_manipulate/native_exec_tests.rs | 8 +-- .../instant_manipulate/native_tests.rs | 6 +- src/promql/src/golden.rs | 12 ++-- src/promql/src/grid_series.rs | 10 ++-- src/promql/src/grid_series/reference.rs | 18 +++--- src/promql/src/grid_series/tests.rs | 6 +- src/promql/src/histogram_eval.rs | 8 +-- src/promql/src/histogram_eval/aggregate.rs | 4 +- src/promql/src/info.rs | 10 ++-- src/promql/src/instant_eval.rs | 8 +-- src/promql/src/map.rs | 14 ++--- src/promql/src/map/broadcast.rs | 4 +- src/promql/src/map/tests.rs | 6 +- src/promql/src/map/tests/broadcast.rs | 4 +- src/promql/src/map/tests/comparison.rs | 2 +- src/promql/src/map_label.rs | 4 +- src/promql/src/map_time.rs | 4 +- src/promql/src/native/display.rs | 4 +- src/promql/src/native/display/tests.rs | 4 +- src/promql/src/native/execute.rs | 14 ++--- src/promql/src/native/execute/tests.rs | 56 +++++++++---------- src/promql/src/native/plan.rs | 4 +- src/promql/src/range_eval.rs | 4 +- src/promql/src/range_eval/tests.rs | 18 +++--- src/promql/src/select.rs | 18 +++--- src/promql/src/select/tests.rs | 10 ++-- src/promql/src/source/merge/tests.rs | 4 +- src/promql/src/source/tests.rs | 18 +++--- src/promql/src/vector_match.rs | 44 +++++++-------- src/promql/src/vector_match/tests.rs | 8 +-- src/promql/tests/native_binary.rs | 6 +- src/query/src/promql/native_compile.rs | 4 +- src/query/src/promql/native_compile/tests.rs | 12 ++-- src/store-api/src/region_engine.rs | 2 +- .../region_engine/prepared_series_tests.rs | 10 ++-- src/table/src/table/scan/series_tests.rs | 4 +- 58 files changed, 290 insertions(+), 279 deletions(-) diff --git a/src/common/query/src/series_frame.rs b/src/common/query/src/series_frame.rs index d787106c634..d18cdab86f1 100644 --- a/src/common/query/src/series_frame.rs +++ b/src/common/query/src/series_frame.rs @@ -47,7 +47,7 @@ use datatypes::series::frame::{ }; use datatypes::series::raw::RawSeriesChunk; use datatypes::series::samples::SeriesSchema; -use datatypes::series::{MetricName, SeriesOrdering}; +use datatypes::series::{SeriesLabels, SeriesOrdering}; use futures_util::Stream; use store_api::codec::PrimaryKeyEncoding; use store_api::region_engine::{ @@ -380,7 +380,7 @@ struct SequenceValidator { ordering: SeriesOrdering, previous_key: Option>, previous_timestamp: Option, - previous_metric: Option, + previous_metric: Option, previous_is_last: bool, } diff --git a/src/common/query/src/series_frame/record_batches.rs b/src/common/query/src/series_frame/record_batches.rs index 8137f20e004..fa16f16deb3 100644 --- a/src/common/query/src/series_frame/record_batches.rs +++ b/src/common/query/src/series_frame/record_batches.rs @@ -32,7 +32,7 @@ use datafusion_common::{DataFusionError, Result as DfResult}; use datatypes::arrow_array::string_array_value_at_index; use datatypes::series::raw::{RawSeriesChunk, RawTimestamps}; use datatypes::series::samples::{FieldSpec, Samples, SeriesFields, SeriesSchema}; -use datatypes::series::{Label, MetricName, SeriesOrdering}; +use datatypes::series::{Label, SeriesLabels, SeriesOrdering}; use futures_util::Stream; use snafu::Location; use store_api::region_engine::{RawLabelSource, RawSeriesStream, SendableRawSeriesStream}; @@ -132,8 +132,8 @@ fn validate_mapping( return Err(invalid("field must be Float64 or native histogram")); } } - // MetricName validates logical label names and duplicate tags through its canonical path. - MetricName::try_new( + // SeriesLabels validates logical label names and duplicate tags through its canonical path. + SeriesLabels::try_new( mapping.metric_name.clone(), mapping .tags @@ -274,7 +274,7 @@ impl InputStream { }); } } - let metric = MetricName::try_new(metric_name, labels).map_err(codec_error)?; + let metric = SeriesLabels::try_new(metric_name, labels).map_err(codec_error)?; RawSeriesChunk::try_new( &self.schema, Buffer::from(key), diff --git a/src/common/query/src/series_frame/tests.rs b/src/common/query/src/series_frame/tests.rs index e306fa98ddf..61509c4f12c 100644 --- a/src/common/query/src/series_frame/tests.rs +++ b/src/common/query/src/series_frame/tests.rs @@ -32,7 +32,7 @@ use datatypes::arrow::datatypes::{DataType, Schema, SchemaRef}; use datatypes::arrow::ipc::{reader::StreamReader, writer::StreamWriter}; use datatypes::arrow::record_batch::RecordBatch; use datatypes::series::Label; -use datatypes::series::MetricName; +use datatypes::series::SeriesLabels; use datatypes::series::SeriesOrdering; use datatypes::series::frame::{LabelDecodeSpec, RawLabelMode, raw_series_frame_schema}; use datatypes::series::histogram::{BucketSideView, CounterResetHint, HistogramBatchBuilder}; @@ -59,11 +59,11 @@ fn schema() -> Arc { eval_grid: None, }) } -fn metric() -> MetricName { - MetricName::try_new(Some(Arc::from("cpu")), vec![]).unwrap() +fn metric() -> SeriesLabels { + SeriesLabels::try_new(Some(Arc::from("cpu")), vec![]).unwrap() } -fn labeled_metric(host: &str) -> MetricName { - MetricName::try_new( +fn labeled_metric(host: &str) -> SeriesLabels { + SeriesLabels::try_new( Some(Arc::from("cpu")), vec![Label { name: Arc::from("host"), @@ -76,7 +76,7 @@ fn chunk_with( key: &[u8], times: &[i64], values: Vec>, - metric: Option, + metric: Option, last: bool, ) -> RawSeriesChunk { RawSeriesChunk::try_new( diff --git a/src/common/query/src/series_frame/tests/lifecycle.rs b/src/common/query/src/series_frame/tests/lifecycle.rs index 54f088a5098..70fe6ede10c 100644 --- a/src/common/query/src/series_frame/tests/lifecycle.rs +++ b/src/common/query/src/series_frame/tests/lifecycle.rs @@ -25,7 +25,7 @@ use datatypes::series::raw::{RawSeriesChunk, RawTimestamps}; use datatypes::series::samples::{ DenseSamplesRef, FieldSpec, HistogramSamples, SampleRef, Samples, SeriesFields, SeriesSchema, }; -use datatypes::series::{Label, MetricName}; +use datatypes::series::{Label, SeriesLabels}; use futures_util::{Stream, StreamExt}; use store_api::region_engine::{RawLabelSource, RawSeriesStream, SendableRawSeriesStream}; @@ -167,7 +167,7 @@ async fn streaming_round_trip_preserves_sliced_multifield_payload_and_owners() { &schema, Buffer::from(vec![0xaa_u8, 0x10, 0xbb]), Some( - MetricName::try_new( + SeriesLabels::try_new( Some(Arc::from("cpu")), vec![Label { name: Arc::from("host"), @@ -361,7 +361,7 @@ async fn single_row_sliced_payload_keeps_zero_copy_buffers_and_releases_owners() .into(), eval_grid: None, }); - let metric = MetricName::try_new( + let metric = SeriesLabels::try_new( Some(Arc::from("cpu")), vec![Label { name: Arc::from("host"), diff --git a/src/datatypes/src/series.rs b/src/datatypes/src/series.rs index 0de711e2da3..8feba1012dd 100644 --- a/src/datatypes/src/series.rs +++ b/src/datatypes/src/series.rs @@ -55,14 +55,20 @@ pub struct Label { pub value: Arc, } -/// A metric name and its name-sorted ordinary labels. +/// The PromQL-visible labels of one series: an optional metric name (`__name__`) +/// plus its name-sorted ordinary labels. +/// +/// The metric name is only the `__name__` value (see [`Self::name`]); this type is +/// the whole label set a PromQL series shows. It is neither a canonical +/// matching/grouping identity (matching drops `__name__` and compares the remaining +/// labels canonically) nor a storage identity (read key / primary key). #[derive(Clone, Debug, PartialEq, Eq)] -pub struct MetricName { +pub struct SeriesLabels { name: Option>, tags: Arc<[Label]>, } -impl MetricName { +impl SeriesLabels { /// Creates a metric name, sorting labels and rejecting duplicates or `__name__` tags. pub fn try_new(name: Option>, mut tags: Vec