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