From e1ebd1fefc879a84e3ea83bd1cd9b4f0009177f8 Mon Sep 17 00:00:00 2001 From: Dennis Zhuang Date: Sat, 17 Oct 2026 20:14:09 +0800 Subject: [PATCH 1/5] feat(promql): evaluate time, date and label rewriting functions over grid series Add time(), the date functions and label_replace/label_join for evaluated series, following Prometheus funcTime, dateWrapper, evalLabelReplace and evalLabelJoin, and merge series that end up with one label set as mergeSeriesWithSameLabelset does. Signed-off-by: Dennis Zhuang --- Cargo.lock | 1 + src/promql/Cargo.toml | 1 + src/promql/src/grid_series.rs | 108 +- src/promql/src/grid_series/reference.rs | 152 +- src/promql/src/grid_series/tests.rs | 33 +- src/promql/src/lib.rs | 2 + src/promql/src/map_label.rs | 104 + src/promql/src/map_label/prometheus_cases.txt | 1871 +++++++++++++++++ src/promql/src/map_label/tests.rs | 86 + src/promql/src/map_time.rs | 216 ++ src/promql/src/map_time/prometheus_cases.txt | 1323 ++++++++++++ src/promql/src/map_time/tests.rs | 167 ++ 12 files changed, 4058 insertions(+), 6 deletions(-) create mode 100644 src/promql/src/map_label.rs create mode 100644 src/promql/src/map_label/prometheus_cases.txt create mode 100644 src/promql/src/map_label/tests.rs create mode 100644 src/promql/src/map_time.rs create mode 100644 src/promql/src/map_time/prometheus_cases.txt create mode 100644 src/promql/src/map_time/tests.rs diff --git a/Cargo.lock b/Cargo.lock index 03867b3a243..f13e9c87858 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11371,6 +11371,7 @@ dependencies = [ "prometheus 0.14.0", "prost 0.14.1", "rand 0.9.4", + "regex", "snafu 0.8.6", "tokio", ] diff --git a/src/promql/Cargo.toml b/src/promql/Cargo.toml index d38ac35ca8d..0697f4983bc 100644 --- a/src/promql/Cargo.toml +++ b/src/promql/Cargo.toml @@ -24,6 +24,7 @@ greptime-proto.workspace = true lazy_static.workspace = true prometheus.workspace = true prost.workspace = true +regex.workspace = true snafu.workspace = true [dev-dependencies] diff --git a/src/promql/src/grid_series.rs b/src/promql/src/grid_series.rs index 9cf1a9c9fad..e5e9bd53532 100644 --- a/src/promql/src/grid_series.rs +++ b/src/promql/src/grid_series.rs @@ -14,13 +14,15 @@ //! Building evaluated float series that cover only their result range on a shared grid. +use std::collections::HashMap; +use std::collections::hash_map::Entry; use std::sync::Arc; use datafusion::arrow::array::Float64Array; use datafusion::arrow::array::builder::NullBufferBuilder; use datafusion::error::{DataFusionError, Result}; use datatypes::series::MetricName; -use datatypes::series::samples::{Samples, Series, SeriesFields, SeriesSchema}; +use datatypes::series::samples::{SampleRef, Samples, Series, SeriesFields, SeriesSchema}; use datatypes::series::time::{EvalGrid, GridRange, TimeAxis}; #[cfg(test)] @@ -140,6 +142,110 @@ impl GridSeriesBuilder { } } +type LabelSet = Vec<(Arc, Arc)>; + +/// The label set Prometheus compares, which has no empty values. +fn label_set(metric: &MetricName) -> LabelSet { + let name = metric + .name() + .filter(|name| !name.is_empty()) + .map(|name| (Arc::from("__name__"), Arc::from(name))); + name.into_iter() + .chain( + metric + .tags() + .iter() + .filter(|tag| !tag.value.is_empty()) + .map(|tag| (tag.name.clone(), tag.value.clone())), + ) + .collect() +} + +/// Merges series that share a label set into one, as Prometheus does after a function that +/// rewrites labels or drops `__name__`; two of them present at one point fail. +pub fn merge_same_labelset(schema: &Arc, series: Vec) -> Result> { + let mut groups: HashMap> = HashMap::with_capacity(series.len()); + let mut collided = false; + for (index, series) in series.iter().enumerate() { + match groups.entry(label_set(&series.metric)) { + Entry::Occupied(mut entry) => { + entry.get_mut().push(index); + collided = true; + } + Entry::Vacant(entry) => { + entry.insert(vec![index]); + } + } + } + if !collided { + return Ok(series); + } + + let mut series: Vec> = series.into_iter().map(Some).collect(); + let mut output = Vec::with_capacity(groups.len()); + let mut builder = GridSeriesBuilder::try_new(schema.clone())?; + let mut rows = Vec::new(); + let mut values = vec![None; schema.fields.len()]; + for (labels, members) in groups { + if let [member] = members[..] { + output.extend(series[member].take()); + continue; + } + rows.clear(); + for &member in &members { + let member_series = series[member] + .as_ref() + .expect("each series is in one group"); + let TimeAxis::Grid(range) = &member_series.time else { + return Err(DataFusionError::Execution( + "merging requires evaluated series".into(), + )); + }; + for row in 0..range.len() { + if read_row(member_series, row, &mut values)? { + rows.push((range.start() + row, member, row)); + } + } + } + rows.sort_unstable_by_key(|&(point, _, _)| point); + if rows.windows(2).any(|pair| pair[0].0 == pair[1].0) { + let labels: Vec<_> = labels + .iter() + .map(|(name, value)| format!("{name}=\"{value}\"")) + .collect(); + return Err(DataFusionError::Execution(format!( + "vector cannot contain metrics with the same labelset {{{}}}", + labels.join(", ") + ))); + } + for &(point, member, row) in &rows { + read_row(series[member].as_ref().unwrap(), row, &mut values)?; + builder.push(point, &values)?; + } + let metric = series[members[0]].as_ref().unwrap().metric.clone(); + output.extend(builder.finish(metric)?); + } + Ok(output) +} + +/// Reads the float fields of `row`; returns whether any is present. +fn read_row(series: &Series, row: usize, values: &mut [Option]) -> Result { + let mut present = false; + for (value, samples) in values.iter_mut().zip(series.fields.iter()) { + *value = match samples.sample(row) { + SampleRef::Missing => None, + SampleRef::Float(value) => Some(value), + SampleRef::Histogram(_) => { + return Err(DataFusionError::NotImplemented( + "merging histogram series with the same label set".into(), + )); + } + }; + present |= value.is_some(); + } + Ok(present) +} + fn external(error: datatypes::error::Error) -> DataFusionError { DataFusionError::External(Box::new(error)) } diff --git a/src/promql/src/grid_series/reference.rs b/src/promql/src/grid_series/reference.rs index 3b6f6974cbf..047b1f65126 100644 --- a/src/promql/src/grid_series/reference.rs +++ b/src/promql/src/grid_series/reference.rs @@ -15,11 +15,16 @@ //! Brute-force reference for operators producing grid series: results are compared as dense //! `[grid index][field]` matrices, so a kernel cannot pass by aligning local row numbers. -use datatypes::series::MetricName; -use datatypes::series::samples::{SampleRef, Series}; -use datatypes::series::time::TimeAxis; +use std::collections::BTreeMap; +use std::sync::Arc; + +use datatypes::series::samples::{SampleRef, Series, SeriesSchema}; +use datatypes::series::time::{EvalGrid, GridSpec, TimeAxis}; +use datatypes::series::{Label, MetricName}; use rand::Rng; +use crate::grid_series::GridSeriesBuilder; + /// Values by absolute grid index, then by field; `None` is missing. pub(crate) type Dense = Vec>>; @@ -109,3 +114,144 @@ pub(crate) fn random_dense(rng: &mut impl Rng, grid_len: usize, fields: usize) - } dense } + +/// Labels with `__name__` as an ordinary entry, the way Prometheus holds them. +pub(crate) type Labels = BTreeMap; + +/// Value bits by grid index. +pub(crate) type Points = BTreeMap; + +/// A case of a fixture written by a promql-compat `narthex-golden-*` command. +pub(crate) struct GoldenCase { + /// The operation and its tab-separated arguments. + pub(crate) spec: Vec, + pub(crate) grid: Arc, + pub(crate) inputs: Vec<(Labels, Points)>, + /// Result series by label set, or the error message. + pub(crate) outcome: Result, String>, +} + +/// Parses a fixture whose label pairs are separated by `|`. +pub(crate) fn golden_cases(text: &str) -> Vec { + let labels = |text: &str| -> Labels { + text.split('|') + .filter(|pair| *pair != "-") + .map(|pair| { + let (name, value) = pair.split_once('=').unwrap(); + (name.to_string(), value.to_string()) + }) + .collect() + }; + let points = |text: &str| -> Points { + text.split_whitespace() + .map(|point| { + let (index, bits) = point.split_once(':').unwrap(); + ( + index.parse().unwrap(), + u64::from_str_radix(bits, 16).unwrap(), + ) + }) + .collect() + }; + let mut cases = Vec::new(); + for case in text.split("end\n").filter(|case| case.contains("case ")) { + let lines: Vec<&str> = case.lines().filter(|line| !line.starts_with('#')).collect(); + let spec = lines[0].strip_prefix("case ").unwrap(); + let grid: Vec = lines[1] + .split_whitespace() + .skip(1) + .map(|value| value.parse().unwrap()) + .collect(); + let grid = GridSpec::try_new(grid[0], grid[1], grid[2] as u64).unwrap(); + let mut inputs = Vec::new(); + let mut outcome = Ok(BTreeMap::new()); + for line in &lines[2..] { + if let Some(message) = line.strip_prefix("error ") { + outcome = Err(message.to_string()); + continue; + } + let (kind, rest) = line.split_once(' ').unwrap(); + let (series_labels, series_points) = rest.split_once(" ;").unwrap(); + let entry = (labels(series_labels), points(series_points)); + match kind { + "series" => inputs.push(entry), + "result" => { + outcome.as_mut().unwrap().insert(entry.0, entry.1); + } + other => panic!("unexpected line {other}"), + } + } + cases.push(GoldenCase { + spec: spec.split('\t').map(str::to_string).collect(), + grid: Arc::new(EvalGrid::try_new(grid).unwrap()), + inputs, + outcome, + }); + } + cases +} + +pub(crate) fn metric_of(labels: &Labels) -> MetricName { + let mut labels = labels.clone(); + let name = labels.remove("__name__").map(Arc::from); + MetricName::try_new( + name, + labels + .into_iter() + .map(|(name, value)| Label { + name: Arc::from(name), + value: Arc::from(value), + }) + .collect(), + ) + .unwrap() +} + +pub(crate) fn labels_of(metric: &MetricName) -> Labels { + let mut labels: Labels = metric + .tags() + .iter() + .map(|tag| (tag.name.to_string(), tag.value.to_string())) + .collect(); + if let Some(name) = metric.name() { + labels.insert("__name__".to_string(), name.to_string()); + } + labels +} + +/// A single-field series of `schema` holding `points`; `None` without points. +pub(crate) fn series_of( + schema: &Arc, + labels: &Labels, + points: &Points, +) -> Option { + let mut builder = GridSeriesBuilder::try_new(schema.clone()).unwrap(); + for (&index, &bits) in points { + builder.push(index, &[Some(f64::from_bits(bits))]).unwrap(); + } + builder.finish(metric_of(labels)).unwrap() +} + +/// The points of a single-field series, any NaN as one NaN: Prometheus' NaN payloads depend on +/// how the Go compiler orders operands. +pub(crate) fn points_of(series: &Series) -> Points { + let TimeAxis::Grid(range) = &series.time else { + panic!("expected a grid series"); + }; + series.fields.as_slice()[0] + .iter() + .enumerate() + .filter_map(|(row, sample)| match sample { + SampleRef::Float(value) => Some((range.start() + row, canonical_bits(value))), + _ => None, + }) + .collect() +} + +pub(crate) fn canonical_bits(value: f64) -> u64 { + if value.is_nan() { + f64::NAN.to_bits() + } else { + value.to_bits() + } +} diff --git a/src/promql/src/grid_series/tests.rs b/src/promql/src/grid_series/tests.rs index b0f6fecd915..aaa98e9312d 100644 --- a/src/promql/src/grid_series/tests.rs +++ b/src/promql/src/grid_series/tests.rs @@ -20,8 +20,8 @@ use datatypes::series::{Label, MetricName}; use rand::rngs::StdRng; use rand::{Rng, SeedableRng}; -use super::GridSeriesBuilder; -use super::reference::{assert_series_eq, random_dense}; +use super::reference::{Labels, Points, assert_series_eq, points_of, random_dense, series_of}; +use super::{GridSeriesBuilder, merge_same_labelset}; fn grid_schema(fields: usize, grid_len: u64) -> Arc { Arc::new(SeriesSchema { @@ -83,3 +83,32 @@ fn builder_rejects_invalid_rows() { schema.eval_grid = None; assert!(GridSeriesBuilder::try_new(Arc::new(schema)).is_err()); } + +/// Label sets compare without empty values, which Prometheus does not have: a series with +/// `host=""` and one without `host` merge. +#[test] +fn merge_treats_empty_label_values_as_absent() { + let schema = grid_schema(1, 2); + let labels = |host: Option<&str>| { + let mut labels = Labels::from([("job".to_string(), "x".to_string())]); + if let Some(host) = host { + labels.insert("host".to_string(), host.to_string()); + } + labels + }; + let series = vec![ + series_of( + &schema, + &labels(Some("")), + &Points::from([(0, 1f64.to_bits())]), + ) + .unwrap(), + series_of(&schema, &labels(None), &Points::from([(1, 2f64.to_bits())])).unwrap(), + ]; + let merged = merge_same_labelset(&schema, series).unwrap(); + assert_eq!(merged.len(), 1); + assert_eq!( + points_of(&merged[0]), + Points::from([(0, 1f64.to_bits()), (1, 2f64.to_bits())]) + ); +} diff --git a/src/promql/src/lib.rs b/src/promql/src/lib.rs index f1ac59d792f..dac3eb899a1 100644 --- a/src/promql/src/lib.rs +++ b/src/promql/src/lib.rs @@ -16,6 +16,8 @@ pub mod error; pub mod extension_plan; pub mod functions; pub mod grid_series; +pub mod map_label; +pub mod map_time; mod metrics; pub mod range_array; pub mod range_eval; diff --git a/src/promql/src/map_label.rs b/src/promql/src/map_label.rs new file mode 100644 index 00000000000..eea21700630 --- /dev/null +++ b/src/promql/src/map_label.rs @@ -0,0 +1,104 @@ +// Copyright 2023 Greptime Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! `label_replace` and `label_join` over evaluated series, following Prometheus +//! `evalLabelReplace`, `evalLabelJoin` and `mergeSeriesWithSameLabelset`. + +use std::sync::Arc; + +use datafusion::error::{DataFusionError, Result}; +use datatypes::series::MetricName; +use datatypes::series::samples::{Series, SeriesSchema}; +use regex::Regex; + +use crate::grid_series::merge_same_labelset; + +#[cfg(test)] +mod tests; + +/// `label_replace(v, dst, replacement, src, regex)`: where `regex` matches the whole value of +/// `src`, `dst` is set to `replacement` with `$1`, `${name}` and `$$` expanded. +pub fn label_replace( + schema: &Arc, + mut series: Vec, + dst: &str, + replacement: &str, + src: &str, + regex: &str, +) -> Result> { + let compiled = Regex::new(&format!("^(?s:{regex})$")).map_err(|_| { + DataFusionError::Plan(format!( + "invalid regular expression in label_replace(): {regex}" + )) + })?; + if dst.is_empty() { + return Err(DataFusionError::Plan( + "invalid destination label name in label_replace(): ".into(), + )); + } + let mut value = String::new(); + for series in &mut series { + let Some(captures) = compiled.captures(series.metric.get(src).unwrap_or_default()) else { + continue; + }; + value.clear(); + captures.expand(replacement, &mut value); + set_label(&mut series.metric, dst, &value)?; + } + merge_same_labelset(schema, series) +} + +/// `label_join(v, dst, separator, src...)`: `dst` is set to the values of `src` joined by +/// `separator`, an absent label joining as the empty string. +pub fn label_join( + schema: &Arc, + mut series: Vec, + dst: &str, + separator: &str, + src: &[&str], +) -> Result> { + if let Some(src) = src.iter().find(|src| src.is_empty()) { + return Err(DataFusionError::Plan(format!( + "invalid source label name in label_join(): {src}" + ))); + } + if dst.is_empty() { + return Err(DataFusionError::Plan( + "invalid destination label name in label_join(): ".into(), + )); + } + let mut value = String::new(); + for series in &mut series { + value.clear(); + for (index, src) in src.iter().enumerate() { + if index > 0 { + value.push_str(separator); + } + value.push_str(series.metric.get(src).unwrap_or_default()); + } + set_label(&mut series.metric, dst, &value)?; + } + merge_same_labelset(schema, series) +} + +/// An empty value removes the label, as Prometheus label sets have no empty values. +fn set_label(metric: &mut MetricName, name: &str, value: &str) -> Result<()> { + if value.is_empty() { + metric.remove(name); + return Ok(()); + } + metric + .set(name, Arc::from(value)) + .map_err(|error| DataFusionError::External(Box::new(error))) +} diff --git a/src/promql/src/map_label/prometheus_cases.txt b/src/promql/src/map_label/prometheus_cases.txt new file mode 100644 index 00000000000..2d13aef21ee --- /dev/null +++ b/src/promql/src/map_label/prometheus_cases.txt @@ -0,0 +1,1871 @@ +# Generated by promql-compat cmd/narthex-golden-map built for amd64 (Prometheus v3.15.0 +# engine, seed 1, 100 cases per kind). Each case lists its operation and tab-separated +# arguments, the grid, the input series and either the result series or the error. +# Points are `grid index:hex bits`. +case label_replace __name__ zone (.*) +grid 100000 10000 7 +series __name__=a|host=h1|job=ax ; 1:4085d00000000000 +series __name__=b|host=h10 ; 1:4014000000000000 2:407ba00000000000 3:406f600000000000 4:4073c00000000000 +result host=h1|job=ax ; 1:4085d00000000000 +result host=h10 ; 1:4014000000000000 2:407ba00000000000 3:406f600000000000 4:4073c00000000000 +end +case label_replace host ${ zone (?P.)(.*) +grid 100000 10000 7 +series __name__=b|host=x|zone=z1 ; 4:407a200000000000 5:4072700000000000 6:4085380000000000 +series __name__=a|host=h10|job=x ; 4:408b500000000000 +series __name__=b|host=h2|job=x ; 5:408ee80000000000 +series __name__=a|host=h10 ; 6:4089480000000000 +result __name__=a|host=h10 ; 6:4089480000000000 +result __name__=a|host=h10|job=x ; 4:408b500000000000 +result __name__=b|host=${|zone=z1 ; 4:407a200000000000 5:4072700000000000 6:4085380000000000 +result __name__=b|host=h2|job=x ; 5:408ee80000000000 +end +case label_replace __name__ host +grid 100000 10000 3 +series __name__=a|host=h10|job=y ; +series __name__=a|host=h10|job=x|zone=z1 ; 2:404f800000000000 +series __name__=b|host=h1 ; 0:4065000000000000 +series __name__=a|host=h2 ; 0:4059000000000000 1:408a900000000000 2:4076a00000000000 +series __name__=a|host=h2|job=x ; 2:408bf00000000000 +result __name__=a|host=h10|job=x|zone=z1 ; 2:404f800000000000 +result __name__=a|host=h2 ; 0:4059000000000000 1:408a900000000000 2:4076a00000000000 +result __name__=a|host=h2|job=x ; 2:408bf00000000000 +result __name__=b|host=h1 ; 0:4065000000000000 +end +case label_replace zone $1 host x? +grid 100000 10000 11 +series __name__=b|host=h1 ; 9:4060e00000000000 +series __name__=b|host=h2|zone=z1 ; 6:4088780000000000 7:407fc00000000000 8:4081f80000000000 9:406a400000000000 10:407ad00000000000 +result __name__=b|host=h1 ; 9:4060e00000000000 +result __name__=b|host=h2|zone=z1 ; 6:4088780000000000 7:407fc00000000000 8:4081f80000000000 9:406a400000000000 10:407ad00000000000 +end +case label_replace __name__ h1 new [ +grid 100000 10000 6 +series __name__=b|host=h2 ; 1:408a600000000000 +series __name__=b|host=h1|job=y ; 0:4070d00000000000 1:4070400000000000 2:406de00000000000 +series __name__=a|host=x|job=x ; 1:408ab80000000000 +error invalid regular expression in label_replace(): [ +end +case label_replace __name__ h1 missing x? +grid 100000 10000 3 +series __name__=a|host=h2 ; 0:4073400000000000 1:4089f00000000000 +series __name__=a|host=h2|job=ax ; 1:4089100000000000 2:4087880000000000 +series __name__=a|host=h1|job=y ; 2:407ab00000000000 +result __name__=h1|host=h1|job=y ; 2:407ab00000000000 +result __name__=h1|host=h2 ; 0:4073400000000000 1:4089f00000000000 +result __name__=h1|host=h2|job=ax ; 1:4089100000000000 2:4087880000000000 +end +case label_replace __name__ ${ missing h1|x +grid 100000 10000 4 +series __name__=b|host=x|job=y ; +series __name__=a|host=h2 ; 0:406dc00000000000 +series __name__=b|host=h1|job=x ; 2:4085800000000000 3:406dc00000000000 +series __name__=b|host=h10|job=y ; 1:407d800000000000 +result __name__=a|host=h2 ; 0:406dc00000000000 +result __name__=b|host=h1|job=x ; 2:4085800000000000 3:406dc00000000000 +result __name__=b|host=h10|job=y ; 1:407d800000000000 +end +case label_replace new h1 __name__ (.*) +grid 100000 10000 10 +series __name__=a|host=h1 ; 8:4084180000000000 9:4080200000000000 +series __name__=b|host=h2|job=y|zone=z1 ; 1:4086580000000000 2:4082b80000000000 3:4083d80000000000 4:4081100000000000 6:0 7:4072300000000000 8:4084d00000000000 9:4083280000000000 +series __name__=b|host=h2|job=y ; 2:406fe00000000000 3:408d680000000000 +result __name__=a|host=h1|new=h1 ; 8:4084180000000000 9:4080200000000000 +result __name__=b|host=h2|job=y|new=h1 ; 2:406fe00000000000 3:408d680000000000 +result __name__=b|host=h2|job=y|new=h1|zone=z1 ; 1:4086580000000000 2:4082b80000000000 3:4083d80000000000 4:4081100000000000 6:0 7:4072300000000000 8:4084d00000000000 9:4083280000000000 +end +case label_replace job ${ __name__ .* +grid 100000 10000 1 +series __name__=b|host=h2|job=x|zone=z1 ; +series __name__=b|host=h1|job=y|zone=z1 ; 0:408e000000000000 +series __name__=a|host=h10 ; 0:4078c00000000000 +series __name__=b|host=h1|job=y ; 0:4086100000000000 +series __name__=a|host=h1|job=ax ; +series __name__=a|host=h10|job=ax ; 0:408b500000000000 +error vector cannot contain metrics with the same labelset +end +case label_replace new a$2b new [ +grid 100000 10000 12 +series __name__=b|host=x|job=x ; 10:4077300000000000 +series __name__=b|host=h1|zone=z1 ; 3:4070900000000000 4:4088e00000000000 5:408d300000000000 6:408ed80000000000 7:4080380000000000 +series __name__=a|host=h10|zone=z1 ; 0:408ab00000000000 +error invalid regular expression in label_replace(): [ +end +case label_replace __name__ $$ missing (?P.)(.*) +grid 100000 10000 6 +series __name__=b|host=x ; 4:408bd80000000000 +series __name__=a|host=x ; 3:4082f80000000000 +result __name__=a|host=x ; 3:4082f80000000000 +result __name__=b|host=x ; 4:408bd80000000000 +end +case label_replace new $ host (?i)H(.) +grid 100000 10000 10 +series __name__=b|host=x|job=x|zone=z1 ; 0:4083980000000000 1:4081a00000000000 +series __name__=b|host=h10 ; 7:4085b80000000000 +result __name__=b|host=h10 ; 7:4085b80000000000 +result __name__=b|host=x|job=x|zone=z1 ; 0:4083980000000000 1:4081a00000000000 +end +case label_replace new $ zone (?i)H(.) +grid 100000 10000 3 +series __name__=b|host=h10|job=y|zone=z1 ; 2:408ea00000000000 +series __name__=b|host=h2|job=y ; 1:4080700000000000 2:408ed00000000000 +series __name__=b|host=h2|job=x ; +result __name__=b|host=h10|job=y|zone=z1 ; 2:408ea00000000000 +result __name__=b|host=h2|job=y ; 1:4080700000000000 2:408ed00000000000 +end +case label_replace zone $1 host (.*) +grid 100000 10000 8 +series __name__=b|host=x|job=ax ; +series __name__=a|host=h2|job=x ; 0:407c900000000000 2:4085500000000000 +result __name__=a|host=h2|job=x|zone=h2 ; 0:407c900000000000 2:4085500000000000 +end +case label_replace zone a$2b __name__ (?i)H(.) +grid 100000 10000 12 +series __name__=a|host=h2 ; 0:4078500000000000 1:4089980000000000 +result __name__=a|host=h2 ; 0:4078500000000000 1:4089980000000000 +end +case label_replace host ${ new +grid 100000 10000 4 +series __name__=b|host=x ; 1:408ed00000000000 2:4077b00000000000 3:4083480000000000 +series __name__=a|host=h2|job=ax|zone=z1 ; 3:4088e80000000000 +series __name__=b|host=h10|job=x ; 3:4056000000000000 +result __name__=a|host=${|job=ax|zone=z1 ; 3:4088e80000000000 +result __name__=b|host=${ ; 1:408ed00000000000 2:4077b00000000000 3:4083480000000000 +result __name__=b|host=${|job=x ; 3:4056000000000000 +end +case label_replace zone host (?i)H(.) +grid 100000 10000 12 +series __name__=a|host=h2|job=x ; 1:4083300000000000 2:4076f00000000000 3:408cf80000000000 4:4076000000000000 5:408a480000000000 7:4086600000000000 8:408f200000000000 10:4054400000000000 +series __name__=b|host=h2 ; 0:4043800000000000 1:4058800000000000 2:408ad00000000000 3:407c400000000000 4:408de80000000000 5:4082700000000000 6:4067000000000000 7:4079700000000000 8:4077e00000000000 9:4074100000000000 +series __name__=a|host=x|job=y|zone=z1 ; 2:4089e80000000000 3:4082600000000000 5:4080380000000000 7:4081b80000000000 8:4082c80000000000 +series __name__=a|host=h10|job=x ; 7:4086400000000000 8:4068600000000000 +series __name__=b|host=h10 ; +result __name__=a|host=h10|job=x ; 7:4086400000000000 8:4068600000000000 +result __name__=a|host=h2|job=x ; 1:4083300000000000 2:4076f00000000000 3:408cf80000000000 4:4076000000000000 5:408a480000000000 7:4086600000000000 8:408f200000000000 10:4054400000000000 +result __name__=a|host=x|job=y|zone=z1 ; 2:4089e80000000000 3:4082600000000000 5:4080380000000000 7:4081b80000000000 8:4082c80000000000 +result __name__=b|host=h2 ; 0:4043800000000000 1:4058800000000000 2:408ad00000000000 3:407c400000000000 4:408de80000000000 5:4082700000000000 6:4067000000000000 7:4079700000000000 8:4077e00000000000 9:4074100000000000 +end +case label_replace new $1x host [ +grid 100000 10000 2 +series __name__=a|host=h10|zone=z1 ; 1:4085d00000000000 +series __name__=b|host=h2|job=y ; 0:4085780000000000 1:4078d00000000000 +series __name__=b|host=h2|zone=z1 ; 1:407b300000000000 +error invalid regular expression in label_replace(): [ +end +case label_replace host $1x missing .+ +grid 100000 10000 10 +series __name__=b|host=h2|job=ax ; 2:4083f80000000000 3:4060400000000000 5:4089f80000000000 6:4062a00000000000 7:4084180000000000 +series __name__=a|host=h10|job=y|zone=z1 ; 3:4087f00000000000 4:4048000000000000 5:4084980000000000 +series __name__=b|host=h1 ; 5:404d000000000000 6:4045000000000000 7:4008000000000000 +series __name__=b|host=h1|job=x|zone=z1 ; 7:406e400000000000 8:4088480000000000 +result __name__=a|host=h10|job=y|zone=z1 ; 3:4087f00000000000 4:4048000000000000 5:4084980000000000 +result __name__=b|host=h1 ; 5:404d000000000000 6:4045000000000000 7:4008000000000000 +result __name__=b|host=h1|job=x|zone=z1 ; 7:406e400000000000 8:4088480000000000 +result __name__=b|host=h2|job=ax ; 2:4083f80000000000 3:4060400000000000 5:4089f80000000000 6:4062a00000000000 7:4084180000000000 +end +case label_replace new h1 new (?P.)(.*) +grid 100000 10000 2 +series __name__=b|host=h1 ; 1:4046000000000000 +series __name__=b|host=h10|zone=z1 ; 1:408ad80000000000 +series __name__=a|host=h2|job=ax ; 1:4081200000000000 +series __name__=a|host=h10|job=ax|zone=z1 ; +result __name__=a|host=h2|job=ax ; 1:4081200000000000 +result __name__=b|host=h1 ; 1:4046000000000000 +result __name__=b|host=h10|zone=z1 ; 1:408ad80000000000 +end +case label_replace host $1x missing (?i)H(.) +grid 100000 10000 12 +series __name__=b|host=h10|job=ax ; 0:408ab00000000000 1:407ec00000000000 2:4085f00000000000 3:4085b00000000000 +series __name__=b|host=h2 ; 10:4081a00000000000 +result __name__=b|host=h10|job=ax ; 0:408ab00000000000 1:407ec00000000000 2:4085f00000000000 3:4085b00000000000 +result __name__=b|host=h2 ; 10:4081a00000000000 +end +case label_replace host $n zone .* +grid 100000 10000 8 +series __name__=b|host=h1 ; 5:4083700000000000 6:408a880000000000 +series __name__=a|host=h10|job=ax|zone=z1 ; 4:408e780000000000 5:4045000000000000 6:408c780000000000 7:4085300000000000 +series __name__=a|host=h2|job=y ; 4:4065a00000000000 5:4081780000000000 6:4074800000000000 +result __name__=a|job=ax|zone=z1 ; 4:408e780000000000 5:4045000000000000 6:408c780000000000 7:4085300000000000 +result __name__=a|job=y ; 4:4065a00000000000 5:4081780000000000 6:4074800000000000 +result __name__=b ; 5:4083700000000000 6:408a880000000000 +end +case label_replace zone z missing (.*) +grid 100000 10000 11 +series __name__=b|host=h1|job=x|zone=z1 ; 1:408aa80000000000 2:4089800000000000 3:4087180000000000 +series __name__=a|host=x|job=y ; 9:4084e00000000000 +series __name__=a|host=h2|job=y|zone=z1 ; 9:407db00000000000 10:4084900000000000 +series __name__=a|host=x ; 8:407a500000000000 +series __name__=b|host=x|zone=z1 ; 1:408b000000000000 +result __name__=a|host=h2|job=y|zone=z ; 9:407db00000000000 10:4084900000000000 +result __name__=a|host=x|job=y|zone=z ; 9:4084e00000000000 +result __name__=a|host=x|zone=z ; 8:407a500000000000 +result __name__=b|host=h1|job=x|zone=z ; 1:408aa80000000000 2:4089800000000000 3:4087180000000000 +result __name__=b|host=x|zone=z ; 1:408b000000000000 +end +case label_replace new a$2b __name__ (?i)H(.) +grid 100000 10000 12 +series __name__=b|host=x|zone=z1 ; 5:4070b00000000000 6:4085500000000000 7:4084400000000000 +series __name__=a|host=x ; 5:407ae00000000000 9:408e580000000000 10:4088600000000000 +series __name__=b|host=h10|zone=z1 ; 9:4057000000000000 +result __name__=a|host=x ; 5:407ae00000000000 9:408e580000000000 10:4088600000000000 +result __name__=b|host=h10|zone=z1 ; 9:4057000000000000 +result __name__=b|host=x|zone=z1 ; 5:4070b00000000000 6:4085500000000000 7:4084400000000000 +end +case label_replace new z __name__ +grid 100000 10000 12 +series __name__=a|host=h2|job=x|zone=z1 ; 10:4085e00000000000 +series __name__=a|host=h2 ; +series __name__=a|host=h1|job=y ; 8:4078c00000000000 10:4076800000000000 +series __name__=b|host=x|zone=z1 ; 4:407d500000000000 5:408d400000000000 +series __name__=a|host=x ; 6:402e000000000000 7:4071700000000000 +result __name__=a|host=h1|job=y ; 8:4078c00000000000 10:4076800000000000 +result __name__=a|host=h2|job=x|zone=z1 ; 10:4085e00000000000 +result __name__=a|host=x ; 6:402e000000000000 7:4071700000000000 +result __name__=b|host=x|zone=z1 ; 4:407d500000000000 5:408d400000000000 +end +case label_replace job ${1}x new .+ +grid 100000 10000 4 +series __name__=a|host=h1 ; 2:4081b00000000000 +series __name__=a|host=h2|job=ax ; 2:407db00000000000 +series __name__=a|host=h2|job=x ; 1:4071100000000000 2:4051800000000000 +series __name__=a|host=h2|job=y ; 3:4085d00000000000 +result __name__=a|host=h1 ; 2:4081b00000000000 +result __name__=a|host=h2|job=ax ; 2:407db00000000000 +result __name__=a|host=h2|job=x ; 1:4071100000000000 2:4051800000000000 +result __name__=a|host=h2|job=y ; 3:4085d00000000000 +end +case label_replace host a$2b __name__ h(.*) +grid 100000 10000 3 +series __name__=a|host=x|zone=z1 ; 1:4081300000000000 +series __name__=b|host=h10|job=ax|zone=z1 ; 1:4059400000000000 +series __name__=a|host=h1|job=ax|zone=z1 ; +series __name__=b|host=x|job=ax ; 0:402a000000000000 1:4088c80000000000 2:4088680000000000 +series __name__=a|host=h1|job=y ; 0:4063800000000000 1:4072f00000000000 +result __name__=a|host=h1|job=y ; 0:4063800000000000 1:4072f00000000000 +result __name__=a|host=x|zone=z1 ; 1:4081300000000000 +result __name__=b|host=h10|job=ax|zone=z1 ; 1:4059400000000000 +result __name__=b|host=x|job=ax ; 0:402a000000000000 1:4088c80000000000 2:4088680000000000 +end +case label_replace new $0 host +grid 100000 10000 1 +series __name__=a|host=h10|zone=z1 ; 0:408a580000000000 +series __name__=b|host=x|job=y ; 0:4081a80000000000 +series __name__=a|host=h2|job=x ; 0:4081e80000000000 +result __name__=a|host=h10|zone=z1 ; 0:408a580000000000 +result __name__=a|host=h2|job=x ; 0:4081e80000000000 +result __name__=b|host=x|job=y ; 0:4081a80000000000 +end +case label_replace zone $$ job +grid 100000 10000 3 +series __name__=a|host=h1|job=ax ; 2:408a400000000000 +series __name__=a|host=x|job=x ; 0:4071b00000000000 1:408c480000000000 2:4060a00000000000 +series __name__=a|host=h1|zone=z1 ; +series __name__=a|host=x|zone=z1 ; 1:4089c00000000000 +series __name__=a|host=x|job=y|zone=z1 ; +series __name__=a|host=h10|job=ax ; 2:4081300000000000 +result __name__=a|host=h1|job=ax ; 2:408a400000000000 +result __name__=a|host=h10|job=ax ; 2:4081300000000000 +result __name__=a|host=x|job=x ; 0:4071b00000000000 1:408c480000000000 2:4060a00000000000 +result __name__=a|host=x|zone=$ ; 1:4089c00000000000 +end +case label_replace host $ job (.*) +grid 100000 10000 3 +series __name__=a|host=h10|job=x ; 2:408de80000000000 +series __name__=b|host=h1|zone=z1 ; 2:4075200000000000 +result __name__=a|host=$|job=x ; 2:408de80000000000 +result __name__=b|host=$|zone=z1 ; 2:4075200000000000 +end +case label_replace job $1x new (x|y) +grid 100000 10000 1 +series __name__=b|host=h1|job=y ; +series __name__=a|host=h10|job=x ; 0:407d200000000000 +series __name__=b|host=h2|job=x|zone=z1 ; 0:407b200000000000 +series __name__=a|host=h10|job=x|zone=z1 ; 0:4064400000000000 +series __name__=a|host=h1 ; 0:406aa00000000000 +result __name__=a|host=h1 ; 0:406aa00000000000 +result __name__=a|host=h10|job=x ; 0:407d200000000000 +result __name__=a|host=h10|job=x|zone=z1 ; 0:4064400000000000 +result __name__=b|host=h2|job=x|zone=z1 ; 0:407b200000000000 +end +case label_replace host h1 new (.*) +grid 100000 10000 8 +series __name__=a|host=x ; 3:4079200000000000 4:407eb00000000000 +series __name__=a|host=x|job=ax ; +series __name__=b|host=h10|job=y ; 1:407d800000000000 2:4084a80000000000 +series __name__=a|host=h2 ; 5:4086f80000000000 6:4078600000000000 +result __name__=a|host=h1 ; 3:4079200000000000 4:407eb00000000000 5:4086f80000000000 6:4078600000000000 +result __name__=b|host=h1|job=y ; 1:407d800000000000 2:4084a80000000000 +end +case label_replace zone $1x missing (.) +grid 100000 10000 3 +series __name__=b|host=h2 ; 1:4067c00000000000 +result __name__=b|host=h2 ; 1:4067c00000000000 +end +case label_replace new ${n} missing [ +grid 100000 10000 10 +series __name__=b|host=h10 ; 4:407cf00000000000 5:4074b00000000000 6:4076c00000000000 +series __name__=b|host=h10|job=y|zone=z1 ; 0:408d200000000000 1:407ca00000000000 2:4024000000000000 3:4080f80000000000 5:404e000000000000 7:4078f00000000000 8:4073000000000000 +series __name__=a|host=h2|job=y ; 4:408e980000000000 5:4065800000000000 6:407a800000000000 7:4068a00000000000 8:4088d80000000000 +series __name__=b|host=h2 ; 5:408b700000000000 6:4080480000000000 7:4086800000000000 8:4081b80000000000 +error invalid regular expression in label_replace(): [ +end +case label_replace new $1 job (.*) +grid 100000 10000 4 +series __name__=b|host=x ; 3:4066a00000000000 +series __name__=b|host=h1|job=x|zone=z1 ; 3:4073200000000000 +series __name__=a|host=h1|job=y|zone=z1 ; 2:4088080000000000 +series __name__=b|host=x|job=y|zone=z1 ; 0:4083c80000000000 +series __name__=b|host=h1|job=x ; 1:4084500000000000 +series __name__=a|host=h2|job=x|zone=z1 ; +result __name__=a|host=h1|job=y|new=y|zone=z1 ; 2:4088080000000000 +result __name__=b|host=h1|job=x|new=x ; 1:4084500000000000 +result __name__=b|host=h1|job=x|new=x|zone=z1 ; 3:4073200000000000 +result __name__=b|host=x ; 3:4066a00000000000 +result __name__=b|host=x|job=y|new=y|zone=z1 ; 0:4083c80000000000 +end +case label_replace host h1 job (?i)H(.) +grid 100000 10000 12 +series __name__=a|host=h2 ; 9:406ca00000000000 +result __name__=a|host=h2 ; 9:406ca00000000000 +end +case label_replace job $0 job h(.*) +grid 100000 10000 3 +series __name__=a|host=x|job=ax ; +series __name__=a|host=h1|job=ax ; 0:4084680000000000 1:407a100000000000 2:4074a00000000000 +result __name__=a|host=h1|job=ax ; 0:4084680000000000 1:407a100000000000 2:4074a00000000000 +end +case label_replace new $0 missing (.*) +grid 100000 10000 12 +series __name__=b|host=h1|job=x ; +series __name__=a|host=x|job=ax ; 7:4084780000000000 +series __name__=b|host=h10|zone=z1 ; 11:4085c80000000000 +series __name__=b|host=x|job=ax|zone=z1 ; 8:408b000000000000 +series __name__=a|host=h2|zone=z1 ; 0:4076400000000000 1:408a680000000000 2:4081d80000000000 3:4088700000000000 4:4060800000000000 6:407b100000000000 8:408e100000000000 +result __name__=a|host=h2|zone=z1 ; 0:4076400000000000 1:408a680000000000 2:4081d80000000000 3:4088700000000000 4:4060800000000000 6:407b100000000000 8:408e100000000000 +result __name__=a|host=x|job=ax ; 7:4084780000000000 +result __name__=b|host=h10|zone=z1 ; 11:4085c80000000000 +result __name__=b|host=x|job=ax|zone=z1 ; 8:408b000000000000 +end +case label_replace __name__ $ missing h1|x +grid 100000 10000 7 +series __name__=a|host=h1|job=y ; 6:405bc00000000000 +series __name__=a|host=h1 ; 0:4081900000000000 1:408d080000000000 2:4068e00000000000 3:4085e80000000000 4:4084b80000000000 5:4040000000000000 +series __name__=a|host=h2 ; 3:4076b00000000000 4:408d100000000000 +series __name__=b|host=h10|job=ax ; 6:407e700000000000 +series __name__=a|host=h10|job=ax ; 3:4083500000000000 4:407db00000000000 +series __name__=a|host=x|job=ax|zone=z1 ; 6:4081900000000000 +result __name__=a|host=h1 ; 0:4081900000000000 1:408d080000000000 2:4068e00000000000 3:4085e80000000000 4:4084b80000000000 5:4040000000000000 +result __name__=a|host=h1|job=y ; 6:405bc00000000000 +result __name__=a|host=h10|job=ax ; 3:4083500000000000 4:407db00000000000 +result __name__=a|host=h2 ; 3:4076b00000000000 4:408d100000000000 +result __name__=a|host=x|job=ax|zone=z1 ; 6:4081900000000000 +result __name__=b|host=h10|job=ax ; 6:407e700000000000 +end +case label_replace host $0 host (.*) +grid 100000 10000 5 +series __name__=b|host=x|job=y|zone=z1 ; 2:4085780000000000 3:4058800000000000 +series __name__=a|host=x ; 3:406c000000000000 +series __name__=b|host=x|job=y ; 4:4083780000000000 +result __name__=a|host=x ; 3:406c000000000000 +result __name__=b|host=x|job=y ; 4:4083780000000000 +result __name__=b|host=x|job=y|zone=z1 ; 2:4085780000000000 3:4058800000000000 +end +case label_replace host z job h\d +grid 100000 10000 3 +series __name__=b|host=h10 ; 0:407d700000000000 1:408b100000000000 2:4088400000000000 +series __name__=b|host=h2|job=y ; 2:4062000000000000 +series __name__=b|host=h10|job=y ; 1:4069a00000000000 +series __name__=b|host=h1|job=y|zone=z1 ; 2:4087380000000000 +result __name__=b|host=h1|job=y|zone=z1 ; 2:4087380000000000 +result __name__=b|host=h10 ; 0:407d700000000000 1:408b100000000000 2:4088400000000000 +result __name__=b|host=h10|job=y ; 1:4069a00000000000 +result __name__=b|host=h2|job=y ; 2:4062000000000000 +end +case label_replace zone $0 missing (.*) +grid 100000 10000 10 +series __name__=a|host=h2|job=ax ; 1:4080600000000000 3:4018000000000000 4:408f080000000000 5:4068e00000000000 +series __name__=a|host=x|zone=z1 ; 5:408db00000000000 6:4072800000000000 8:4082d80000000000 9:4073900000000000 +series __name__=b|host=x|job=y ; 9:408b800000000000 +series __name__=b|host=h2 ; 9:4089400000000000 +result __name__=a|host=h2|job=ax ; 1:4080600000000000 3:4018000000000000 4:408f080000000000 5:4068e00000000000 +result __name__=a|host=x ; 5:408db00000000000 6:4072800000000000 8:4082d80000000000 9:4073900000000000 +result __name__=b|host=h2 ; 9:4089400000000000 +result __name__=b|host=x|job=y ; 9:408b800000000000 +end +case label_replace host $ __name__ [ +grid 100000 10000 3 +series __name__=b|host=h1|job=x ; 1:406c200000000000 2:4077200000000000 +series __name__=a|host=h1 ; 1:4085300000000000 +series __name__=a|host=h1|zone=z1 ; 0:4065800000000000 +series __name__=b|host=x|job=ax|zone=z1 ; 1:408cc00000000000 +error invalid regular expression in label_replace(): [ +end +case label_replace host z __name__ .+ +grid 100000 10000 2 +series __name__=a|host=x ; 0:4008000000000000 +series __name__=a|host=h1|zone=z1 ; +series __name__=b|host=h1 ; 1:4084280000000000 +series __name__=a|host=h2|job=ax ; 1:4054000000000000 +series __name__=b|host=h10|job=x|zone=z1 ; 1:4075700000000000 +series __name__=b|host=h1|job=x ; 0:4084f80000000000 1:407b900000000000 +result __name__=a|host=z ; 0:4008000000000000 +result __name__=a|host=z|job=ax ; 1:4054000000000000 +result __name__=b|host=z ; 1:4084280000000000 +result __name__=b|host=z|job=x ; 0:4084f80000000000 1:407b900000000000 +result __name__=b|host=z|job=x|zone=z1 ; 1:4075700000000000 +end +case label_replace job ${1}x __name__ h\d +grid 100000 10000 5 +series __name__=b|host=h2|zone=z1 ; +series __name__=b|host=h10 ; 2:4036000000000000 +series __name__=b|host=h1 ; 1:4081680000000000 +series __name__=b|host=x|job=x ; 2:4079100000000000 3:407b900000000000 +result __name__=b|host=h1 ; 1:4081680000000000 +result __name__=b|host=h10 ; 2:4036000000000000 +result __name__=b|host=x|job=x ; 2:4079100000000000 3:407b900000000000 +end +case label_replace zone a$2b job +grid 100000 10000 10 +series __name__=b|host=h2|job=y|zone=z1 ; 6:4089180000000000 7:4028000000000000 8:4075b00000000000 +result __name__=b|host=h2|job=y|zone=z1 ; 6:4089180000000000 7:4028000000000000 8:4075b00000000000 +end +case label_replace job h1 __name__ (?i)H(.) +grid 100000 10000 9 +series __name__=b|host=h2|job=ax ; 4:4088600000000000 5:407dc00000000000 6:408b980000000000 +series __name__=b|host=h10|job=ax|zone=z1 ; +series __name__=a|host=h10 ; +series __name__=b|host=h2|job=y|zone=z1 ; 5:407b400000000000 +series __name__=a|host=h10|zone=z1 ; 2:405b000000000000 3:4051400000000000 5:4081300000000000 +result __name__=a|host=h10|zone=z1 ; 2:405b000000000000 3:4051400000000000 5:4081300000000000 +result __name__=b|host=h2|job=ax ; 4:4088600000000000 5:407dc00000000000 6:408b980000000000 +result __name__=b|host=h2|job=y|zone=z1 ; 5:407b400000000000 +end +case label_replace __name__ ${1}x new (?i)H(.) +grid 100000 10000 10 +series __name__=a|host=h2|job=y ; 7:408d180000000000 +series __name__=a|host=h10|job=ax ; 3:4089d80000000000 4:4084a00000000000 +series __name__=b|host=h10|zone=z1 ; 1:4086b80000000000 2:4089c80000000000 3:405e800000000000 4:4063a00000000000 6:4070300000000000 +series __name__=b|host=h2|job=ax ; 6:4085800000000000 7:408ce80000000000 +result __name__=a|host=h10|job=ax ; 3:4089d80000000000 4:4084a00000000000 +result __name__=a|host=h2|job=y ; 7:408d180000000000 +result __name__=b|host=h10|zone=z1 ; 1:4086b80000000000 2:4089c80000000000 3:405e800000000000 4:4063a00000000000 6:4070300000000000 +result __name__=b|host=h2|job=ax ; 6:4085800000000000 7:408ce80000000000 +end +case label_replace job a$2b __name__ (?i)H(.) +grid 100000 10000 10 +series __name__=b|host=h1|job=x|zone=z1 ; 9:4040000000000000 +series __name__=a|host=h1|job=x ; 7:408d180000000000 8:4080e80000000000 +series __name__=b|host=h10|job=ax|zone=z1 ; 5:4079b00000000000 6:4071d00000000000 7:4069000000000000 9:407c200000000000 +series __name__=a|host=h10|job=ax ; 7:4031000000000000 +series __name__=b|host=x ; 1:405c000000000000 +series __name__=a|host=x ; 6:408d380000000000 7:408da80000000000 8:408ad00000000000 9:4082f00000000000 +result __name__=a|host=h1|job=x ; 7:408d180000000000 8:4080e80000000000 +result __name__=a|host=h10|job=ax ; 7:4031000000000000 +result __name__=a|host=x ; 6:408d380000000000 7:408da80000000000 8:408ad00000000000 9:4082f00000000000 +result __name__=b|host=h1|job=x|zone=z1 ; 9:4040000000000000 +result __name__=b|host=h10|job=ax|zone=z1 ; 5:4079b00000000000 6:4071d00000000000 7:4069000000000000 9:407c200000000000 +result __name__=b|host=x ; 1:405c000000000000 +end +case label_replace new $0 __name__ h1|x +grid 100000 10000 1 +series __name__=a|host=h1 ; +series __name__=a|host=x ; +series __name__=b|host=h10|job=y|zone=z1 ; 0:4083400000000000 +series __name__=a|host=h1|job=ax ; 0:4064000000000000 +series __name__=a|host=h1|job=ax|zone=z1 ; 0:406de00000000000 +series __name__=a|host=x|job=ax|zone=z1 ; 0:408b900000000000 +result __name__=a|host=h1|job=ax ; 0:4064000000000000 +result __name__=a|host=h1|job=ax|zone=z1 ; 0:406de00000000000 +result __name__=a|host=x|job=ax|zone=z1 ; 0:408b900000000000 +result __name__=b|host=h10|job=y|zone=z1 ; 0:4083400000000000 +end +case label_replace __name__ $n missing (?i)H(.) +grid 100000 10000 1 +series __name__=a|host=h2|job=y ; 0:4083200000000000 +series __name__=a|host=h2 ; +series __name__=a|host=x ; 0:4083e80000000000 +series __name__=a|host=x|job=ax ; 0:4085b00000000000 +series __name__=a|host=h1|job=y|zone=z1 ; +result __name__=a|host=h2|job=y ; 0:4083200000000000 +result __name__=a|host=x ; 0:4083e80000000000 +result __name__=a|host=x|job=ax ; 0:4085b00000000000 +end +case label_replace job $ __name__ h1|x +grid 100000 10000 1 +series __name__=a|host=h10|job=y ; +end +case label_replace new $ __name__ h1|x +grid 100000 10000 1 +series __name__=a|host=h2|job=y ; +series __name__=a|host=h10|job=ax ; 0:407ea00000000000 +series __name__=a|host=x|job=y ; 0:4047800000000000 +series __name__=b|host=x|job=y ; 0:4041000000000000 +result __name__=a|host=h10|job=ax ; 0:407ea00000000000 +result __name__=a|host=x|job=y ; 0:4047800000000000 +result __name__=b|host=x|job=y ; 0:4041000000000000 +end +case label_replace zone h1 __name__ (?i)H(.) +grid 100000 10000 10 +series __name__=b|host=h10|job=y|zone=z1 ; 2:4065e00000000000 3:407a500000000000 6:408d380000000000 +series __name__=a|host=h1|job=y ; 5:407dd00000000000 +series __name__=b|host=x|job=y ; +result __name__=a|host=h1|job=y ; 5:407dd00000000000 +result __name__=b|host=h10|job=y|zone=z1 ; 2:4065e00000000000 3:407a500000000000 6:408d380000000000 +end +case label_replace zone $$ missing (?P.)(.*) +grid 100000 10000 11 +series __name__=b|host=h10|job=y ; +series __name__=a|host=h1|job=x ; 5:407a400000000000 +series __name__=b|host=h2|job=ax ; 1:4084e00000000000 2:4075c00000000000 3:4082380000000000 4:4080a80000000000 6:4073f00000000000 7:407df00000000000 +series __name__=a|host=h10|zone=z1 ; +series __name__=b|host=x|zone=z1 ; 4:406aa00000000000 5:4089c00000000000 6:4037000000000000 7:4081800000000000 +result __name__=a|host=h1|job=x ; 5:407a400000000000 +result __name__=b|host=h2|job=ax ; 1:4084e00000000000 2:4075c00000000000 3:4082380000000000 4:4080a80000000000 6:4073f00000000000 7:407df00000000000 +result __name__=b|host=x|zone=z1 ; 4:406aa00000000000 5:4089c00000000000 6:4037000000000000 7:4081800000000000 +end +case label_replace host __name__ [ +grid 100000 10000 4 +series __name__=a|host=h2|job=y ; +series __name__=b|host=h2|job=y|zone=z1 ; +series __name__=b|host=h1 ; +series __name__=a|host=h1|job=y|zone=z1 ; 3:4086b80000000000 +series __name__=a|host=h1 ; 2:4077600000000000 +error invalid regular expression in label_replace(): [ +end +case label_replace new $1 __name__ (?P.)(.*) +grid 100000 10000 7 +series __name__=b|host=h1|job=y ; 3:408d400000000000 +result __name__=b|host=h1|job=y|new=b ; 3:408d400000000000 +end +case label_replace new $0 __name__ x? +grid 100000 10000 9 +series __name__=a|host=h10 ; 5:4018000000000000 6:4059c00000000000 7:4054400000000000 +series __name__=b|host=x|job=y|zone=z1 ; 0:4075000000000000 1:4055c00000000000 2:4080e80000000000 +series __name__=b|host=h1|job=y ; 0:4085000000000000 1:4075500000000000 2:4072800000000000 3:4078c00000000000 4:4082880000000000 +series __name__=a|host=x|job=y|zone=z1 ; 7:4081b80000000000 +result __name__=a|host=h10 ; 5:4018000000000000 6:4059c00000000000 7:4054400000000000 +result __name__=a|host=x|job=y|zone=z1 ; 7:4081b80000000000 +result __name__=b|host=h1|job=y ; 0:4085000000000000 1:4075500000000000 2:4072800000000000 3:4078c00000000000 4:4082880000000000 +result __name__=b|host=x|job=y|zone=z1 ; 0:4075000000000000 1:4055c00000000000 2:4080e80000000000 +end +case label_replace new $$ __name__ x? +grid 100000 10000 5 +series __name__=b|host=h2|job=ax ; 3:408a980000000000 +series __name__=b|host=h10|zone=z1 ; 0:407a000000000000 1:4057c00000000000 +result __name__=b|host=h10|zone=z1 ; 0:407a000000000000 1:4057c00000000000 +result __name__=b|host=h2|job=ax ; 3:408a980000000000 +end +case label_replace zone ${1}x zone +grid 100000 10000 8 +series __name__=b|host=x|job=x|zone=z1 ; 7:4052400000000000 +series __name__=a|host=x ; 5:408f000000000000 6:4057400000000000 +series __name__=a|host=h10|job=x ; 1:4084280000000000 3:406b800000000000 6:407fd00000000000 +series __name__=b|host=h10|zone=z1 ; 6:4071c00000000000 +series __name__=a|host=h2 ; 4:4087d00000000000 5:4077900000000000 6:4083e00000000000 7:4088500000000000 +series __name__=a|host=h1|job=ax ; 3:4059c00000000000 4:4079b00000000000 +result __name__=a|host=h1|job=ax|zone=x ; 3:4059c00000000000 4:4079b00000000000 +result __name__=a|host=h10|job=x|zone=x ; 1:4084280000000000 3:406b800000000000 6:407fd00000000000 +result __name__=a|host=h2|zone=x ; 4:4087d00000000000 5:4077900000000000 6:4083e00000000000 7:4088500000000000 +result __name__=a|host=x|zone=x ; 5:408f000000000000 6:4057400000000000 +result __name__=b|host=h10|zone=z1 ; 6:4071c00000000000 +result __name__=b|host=x|job=x|zone=z1 ; 7:4052400000000000 +end +case label_replace new $$ host h\d +grid 100000 10000 1 +series __name__=b|host=h1|job=ax ; 0:4073b00000000000 +series __name__=b|host=h2|job=y|zone=z1 ; 0:407fe00000000000 +series __name__=b|host=h1|job=x ; 0:407ba00000000000 +series __name__=b|host=x|job=ax|zone=z1 ; 0:4084800000000000 +result __name__=b|host=h1|job=ax|new=$ ; 0:4073b00000000000 +result __name__=b|host=h1|job=x|new=$ ; 0:407ba00000000000 +result __name__=b|host=h2|job=y|new=$|zone=z1 ; 0:407fe00000000000 +result __name__=b|host=x|job=ax|zone=z1 ; 0:4084800000000000 +end +case label_replace new $1x __name__ [ +grid 100000 10000 1 +series __name__=a|host=x|zone=z1 ; +series __name__=a|host=h2|job=y ; +series __name__=a|host=h10|job=x ; 0:4077e00000000000 +error invalid regular expression in label_replace(): [ +end +case label_replace __name__ h1 host (x|y) +grid 100000 10000 6 +series __name__=b|host=h1|job=y|zone=z1 ; 2:4068400000000000 3:4075600000000000 +series __name__=b|host=h1|zone=z1 ; 1:404f800000000000 +result __name__=b|host=h1|job=y|zone=z1 ; 2:4068400000000000 3:4075600000000000 +result __name__=b|host=h1|zone=z1 ; 1:404f800000000000 +end +case label_replace new a$2b missing [ +grid 100000 10000 3 +series __name__=b|host=h2|job=y ; 1:4034000000000000 2:408a600000000000 +series __name__=b|host=x ; 2:4062600000000000 +series __name__=b|host=x|job=ax ; +error invalid regular expression in label_replace(): [ +end +case label_replace new ${1}x zone .+ +grid 100000 10000 3 +series __name__=a|host=x ; 2:4088a00000000000 +series __name__=b|host=h1|job=y ; +result __name__=a|host=x ; 2:4088a00000000000 +end +case label_replace __name__ z job h1|x +grid 100000 10000 12 +series __name__=b|host=h1|job=ax ; 7:4050c00000000000 8:4089a80000000000 9:408a780000000000 10:4064200000000000 11:4061200000000000 +series __name__=b|host=h10|job=y ; 4:405cc00000000000 5:407ac00000000000 6:406e000000000000 +series __name__=b|host=h10|job=x ; 8:404c800000000000 +series __name__=a|host=h10|job=y ; 10:4087b80000000000 +series __name__=b|host=h10|zone=z1 ; 7:408da80000000000 8:4088900000000000 9:408f000000000000 10:4082c00000000000 11:408ab00000000000 +series __name__=a|host=x|job=x ; 6:4088d00000000000 +result __name__=a|host=h10|job=y ; 10:4087b80000000000 +result __name__=b|host=h1|job=ax ; 7:4050c00000000000 8:4089a80000000000 9:408a780000000000 10:4064200000000000 11:4061200000000000 +result __name__=b|host=h10|job=y ; 4:405cc00000000000 5:407ac00000000000 6:406e000000000000 +result __name__=b|host=h10|zone=z1 ; 7:408da80000000000 8:4088900000000000 9:408f000000000000 10:4082c00000000000 11:408ab00000000000 +result __name__=z|host=h10|job=x ; 8:404c800000000000 +result __name__=z|host=x|job=x ; 6:4088d00000000000 +end +case label_replace new $0 new .+ +grid 100000 10000 12 +series __name__=b|host=h10|job=ax ; 1:408d700000000000 2:4082f00000000000 3:4079f00000000000 4:406fc00000000000 7:405c400000000000 +series __name__=b|host=h10 ; 6:407c700000000000 7:408cb00000000000 9:401c000000000000 10:4087900000000000 +series __name__=a|host=h2|zone=z1 ; 6:4078000000000000 7:4084c80000000000 8:408b380000000000 9:4074c00000000000 +series __name__=b|host=h1|job=x ; 1:4071700000000000 3:4036000000000000 4:408a500000000000 5:4089000000000000 +result __name__=a|host=h2|zone=z1 ; 6:4078000000000000 7:4084c80000000000 8:408b380000000000 9:4074c00000000000 +result __name__=b|host=h1|job=x ; 1:4071700000000000 3:4036000000000000 4:408a500000000000 5:4089000000000000 +result __name__=b|host=h10 ; 6:407c700000000000 7:408cb00000000000 9:401c000000000000 10:4087900000000000 +result __name__=b|host=h10|job=ax ; 1:408d700000000000 2:4082f00000000000 3:4079f00000000000 4:406fc00000000000 7:405c400000000000 +end +case label_replace __name__ $1x zone (?P.)(.*) +grid 100000 10000 6 +series __name__=b|host=h1 ; 4:406fc00000000000 +series __name__=b|host=x|job=ax ; 3:4041800000000000 5:4084500000000000 +series __name__=b|host=h1|job=ax|zone=z1 ; +series __name__=b|host=x|job=x|zone=z1 ; 4:4089f80000000000 +series __name__=b|host=h1|job=y ; +series __name__=b|host=x ; 2:406b000000000000 +result __name__=b|host=h1 ; 4:406fc00000000000 +result __name__=b|host=x ; 2:406b000000000000 +result __name__=b|host=x|job=ax ; 3:4041800000000000 5:4084500000000000 +result host=x|job=x|zone=z1 ; 4:4089f80000000000 +end +case label_replace new $1x job (x|y) +grid 100000 10000 4 +series __name__=a|host=x|job=x|zone=z1 ; 0:4089b80000000000 +series __name__=b|host=x|job=y ; 1:4086300000000000 +series __name__=a|host=h2|job=ax|zone=z1 ; 3:408d180000000000 +series __name__=a|host=h10|job=x ; 2:4087200000000000 +series __name__=b|host=h10|job=x|zone=z1 ; 2:408d700000000000 +series __name__=b|host=h10 ; 0:4079500000000000 1:4086380000000000 3:4081780000000000 +result __name__=a|host=h10|job=x ; 2:4087200000000000 +result __name__=a|host=h2|job=ax|zone=z1 ; 3:408d180000000000 +result __name__=a|host=x|job=x|zone=z1 ; 0:4089b80000000000 +result __name__=b|host=h10 ; 0:4079500000000000 1:4086380000000000 3:4081780000000000 +result __name__=b|host=h10|job=x|zone=z1 ; 2:408d700000000000 +result __name__=b|host=x|job=y ; 1:4086300000000000 +end +case label_replace zone z __name__ (?P.)(.*) +grid 100000 10000 4 +series __name__=b|host=h10|job=y|zone=z1 ; 3:4084700000000000 +series __name__=a|host=h1|job=y ; 0:4070400000000000 1:406f400000000000 +series __name__=b|host=h2 ; 1:4040000000000000 2:408c980000000000 +series __name__=b|host=x|job=x|zone=z1 ; 3:4089500000000000 +series __name__=b|host=h2|job=ax|zone=z1 ; 2:408b100000000000 +result __name__=a|host=h1|job=y|zone=z ; 0:4070400000000000 1:406f400000000000 +result __name__=b|host=h10|job=y|zone=z ; 3:4084700000000000 +result __name__=b|host=h2|job=ax|zone=z ; 2:408b100000000000 +result __name__=b|host=h2|zone=z ; 1:4040000000000000 2:408c980000000000 +result __name__=b|host=x|job=x|zone=z ; 3:4089500000000000 +end +case label_replace __name__ new .+ +grid 100000 10000 12 +series __name__=a|host=h10 ; 2:407ba00000000000 3:4076a00000000000 +series __name__=b|host=h10|job=ax|zone=z1 ; 7:406b600000000000 8:408a480000000000 +series __name__=a|host=h10|zone=z1 ; 1:4080000000000000 2:4089900000000000 3:4074100000000000 5:407a300000000000 6:4074400000000000 8:4064c00000000000 9:4081f00000000000 +series __name__=a|host=h1|job=y ; 10:4081380000000000 +result __name__=a|host=h1|job=y ; 10:4081380000000000 +result __name__=a|host=h10 ; 2:407ba00000000000 3:4076a00000000000 +result __name__=a|host=h10|zone=z1 ; 1:4080000000000000 2:4089900000000000 3:4074100000000000 5:407a300000000000 6:4074400000000000 8:4064c00000000000 9:4081f00000000000 +result __name__=b|host=h10|job=ax|zone=z1 ; 7:406b600000000000 8:408a480000000000 +end +case label_replace new z __name__ h\d +grid 100000 10000 3 +series __name__=a|host=h10 ; +series __name__=a|host=x|job=ax ; +series __name__=a|host=h1|job=ax ; 2:408b300000000000 +series __name__=a|host=h2|zone=z1 ; 0:408e680000000000 +series __name__=a|host=x|job=x|zone=z1 ; 0:4077a00000000000 1:4089900000000000 +result __name__=a|host=h1|job=ax ; 2:408b300000000000 +result __name__=a|host=h2|zone=z1 ; 0:408e680000000000 +result __name__=a|host=x|job=x|zone=z1 ; 0:4077a00000000000 1:4089900000000000 +end +case label_replace __name__ $n new (?P.)(.*) +grid 100000 10000 11 +series __name__=a|host=h1|zone=z1 ; 8:4081d00000000000 9:408ee80000000000 +result __name__=a|host=h1|zone=z1 ; 8:4081d00000000000 9:408ee80000000000 +end +case label_replace __name__ $1 __name__ (?P.)(.*) +grid 100000 10000 8 +series __name__=a|host=h1|job=x|zone=z1 ; 1:4070000000000000 2:4084900000000000 3:4076200000000000 +series __name__=a|host=x ; +series __name__=a|host=h1|job=y ; 5:4084180000000000 +result __name__=a|host=h1|job=x|zone=z1 ; 1:4070000000000000 2:4084900000000000 3:4076200000000000 +result __name__=a|host=h1|job=y ; 5:4084180000000000 +end +case label_replace host $1 job .+ +grid 100000 10000 3 +series __name__=a|host=h1|job=ax|zone=z1 ; 0:4086700000000000 1:4041800000000000 +result __name__=a|job=ax|zone=z1 ; 0:4086700000000000 1:4041800000000000 +end +case label_replace host $ __name__ h(.*) +grid 100000 10000 6 +series __name__=b|host=h10 ; 4:406ec00000000000 5:407a400000000000 +series __name__=b|host=h10|job=ax ; 4:4066e00000000000 +series __name__=b|host=x|job=ax ; 4:4081d80000000000 5:4066a00000000000 +series __name__=a|host=h2|job=y ; 1:406ca00000000000 3:404e000000000000 4:405cc00000000000 +series __name__=b|host=h1|job=x|zone=z1 ; 5:4088f80000000000 +result __name__=a|host=h2|job=y ; 1:406ca00000000000 3:404e000000000000 4:405cc00000000000 +result __name__=b|host=h1|job=x|zone=z1 ; 5:4088f80000000000 +result __name__=b|host=h10 ; 4:406ec00000000000 5:407a400000000000 +result __name__=b|host=h10|job=ax ; 4:4066e00000000000 +result __name__=b|host=x|job=ax ; 4:4081d80000000000 5:4066a00000000000 +end +case label_replace new ${1}x __name__ h(.*) +grid 100000 10000 10 +series __name__=b|host=x|job=ax ; 0:408ef00000000000 1:405d800000000000 +series __name__=b|host=h1|job=x|zone=z1 ; 7:4089800000000000 8:4088c00000000000 +result __name__=b|host=h1|job=x|zone=z1 ; 7:4089800000000000 8:4088c00000000000 +result __name__=b|host=x|job=ax ; 0:408ef00000000000 1:405d800000000000 +end +case label_replace job z job x? +grid 100000 10000 11 +series __name__=a|host=x ; 7:4085980000000000 +series __name__=b|host=h10|job=ax ; 4:4071900000000000 5:408cd80000000000 7:4081000000000000 +series __name__=b|host=h1|job=ax ; 7:408b580000000000 8:4064c00000000000 +result __name__=a|host=x|job=z ; 7:4085980000000000 +result __name__=b|host=h1|job=ax ; 7:408b580000000000 8:4064c00000000000 +result __name__=b|host=h10|job=ax ; 4:4071900000000000 5:408cd80000000000 7:4081000000000000 +end +case label_replace host ${1}x __name__ .+ +grid 100000 10000 5 +series __name__=a|host=h1 ; 2:4078900000000000 4:4086380000000000 +series __name__=b|host=h2|job=ax ; 3:4088b00000000000 4:408d400000000000 +series __name__=b|host=h1|zone=z1 ; 0:406d600000000000 +series __name__=a|host=h2|job=ax ; 1:4085700000000000 2:4085380000000000 3:4089700000000000 +series __name__=b|host=h10|job=y ; 0:4087080000000000 1:4050800000000000 2:4014000000000000 3:407bb00000000000 +result __name__=a|host=x ; 2:4078900000000000 4:4086380000000000 +result __name__=a|host=x|job=ax ; 1:4085700000000000 2:4085380000000000 3:4089700000000000 +result __name__=b|host=x|job=ax ; 3:4088b00000000000 4:408d400000000000 +result __name__=b|host=x|job=y ; 0:4087080000000000 1:4050800000000000 2:4014000000000000 3:407bb00000000000 +result __name__=b|host=x|zone=z1 ; 0:406d600000000000 +end +case label_replace job new [ +grid 100000 10000 8 +series __name__=a|host=h2|job=x ; 3:4081c80000000000 4:4071a00000000000 5:4081880000000000 6:4085600000000000 +series __name__=a|host=h1 ; 3:4061e00000000000 4:4084180000000000 5:4077900000000000 6:4085900000000000 +series __name__=a|host=h10 ; 1:4062c00000000000 2:4083a80000000000 3:4058400000000000 4:4080400000000000 5:4088080000000000 +series __name__=b|host=h1|job=y ; 7:407d500000000000 +series __name__=b|host=h2|job=y ; 5:406e200000000000 6:4087180000000000 +error invalid regular expression in label_replace(): [ +end +case label_replace __name__ $ zone h\d +grid 100000 10000 10 +series __name__=a|host=x|job=ax|zone=z1 ; +series __name__=b|host=x|job=y ; 8:4070800000000000 +series __name__=a|host=h10|zone=z1 ; 0:4082680000000000 1:408c800000000000 2:4042800000000000 3:4065a00000000000 4:4083e80000000000 5:405a800000000000 6:408ce80000000000 8:408b880000000000 +series __name__=a|host=h2 ; +series __name__=b|host=x ; 5:408c280000000000 6:4076d00000000000 +series __name__=a|host=h1|zone=z1 ; 8:4085b00000000000 +result __name__=a|host=h1|zone=z1 ; 8:4085b00000000000 +result __name__=a|host=h10|zone=z1 ; 0:4082680000000000 1:408c800000000000 2:4042800000000000 3:4065a00000000000 4:4083e80000000000 5:405a800000000000 6:408ce80000000000 8:408b880000000000 +result __name__=b|host=x ; 5:408c280000000000 6:4076d00000000000 +result __name__=b|host=x|job=y ; 8:4070800000000000 +end +case label_replace __name__ $1x host [ +grid 100000 10000 4 +series __name__=a|host=h1|job=x|zone=z1 ; 3:407d600000000000 +series __name__=a|host=x|zone=z1 ; +series __name__=b|host=h2|job=x ; 1:4084600000000000 2:4072200000000000 3:4084e00000000000 +error invalid regular expression in label_replace(): [ +end +case label_replace __name__ job h(.*) +grid 100000 10000 11 +series __name__=b|host=h1|job=ax ; +series __name__=a|host=h2|job=y ; +series __name__=b|host=h10|zone=z1 ; 10:408ea80000000000 +result __name__=b|host=h10|zone=z1 ; 10:408ea80000000000 +end +case label_replace new ${ host [ +grid 100000 10000 12 +series __name__=a|host=h1 ; 1:4084b80000000000 2:4087380000000000 3:4030000000000000 4:408e580000000000 5:404d800000000000 6:408e100000000000 7:407c600000000000 8:4069a00000000000 +series __name__=a|host=x|job=y|zone=z1 ; +series __name__=b|host=h10|zone=z1 ; 11:4089200000000000 +series __name__=a|host=x|job=y ; 5:407e700000000000 7:406ae00000000000 8:405cc00000000000 +error invalid regular expression in label_replace(): [ +end +case label_replace zone ${ zone .* +grid 100000 10000 4 +series __name__=a|host=h1 ; +series __name__=b|host=h2|job=ax ; +series __name__=b|host=h10 ; +series __name__=b|host=x|job=x ; 0:4046000000000000 +result __name__=b|host=x|job=x|zone=${ ; 0:4046000000000000 +end +case label_replace __name__ $ job (x|y) +grid 100000 10000 12 +series __name__=b|host=h1|job=x ; 9:4076800000000000 +result __name__=$|host=h1|job=x ; 9:4076800000000000 +end +case label_replace zone ${n} job x? +grid 100000 10000 1 +series __name__=a|host=h1|job=ax ; 0:4072b00000000000 +series __name__=b|host=h1 ; +series __name__=a|host=h10|job=x ; +series __name__=b|host=x|job=ax ; 0:408be80000000000 +series __name__=a|host=h1|job=x ; 0:4066000000000000 +result __name__=a|host=h1|job=ax ; 0:4072b00000000000 +result __name__=a|host=h1|job=x ; 0:4066000000000000 +result __name__=b|host=x|job=ax ; 0:408be80000000000 +end +case label_replace zone h1 zone +grid 100000 10000 2 +series __name__=b|host=x|job=x ; 1:4080300000000000 +result __name__=b|host=x|job=x|zone=h1 ; 1:4080300000000000 +end +case label_replace host $n __name__ +grid 100000 10000 3 +series __name__=b|host=x|job=x ; 2:4081c80000000000 +series __name__=b|host=x|job=y|zone=z1 ; 1:406a200000000000 +series __name__=b|host=h10|job=ax ; 2:407f600000000000 +series __name__=a|host=h1|job=ax ; +series __name__=a|host=h1 ; 1:408b680000000000 2:4081180000000000 +result __name__=a|host=h1 ; 1:408b680000000000 2:4081180000000000 +result __name__=b|host=h10|job=ax ; 2:407f600000000000 +result __name__=b|host=x|job=x ; 2:4081c80000000000 +result __name__=b|host=x|job=y|zone=z1 ; 1:406a200000000000 +end +case label_replace host zone (?i)H(.) +grid 100000 10000 9 +series __name__=a|host=h2 ; 6:4084480000000000 7:4086c80000000000 8:4079c00000000000 +series __name__=b|host=h1|job=y ; 3:408d200000000000 +result __name__=a|host=h2 ; 6:4084480000000000 7:4086c80000000000 8:4079c00000000000 +result __name__=b|host=h1|job=y ; 3:408d200000000000 +end +case label_replace __name__ ${1}x __name__ h1|x +grid 100000 10000 2 +series __name__=a|host=x|job=ax ; 0:408cc00000000000 +series __name__=b|host=h1|job=ax|zone=z1 ; 0:4070100000000000 +series __name__=b|host=h10|job=x ; 1:4076b00000000000 +result __name__=a|host=x|job=ax ; 0:408cc00000000000 +result __name__=b|host=h1|job=ax|zone=z1 ; 0:4070100000000000 +result __name__=b|host=h10|job=x ; 1:4076b00000000000 +end +case label_replace host ${1}x missing (.*) +grid 100000 10000 7 +series __name__=a|host=h1|job=x ; 2:408b800000000000 3:4079a00000000000 6:4063800000000000 +series __name__=a|host=h1|job=y ; 3:4053000000000000 4:4069c00000000000 +series __name__=a|host=h2|job=x ; 1:4063000000000000 3:4081a80000000000 +series __name__=a|host=x|job=x ; 3:407e100000000000 +series __name__=a|host=h1|zone=z1 ; 6:408e980000000000 +series __name__=a|host=h10|zone=z1 ; 1:4082a80000000000 2:4082200000000000 3:4064400000000000 5:4069800000000000 +error vector cannot contain metrics with the same labelset +end +case label_replace job h1 zone .* +grid 100000 10000 11 +series __name__=b|host=x|job=ax ; 0:405ec00000000000 1:4084880000000000 2:4088e80000000000 +series __name__=a|host=h2|job=x|zone=z1 ; 7:4074f00000000000 8:4086080000000000 9:408c880000000000 +series __name__=b|host=x|zone=z1 ; 9:4066200000000000 +series __name__=b|host=h1|job=ax ; 10:4067600000000000 +result __name__=a|host=h2|job=h1|zone=z1 ; 7:4074f00000000000 8:4086080000000000 9:408c880000000000 +result __name__=b|host=h1|job=h1 ; 10:4067600000000000 +result __name__=b|host=x|job=h1 ; 0:405ec00000000000 1:4084880000000000 2:4088e80000000000 +result __name__=b|host=x|job=h1|zone=z1 ; 9:4066200000000000 +end +case label_replace $1x host .+ +grid 100000 10000 1 +series __name__=a|host=x|job=x ; 0:407b700000000000 +series __name__=a|host=h1|job=y|zone=z1 ; 0:408f380000000000 +error invalid destination label name in label_replace(): +end +case label_replace new h1 new +grid 100000 10000 4 +series __name__=b|host=h10|job=x ; +series __name__=b|host=x|job=ax|zone=z1 ; 2:4064c00000000000 +series __name__=a|host=h1|job=x|zone=z1 ; 0:4070100000000000 1:4082600000000000 2:4076b00000000000 +series __name__=b|host=h1|job=ax|zone=z1 ; 0:408ee00000000000 1:4058800000000000 +series __name__=a|host=x ; 3:4069c00000000000 +series __name__=a|host=h10|job=ax ; 1:403b000000000000 2:4081f00000000000 +result __name__=a|host=h1|job=x|new=h1|zone=z1 ; 0:4070100000000000 1:4082600000000000 2:4076b00000000000 +result __name__=a|host=h10|job=ax|new=h1 ; 1:403b000000000000 2:4081f00000000000 +result __name__=a|host=x|new=h1 ; 3:4069c00000000000 +result __name__=b|host=h1|job=ax|new=h1|zone=z1 ; 0:408ee00000000000 1:4058800000000000 +result __name__=b|host=x|job=ax|new=h1|zone=z1 ; 2:4064c00000000000 +end +case label_replace host ${n} job .+ +grid 100000 10000 4 +series __name__=a|host=x|job=y ; +series __name__=b|host=h2|job=ax ; +series __name__=b|host=h1|zone=z1 ; 3:4088e00000000000 +series __name__=a|host=x|job=y|zone=z1 ; 0:4035000000000000 1:408a980000000000 +result __name__=a|job=y|zone=z1 ; 0:4035000000000000 1:408a980000000000 +result __name__=b|host=h1|zone=z1 ; 3:4088e00000000000 +end +case label_replace new ${ new .+ +grid 100000 10000 4 +series __name__=a|host=h2|job=x|zone=z1 ; 3:4076000000000000 +series __name__=b|host=h10 ; 1:4062600000000000 +series __name__=a|host=h10|job=ax ; 2:4082a80000000000 +series __name__=b|host=h1|job=y ; 3:4081e80000000000 +series __name__=b|host=x|zone=z1 ; 3:408c080000000000 +result __name__=a|host=h10|job=ax ; 2:4082a80000000000 +result __name__=a|host=h2|job=x|zone=z1 ; 3:4076000000000000 +result __name__=b|host=h1|job=y ; 3:4081e80000000000 +result __name__=b|host=h10 ; 1:4062600000000000 +result __name__=b|host=x|zone=z1 ; 3:408c080000000000 +end +case label_replace zone $1 __name__ h(.*) +grid 100000 10000 8 +series __name__=b|host=h1 ; 6:4086800000000000 +result __name__=b|host=h1 ; 6:4086800000000000 +end +case label_replace new h1 missing h1|x +grid 100000 10000 12 +series __name__=a|host=x ; 4:4074300000000000 +series __name__=a|host=h10|job=ax ; 0:4047800000000000 +series __name__=b|host=h2|job=ax ; 3:4088400000000000 6:4071f00000000000 7:4086980000000000 9:4082200000000000 10:4082280000000000 +result __name__=a|host=h10|job=ax ; 0:4047800000000000 +result __name__=a|host=x ; 4:4074300000000000 +result __name__=b|host=h2|job=ax ; 3:4088400000000000 6:4071f00000000000 7:4086980000000000 9:4082200000000000 10:4082280000000000 +end +case label_replace zone a$2b new h1|x +grid 100000 10000 8 +series __name__=a|host=h1|job=x ; +series __name__=b|host=h2|job=y ; +series __name__=b|host=x|job=ax ; 1:408a600000000000 2:4071f00000000000 3:4008000000000000 4:408c500000000000 5:4089180000000000 6:405e000000000000 +result __name__=b|host=x|job=ax ; 1:408a600000000000 2:4071f00000000000 3:4008000000000000 4:408c500000000000 5:4089180000000000 6:405e000000000000 +end +case label_join host - +grid 100000 10000 8 +series __name__=b|host=h2|job=y ; 0:408c480000000000 1:408d500000000000 +series __name__=a|host=h10|job=x|zone=z1 ; 3:407f300000000000 4:4079100000000000 6:408cd00000000000 +series __name__=a|host=h2|job=ax|zone=z1 ; 1:408bf00000000000 2:407f300000000000 +result __name__=a|job=ax|zone=z1 ; 1:408bf00000000000 2:407f300000000000 +result __name__=a|job=x|zone=z1 ; 3:407f300000000000 4:4079100000000000 6:408cd00000000000 +result __name__=b|job=y ; 0:408c480000000000 1:408d500000000000 +end +case label_join new , missing +grid 100000 10000 3 +series __name__=b|host=h2|job=ax ; +end +case label_join new +grid 100000 10000 7 +series __name__=b|host=x|job=y ; 0:407cd00000000000 +series __name__=a|host=x|job=x ; +result __name__=b|host=x|job=y ; 0:407cd00000000000 +end +case label_join __name__ __name__ +grid 100000 10000 6 +series __name__=a|host=h2|job=ax ; 3:4073600000000000 4:408ef80000000000 +series __name__=b|host=h10|job=ax ; 2:405e400000000000 +series __name__=a|host=h10|job=y ; 2:405e000000000000 3:4089800000000000 4:4088800000000000 +series __name__=a|host=x ; +result __name__=a|host=h10|job=y ; 2:405e000000000000 3:4089800000000000 4:4088800000000000 +result __name__=a|host=h2|job=ax ; 3:4073600000000000 4:408ef80000000000 +result __name__=b|host=h10|job=ax ; 2:405e400000000000 +end +case label_join zone missing +grid 100000 10000 9 +series __name__=a|host=h1 ; 3:4089d00000000000 4:407ea00000000000 6:4082500000000000 +series __name__=b|host=x|job=y|zone=z1 ; 2:408f000000000000 3:4072800000000000 4:4082000000000000 5:407ee00000000000 6:407d300000000000 +series __name__=a|host=h2|job=y ; 0:4068000000000000 1:4079500000000000 3:407ff00000000000 4:4082980000000000 6:4064a00000000000 7:407f800000000000 +result __name__=a|host=h1 ; 3:4089d00000000000 4:407ea00000000000 6:4082500000000000 +result __name__=a|host=h2|job=y ; 0:4068000000000000 1:4079500000000000 3:407ff00000000000 4:4082980000000000 6:4064a00000000000 7:407f800000000000 +result __name__=b|host=x|job=y ; 2:408f000000000000 3:4072800000000000 4:4082000000000000 5:407ee00000000000 6:407d300000000000 +end +case label_join zone - +grid 100000 10000 12 +series __name__=a|host=h2 ; 5:408df80000000000 6:408e100000000000 +series __name__=b|host=h1|job=ax|zone=z1 ; 10:4026000000000000 +series __name__=a|host=h2|job=x|zone=z1 ; 8:408a300000000000 10:406c600000000000 +series __name__=b|host=h1|zone=z1 ; 5:4082200000000000 8:4084d00000000000 9:4084600000000000 +series __name__=a|host=h2|job=ax ; 4:407a200000000000 5:408a200000000000 6:4069000000000000 7:4085400000000000 8:407e600000000000 9:4086680000000000 10:4080b80000000000 11:4074800000000000 +series __name__=a|host=h2|zone=z1 ; 9:4038000000000000 10:4085b80000000000 +result __name__=a|host=h2 ; 5:408df80000000000 6:408e100000000000 9:4038000000000000 10:4085b80000000000 +result __name__=a|host=h2|job=ax ; 4:407a200000000000 5:408a200000000000 6:4069000000000000 7:4085400000000000 8:407e600000000000 9:4086680000000000 10:4080b80000000000 11:4074800000000000 +result __name__=a|host=h2|job=x ; 8:408a300000000000 10:406c600000000000 +result __name__=b|host=h1 ; 5:4082200000000000 8:4084d00000000000 9:4084600000000000 +result __name__=b|host=h1|job=ax ; 10:4026000000000000 +end +case label_join job , new host +grid 100000 10000 8 +series __name__=b|host=h10|job=x ; 0:4087300000000000 2:407b800000000000 3:4031000000000000 +series __name__=b|host=h10|job=ax ; 5:405ec00000000000 6:4089d00000000000 7:408c880000000000 +series __name__=a|host=h2|job=ax ; 6:4072600000000000 +result __name__=a|host=h2|job=,h2 ; 6:4072600000000000 +result __name__=b|host=h10|job=,h10 ; 0:4087300000000000 2:407b800000000000 3:4031000000000000 5:405ec00000000000 6:4089d00000000000 7:408c880000000000 +end +case label_join __name__ - +grid 100000 10000 11 +series __name__=b|host=x|job=y|zone=z1 ; 6:4080a80000000000 +series __name__=a|host=h2|job=ax|zone=z1 ; 8:4082000000000000 9:4070600000000000 +series __name__=b|host=h10|job=x ; 5:4072200000000000 +series __name__=a|host=h10|job=ax|zone=z1 ; 4:408f200000000000 5:4081e00000000000 6:4072f00000000000 8:4084c80000000000 +series __name__=a|host=h10|job=y|zone=z1 ; 5:408ad00000000000 6:4069600000000000 +series __name__=a|host=h2|job=ax ; 3:407c400000000000 4:4083e80000000000 5:4036000000000000 6:408bf00000000000 8:408c580000000000 +result host=h10|job=ax|zone=z1 ; 4:408f200000000000 5:4081e00000000000 6:4072f00000000000 8:4084c80000000000 +result host=h10|job=x ; 5:4072200000000000 +result host=h10|job=y|zone=z1 ; 5:408ad00000000000 6:4069600000000000 +result host=h2|job=ax ; 3:407c400000000000 4:4083e80000000000 5:4036000000000000 6:408bf00000000000 8:408c580000000000 +result host=h2|job=ax|zone=z1 ; 8:4082000000000000 9:4070600000000000 +result host=x|job=y|zone=z1 ; 6:4080a80000000000 +end +case label_join __name__ , job zone +grid 100000 10000 11 +series __name__=b|host=h2|job=x|zone=z1 ; 4:408ca80000000000 5:4088680000000000 7:407d200000000000 9:4085080000000000 +result __name__=x,z1|host=h2|job=x|zone=z1 ; 4:408ca80000000000 5:4088680000000000 7:407d200000000000 9:4085080000000000 +end +case label_join host , missing +grid 100000 10000 9 +series __name__=a|host=h2|job=y|zone=z1 ; 2:4071300000000000 3:408dc80000000000 4:4087380000000000 +series __name__=a|host=h10|zone=z1 ; +series __name__=b|host=h10|job=x|zone=z1 ; +series __name__=b|host=h10|job=y|zone=z1 ; 6:4086480000000000 +series __name__=b|host=h10|job=y ; 7:4089300000000000 +series __name__=b|host=h1|job=y ; 2:4085d80000000000 3:407f300000000000 4:4068e00000000000 5:408da80000000000 7:408ad80000000000 +error vector cannot contain metrics with the same labelset +end +case label_join __name__ - +grid 100000 10000 1 +series __name__=a|host=x|zone=z1 ; +series __name__=b|host=h2 ; +series __name__=a|host=h1|job=ax ; 0:4075600000000000 +result host=h1|job=ax ; 0:4075600000000000 +end +case label_join job +grid 100000 10000 5 +series __name__=a|host=x|job=y ; 1:4078900000000000 2:406e400000000000 +series __name__=a|host=h1|job=y ; 4:406ce00000000000 +series __name__=a|host=h10 ; 0:4086780000000000 1:408d680000000000 +series __name__=b|host=h1 ; 2:407e500000000000 3:4080480000000000 +series __name__=a|host=h2|zone=z1 ; 2:4081b80000000000 +result __name__=a|host=h1 ; 4:406ce00000000000 +result __name__=a|host=h10 ; 0:4086780000000000 1:408d680000000000 +result __name__=a|host=h2|zone=z1 ; 2:4081b80000000000 +result __name__=a|host=x ; 1:4078900000000000 2:406e400000000000 +result __name__=b|host=h1 ; 2:407e500000000000 3:4080480000000000 +end +case label_join host , job __name__ new +grid 100000 10000 4 +series __name__=b|host=x|job=y ; 3:406be00000000000 +series __name__=a|host=x|job=ax ; 3:408cb80000000000 +series __name__=a|host=h10|zone=z1 ; 0:4065400000000000 2:4071900000000000 +series __name__=b|host=h1|job=x|zone=z1 ; 1:4039000000000000 2:404e800000000000 3:4085000000000000 +result __name__=a|host=,a,|zone=z1 ; 0:4065400000000000 2:4071900000000000 +result __name__=a|host=ax,a,|job=ax ; 3:408cb80000000000 +result __name__=b|host=x,b,|job=x|zone=z1 ; 1:4039000000000000 2:404e800000000000 3:4085000000000000 +result __name__=b|host=y,b,|job=y ; 3:406be00000000000 +end +case label_join zone new +grid 100000 10000 4 +series __name__=a|host=x|job=y|zone=z1 ; 1:4082600000000000 2:406ae00000000000 3:4085180000000000 +series __name__=b|host=h2|job=y|zone=z1 ; 2:4087300000000000 +series __name__=b|host=h2|job=x ; 3:4072600000000000 +result __name__=a|host=x|job=y ; 1:4082600000000000 2:406ae00000000000 3:4085180000000000 +result __name__=b|host=h2|job=x ; 3:4072600000000000 +result __name__=b|host=h2|job=y ; 2:4087300000000000 +end +case label_join job job new +grid 100000 10000 10 +series __name__=a|host=h1|job=y|zone=z1 ; 4:4089080000000000 7:4084e00000000000 8:407cb00000000000 9:4081e00000000000 +series __name__=b|host=x ; 6:4085e80000000000 +series __name__=b|host=h1|job=ax ; 0:408a780000000000 1:4080d80000000000 2:4082980000000000 3:4065000000000000 4:4083980000000000 7:4055800000000000 +series __name__=a|host=x|zone=z1 ; 9:4014000000000000 +result __name__=a|host=h1|job=y|zone=z1 ; 4:4089080000000000 7:4084e00000000000 8:407cb00000000000 9:4081e00000000000 +result __name__=a|host=x|zone=z1 ; 9:4014000000000000 +result __name__=b|host=h1|job=ax ; 0:408a780000000000 1:4080d80000000000 2:4082980000000000 3:4065000000000000 4:4083980000000000 7:4055800000000000 +result __name__=b|host=x ; 6:4085e80000000000 +end +case label_join job , new __name__ job +grid 100000 10000 3 +series __name__=a|host=h2|job=ax ; 2:405f800000000000 +series __name__=a|host=x|job=x ; 2:4078500000000000 +series __name__=a|host=h2 ; 1:4067200000000000 2:406ec00000000000 +series __name__=b|host=h2|zone=z1 ; 1:4050800000000000 2:407c000000000000 +series __name__=b|host=h1|job=y ; +series __name__=a|host=x ; 1:4085600000000000 +result __name__=a|host=h2|job=,a, ; 1:4067200000000000 2:406ec00000000000 +result __name__=a|host=h2|job=,a,ax ; 2:405f800000000000 +result __name__=a|host=x|job=,a, ; 1:4085600000000000 +result __name__=a|host=x|job=,a,x ; 2:4078500000000000 +result __name__=b|host=h2|job=,b,|zone=z1 ; 1:4050800000000000 2:407c000000000000 +end +case label_join __name__ , new job +grid 100000 10000 2 +series __name__=a|host=h1|job=ax|zone=z1 ; 0:404e800000000000 +series __name__=a|host=h10|job=y ; 1:4079e00000000000 +series __name__=b|host=h1|zone=z1 ; +series __name__=a|host=h2 ; +series __name__=a|host=h2|job=ax|zone=z1 ; 0:4084080000000000 +series __name__=b|host=h10|job=x|zone=z1 ; 0:4074200000000000 1:4089f00000000000 +result __name__=,ax|host=h1|job=ax|zone=z1 ; 0:404e800000000000 +result __name__=,ax|host=h2|job=ax|zone=z1 ; 0:4084080000000000 +result __name__=,x|host=h10|job=x|zone=z1 ; 0:4074200000000000 1:4089f00000000000 +result __name__=,y|host=h10|job=y ; 1:4079e00000000000 +end +case label_join __name__ , missing +grid 100000 10000 2 +series __name__=a|host=h2|job=y ; 1:404a000000000000 +series __name__=b|host=h10|job=x|zone=z1 ; +result host=h2|job=y ; 1:404a000000000000 +end +case label_join zone , +grid 100000 10000 12 +series __name__=b|host=h1 ; 6:4082d80000000000 7:4068400000000000 +result __name__=b|host=h1 ; 6:4082d80000000000 7:4068400000000000 +end +case label_join zone - +grid 100000 10000 11 +series __name__=a|host=h10|job=y|zone=z1 ; 7:4044000000000000 8:4083980000000000 +result __name__=a|host=h10|job=y ; 7:4044000000000000 8:4083980000000000 +end +case label_join job , job +grid 100000 10000 11 +series __name__=a|host=x|job=x ; 5:4085600000000000 7:4086900000000000 +series __name__=a|host=h2|job=y ; 6:408b800000000000 7:407de00000000000 9:4055c00000000000 10:4088e80000000000 +series __name__=b|host=h10|job=ax ; 6:408ec80000000000 7:4081c00000000000 +series __name__=b|host=h10|zone=z1 ; 5:4085980000000000 6:406d800000000000 +series __name__=b|host=h10|job=y ; 5:4087480000000000 +series __name__=b|host=h10|job=x ; 1:4085180000000000 4:4089400000000000 5:4037000000000000 6:4078f00000000000 +result __name__=a|host=h2|job=y ; 6:408b800000000000 7:407de00000000000 9:4055c00000000000 10:4088e80000000000 +result __name__=a|host=x|job=x ; 5:4085600000000000 7:4086900000000000 +result __name__=b|host=h10|job=ax ; 6:408ec80000000000 7:4081c00000000000 +result __name__=b|host=h10|job=x ; 1:4085180000000000 4:4089400000000000 5:4037000000000000 6:4078f00000000000 +result __name__=b|host=h10|job=y ; 5:4087480000000000 +result __name__=b|host=h10|zone=z1 ; 5:4085980000000000 6:406d800000000000 +end +case label_join job - host +grid 100000 10000 8 +series __name__=b|host=h2|job=y|zone=z1 ; 7:4088e80000000000 +series __name__=b|host=h10 ; 1:4080b80000000000 2:406ce00000000000 3:4028000000000000 4:407a200000000000 5:408b900000000000 +series __name__=a|host=h10 ; 2:406fc00000000000 3:407f700000000000 5:4057000000000000 6:4070200000000000 +series __name__=b|host=h1|job=ax|zone=z1 ; 5:405d000000000000 6:408ac80000000000 7:408a780000000000 +result __name__=a|host=h10|job=h10 ; 2:406fc00000000000 3:407f700000000000 5:4057000000000000 6:4070200000000000 +result __name__=b|host=h1|job=h1|zone=z1 ; 5:405d000000000000 6:408ac80000000000 7:408a780000000000 +result __name__=b|host=h10|job=h10 ; 1:4080b80000000000 2:406ce00000000000 3:4028000000000000 4:407a200000000000 5:408b900000000000 +result __name__=b|host=h2|job=h2|zone=z1 ; 7:4088e80000000000 +end +case label_join job , job +grid 100000 10000 9 +series __name__=b|host=h1 ; 7:405b800000000000 8:407f200000000000 +series __name__=a|host=h10|job=ax ; 2:4083200000000000 +series __name__=b|host=h1|job=ax|zone=z1 ; 0:4074500000000000 +series __name__=b|host=h2|job=ax ; 4:4089600000000000 5:4074e00000000000 7:4075500000000000 8:408a980000000000 +result __name__=a|host=h10|job=ax ; 2:4083200000000000 +result __name__=b|host=h1 ; 7:405b800000000000 8:407f200000000000 +result __name__=b|host=h1|job=ax|zone=z1 ; 0:4074500000000000 +result __name__=b|host=h2|job=ax ; 4:4089600000000000 5:4074e00000000000 7:4075500000000000 8:408a980000000000 +end +case label_join __name__ new +grid 100000 10000 10 +series __name__=a|host=h10|job=x ; 3:405c400000000000 4:4061600000000000 6:4050000000000000 +series __name__=b|host=h10|job=ax ; 5:4065200000000000 7:408ac80000000000 +series __name__=a|host=x|zone=z1 ; 1:4059c00000000000 2:4069600000000000 3:405ac00000000000 6:4080780000000000 +series __name__=a|host=h10|job=ax ; 5:4081f00000000000 +series __name__=b|host=x|job=y ; 3:408cd80000000000 4:4045800000000000 7:4072200000000000 +error vector cannot contain metrics with the same labelset +end +case label_join host , job +grid 100000 10000 1 +series __name__=b|host=x ; 0:406d200000000000 +series __name__=b|host=x|job=x ; +series __name__=b|host=h1 ; 0:4066400000000000 +error vector cannot contain metrics with the same labelset +end +case label_join __name__ , job new +grid 100000 10000 7 +series __name__=b|host=h2|job=ax|zone=z1 ; 2:4084300000000000 4:407ef00000000000 5:406d400000000000 +series __name__=a|host=x|job=ax ; 3:4076c00000000000 4:4080600000000000 +series __name__=b|host=h10|job=y ; +series __name__=a|host=x|job=x ; 3:4062a00000000000 4:4086e00000000000 5:4088500000000000 +result __name__=ax,|host=h2|job=ax|zone=z1 ; 2:4084300000000000 4:407ef00000000000 5:406d400000000000 +result __name__=ax,|host=x|job=ax ; 3:4076c00000000000 4:4080600000000000 +result __name__=x,|host=x|job=x ; 3:4062a00000000000 4:4086e00000000000 5:4088500000000000 +end +case label_join host , __name__ +grid 100000 10000 11 +series __name__=a|host=h1|job=ax ; 1:4084e80000000000 2:408d080000000000 3:4063000000000000 +series __name__=b|host=h10|job=x ; 9:4076400000000000 +series __name__=b|host=h2|zone=z1 ; 8:407a200000000000 10:4080980000000000 +result __name__=a|host=a|job=ax ; 1:4084e80000000000 2:408d080000000000 3:4063000000000000 +result __name__=b|host=b|job=x ; 9:4076400000000000 +result __name__=b|host=b|zone=z1 ; 8:407a200000000000 10:4080980000000000 +end +case label_join host - job +grid 100000 10000 6 +series __name__=a|host=x|job=y ; 3:4089d80000000000 4:4074400000000000 +series __name__=a|host=h2 ; 5:4062200000000000 +series __name__=b|host=x|job=ax|zone=z1 ; 5:4087e00000000000 +series __name__=b|host=h10|job=y ; 4:4084780000000000 +series __name__=a|host=h1|job=y|zone=z1 ; 2:4085780000000000 3:4081d00000000000 +result __name__=a ; 5:4062200000000000 +result __name__=a|host=y|job=y ; 3:4089d80000000000 4:4074400000000000 +result __name__=a|host=y|job=y|zone=z1 ; 2:4085780000000000 3:4081d00000000000 +result __name__=b|host=ax|job=ax|zone=z1 ; 5:4087e00000000000 +result __name__=b|host=y|job=y ; 4:4084780000000000 +end +case label_join job - zone zone +grid 100000 10000 10 +series __name__=b|host=h10 ; +series __name__=a|host=h2|job=ax ; 3:4071c00000000000 4:4056c00000000000 5:408b480000000000 6:405dc00000000000 8:4062e00000000000 +series __name__=b|host=h1 ; 6:4082100000000000 7:4058400000000000 +result __name__=a|host=h2|job=- ; 3:4071c00000000000 4:4056c00000000000 5:408b480000000000 6:405dc00000000000 8:4062e00000000000 +result __name__=b|host=h1|job=- ; 6:4082100000000000 7:4058400000000000 +end +case label_join __name__ missing host new +grid 100000 10000 2 +series __name__=b|host=h1 ; 1:4088a80000000000 +result __name__=h1|host=h1 ; 1:4088a80000000000 +end +case label_join host zone zone __name__ +grid 100000 10000 8 +series __name__=a|host=h10|job=y|zone=z1 ; 5:4084380000000000 +series __name__=b|host=h1 ; +series __name__=b|host=x|zone=z1 ; 3:4085300000000000 4:407f800000000000 5:4081000000000000 +series __name__=a|host=h2 ; 0:406b200000000000 2:4089900000000000 4:0 5:408d380000000000 +series __name__=b|host=x ; 5:4087300000000000 +result __name__=a|host=a ; 0:406b200000000000 2:4089900000000000 4:0 5:408d380000000000 +result __name__=a|host=z1z1a|job=y|zone=z1 ; 5:4084380000000000 +result __name__=b|host=b ; 5:4087300000000000 +result __name__=b|host=z1z1b|zone=z1 ; 3:4085300000000000 4:407f800000000000 5:4081000000000000 +end +case label_join job - job +grid 100000 10000 7 +series __name__=b|host=x|job=y ; 5:408b300000000000 +series __name__=b|host=h10|job=ax ; 1:4078c00000000000 2:4070300000000000 3:407c200000000000 4:406b400000000000 5:408ab00000000000 +series __name__=a|host=h1 ; 1:4067a00000000000 2:4046800000000000 3:4067600000000000 5:4086400000000000 6:4077d00000000000 +series __name__=b|host=h2|job=ax|zone=z1 ; 5:403b000000000000 +series __name__=a|host=h2|job=y ; 0:4066800000000000 +series __name__=b|host=h1|job=x ; 4:406ee00000000000 5:407b200000000000 +result __name__=a|host=h1 ; 1:4067a00000000000 2:4046800000000000 3:4067600000000000 5:4086400000000000 6:4077d00000000000 +result __name__=a|host=h2|job=y ; 0:4066800000000000 +result __name__=b|host=h1|job=x ; 4:406ee00000000000 5:407b200000000000 +result __name__=b|host=h10|job=ax ; 1:4078c00000000000 2:4070300000000000 3:407c200000000000 4:406b400000000000 5:408ab00000000000 +result __name__=b|host=h2|job=ax|zone=z1 ; 5:403b000000000000 +result __name__=b|host=x|job=y ; 5:408b300000000000 +end +case label_join host host +grid 100000 10000 7 +series __name__=a|host=h1|job=ax ; +series __name__=a|host=h2 ; 6:4075700000000000 +series __name__=a|host=h1|job=ax|zone=z1 ; 3:4078700000000000 +series __name__=a|host=x ; +series __name__=b|host=h10|zone=z1 ; 1:4070700000000000 +series __name__=a|host=h10 ; 5:4088100000000000 +result __name__=a|host=h1|job=ax|zone=z1 ; 3:4078700000000000 +result __name__=a|host=h10 ; 5:4088100000000000 +result __name__=a|host=h2 ; 6:4075700000000000 +result __name__=b|host=h10|zone=z1 ; 1:4070700000000000 +end +case label_join host - +grid 100000 10000 9 +series __name__=a|host=h1|job=x ; 8:4079200000000000 +series __name__=b|host=x|zone=z1 ; 6:408b800000000000 +series __name__=a|host=h1|job=x|zone=z1 ; 4:4075300000000000 5:4081600000000000 6:4088580000000000 +series __name__=a|host=h1 ; 1:4083600000000000 2:406a000000000000 +result __name__=a ; 1:4083600000000000 2:406a000000000000 +result __name__=a|job=x ; 8:4079200000000000 +result __name__=a|job=x|zone=z1 ; 4:4075300000000000 5:4081600000000000 6:4088580000000000 +result __name__=b|zone=z1 ; 6:408b800000000000 +end +case label_join __name__ , missing __name__ +grid 100000 10000 2 +series __name__=a|host=x|job=y ; 1:4060a00000000000 +series __name__=a|host=x|job=ax|zone=z1 ; 0:407e100000000000 +series __name__=a|host=h10|job=ax ; +series __name__=b|host=x ; 0:4034000000000000 1:4072900000000000 +series __name__=b|host=h10|job=x ; 0:407c900000000000 +result __name__=,a|host=x|job=ax|zone=z1 ; 0:407e100000000000 +result __name__=,a|host=x|job=y ; 1:4060a00000000000 +result __name__=,b|host=h10|job=x ; 0:407c900000000000 +result __name__=,b|host=x ; 0:4034000000000000 1:4072900000000000 +end +case label_join zone +grid 100000 10000 9 +series __name__=a|host=h1 ; +series __name__=a|host=h2 ; +series __name__=b|host=h1|job=y ; 2:4083d00000000000 4:408b280000000000 5:4062600000000000 6:408cf80000000000 +series __name__=b|host=x ; +series __name__=a|host=h1|job=ax|zone=z1 ; 5:405e000000000000 6:408ce80000000000 7:4085a80000000000 8:4060a00000000000 +series __name__=a|host=h2|job=ax ; 2:408e200000000000 3:4072900000000000 4:4074200000000000 +result __name__=a|host=h1|job=ax ; 5:405e000000000000 6:408ce80000000000 7:4085a80000000000 8:4060a00000000000 +result __name__=a|host=h2|job=ax ; 2:408e200000000000 3:4072900000000000 4:4074200000000000 +result __name__=b|host=h1|job=y ; 2:4083d00000000000 4:408b280000000000 5:4062600000000000 6:408cf80000000000 +end +case label_join zone - host new missing +grid 100000 10000 11 +series __name__=b|host=h2|job=ax ; 3:4084500000000000 4:408ba80000000000 6:4056c00000000000 +result __name__=b|host=h2|job=ax|zone=h2-- ; 3:4084500000000000 4:408ba80000000000 6:4056c00000000000 +end +case label_join job missing +grid 100000 10000 8 +series __name__=a|host=x|zone=z1 ; +series __name__=a|host=h10|job=ax ; 6:4083600000000000 +series __name__=b|host=h10|job=y ; 5:4086980000000000 6:4083b80000000000 7:406a200000000000 +series __name__=a|host=h1|job=ax ; 3:408a100000000000 5:4084580000000000 6:4075f00000000000 +series __name__=a|host=x|job=x|zone=z1 ; +error invalid source label name in label_join(): +end +case label_join zone - +grid 100000 10000 9 +series __name__=b|host=h2 ; 5:407a600000000000 +series __name__=b|host=h10|job=y|zone=z1 ; 0:4077500000000000 2:4060e00000000000 4:4074c00000000000 5:4066000000000000 +result __name__=b|host=h10|job=y ; 0:4077500000000000 2:4060e00000000000 4:4074c00000000000 5:4066000000000000 +result __name__=b|host=h2 ; 5:407a600000000000 +end +case label_join __name__ - +grid 100000 10000 9 +series __name__=b|host=h10|job=ax ; +series __name__=a|host=h10|job=ax ; 6:4080f80000000000 7:407fc00000000000 +result host=h10|job=ax ; 6:4080f80000000000 7:407fc00000000000 +end +case label_join job missing missing +grid 100000 10000 3 +series __name__=b|host=h10|job=ax|zone=z1 ; 1:408d280000000000 +result __name__=b|host=h10|zone=z1 ; 1:408d280000000000 +end +case label_join host host +grid 100000 10000 11 +series __name__=a|host=h1 ; 2:404d800000000000 3:4077500000000000 4:408d680000000000 5:4072700000000000 7:407a100000000000 +result __name__=a|host=h1 ; 2:404d800000000000 3:4077500000000000 4:408d680000000000 5:4072700000000000 7:407a100000000000 +end +case label_join new , job +grid 100000 10000 9 +series __name__=b|host=h1|job=x|zone=z1 ; 7:407c500000000000 +series __name__=a|host=h10|job=ax ; 4:4087580000000000 5:4075000000000000 +series __name__=a|host=h1|zone=z1 ; 5:4084b80000000000 6:4087100000000000 +series __name__=b|host=h10|zone=z1 ; 6:408aa80000000000 7:407fe00000000000 +series __name__=a|host=x ; 0:408be80000000000 1:4089480000000000 2:4067400000000000 3:407c300000000000 +result __name__=a|host=h1|zone=z1 ; 5:4084b80000000000 6:4087100000000000 +result __name__=a|host=h10|job=ax|new=ax ; 4:4087580000000000 5:4075000000000000 +result __name__=a|host=x ; 0:408be80000000000 1:4089480000000000 2:4067400000000000 3:407c300000000000 +result __name__=b|host=h1|job=x|new=x|zone=z1 ; 7:407c500000000000 +result __name__=b|host=h10|zone=z1 ; 6:408aa80000000000 7:407fe00000000000 +end +case label_join new - +grid 100000 10000 11 +series __name__=b|host=h10|job=ax ; 1:4084b00000000000 2:408a980000000000 3:4087a00000000000 4:4061400000000000 5:4082c00000000000 7:4068200000000000 +result __name__=b|host=h10|job=ax ; 1:4084b00000000000 2:408a980000000000 3:4087a00000000000 4:4061400000000000 5:4082c00000000000 7:4068200000000000 +end +case label_join __name__ +grid 100000 10000 3 +series __name__=b|host=x ; 0:4089f80000000000 +series __name__=a|host=x|job=y ; +series __name__=a|host=h2|job=ax ; +result host=x ; 0:4089f80000000000 +end +case label_join job host +grid 100000 10000 4 +series __name__=a|host=h1|zone=z1 ; +series __name__=a|host=h1|job=x|zone=z1 ; 0:408cd00000000000 +result __name__=a|host=h1|job=h1|zone=z1 ; 0:408cd00000000000 +end +case label_join host , job __name__ +grid 100000 10000 1 +series __name__=a|host=h1 ; 0:4085200000000000 +series __name__=a|host=h2 ; 0:4089b80000000000 +series __name__=a|host=h2|zone=z1 ; 0:4086980000000000 +error vector cannot contain metrics with the same labelset +end +case label_join new , +grid 100000 10000 3 +series __name__=b|host=h10|job=ax ; +series __name__=a|host=h10|job=x|zone=z1 ; 1:4087380000000000 +series __name__=b|host=h1|zone=z1 ; +series __name__=b|host=h2 ; 0:405b000000000000 +series __name__=b|host=h2|job=ax ; 2:4086c80000000000 +result __name__=a|host=h10|job=x|zone=z1 ; 1:4087380000000000 +result __name__=b|host=h2 ; 0:405b000000000000 +result __name__=b|host=h2|job=ax ; 2:4086c80000000000 +end +case label_join job - +grid 100000 10000 4 +series __name__=a|host=h1|job=x|zone=z1 ; 2:4069a00000000000 3:408eb80000000000 +result __name__=a|host=h1|zone=z1 ; 2:4069a00000000000 3:408eb80000000000 +end +case label_join new new __name__ host +grid 100000 10000 2 +series __name__=a|host=h2|job=y ; 0:4065200000000000 1:407b100000000000 +series __name__=a|host=x|job=x|zone=z1 ; +series __name__=b|host=h2|job=ax ; 1:4074500000000000 +series __name__=b|host=h1 ; 1:4080380000000000 +series __name__=b|host=h10|job=y ; +series __name__=b|host=x|zone=z1 ; 1:4082980000000000 +result __name__=a|host=h2|job=y|new=ah2 ; 0:4065200000000000 1:407b100000000000 +result __name__=b|host=h1|new=bh1 ; 1:4080380000000000 +result __name__=b|host=h2|job=ax|new=bh2 ; 1:4074500000000000 +result __name__=b|host=x|new=bx|zone=z1 ; 1:4082980000000000 +end +case label_join new - zone zone +grid 100000 10000 4 +series __name__=b|host=h1 ; 3:408e600000000000 +series __name__=b|host=x|job=x ; 3:408a500000000000 +series __name__=a|host=x|job=x ; 3:408c700000000000 +series __name__=b|host=h10|job=y|zone=z1 ; 1:4088980000000000 +result __name__=a|host=x|job=x|new=- ; 3:408c700000000000 +result __name__=b|host=h1|new=- ; 3:408e600000000000 +result __name__=b|host=h10|job=y|new=z1-z1|zone=z1 ; 1:4088980000000000 +result __name__=b|host=x|job=x|new=- ; 3:408a500000000000 +end +case label_join new +grid 100000 10000 5 +series __name__=b|host=h10|job=ax ; 4:4071e00000000000 +series __name__=a|host=h2|job=y ; 1:4087600000000000 +series __name__=b|host=h10|job=y ; 2:4073300000000000 +series __name__=a|host=h2|job=x|zone=z1 ; +result __name__=a|host=h2|job=y ; 1:4087600000000000 +result __name__=b|host=h10|job=ax ; 4:4071e00000000000 +result __name__=b|host=h10|job=y ; 2:4073300000000000 +end +case label_join host - +grid 100000 10000 5 +series __name__=a|host=h1|job=x ; 3:403a000000000000 +result __name__=a|job=x ; 3:403a000000000000 +end +case label_join new - new host new +grid 100000 10000 9 +series __name__=b|host=h10|job=y ; +series __name__=a|host=h2|job=ax|zone=z1 ; 3:406d600000000000 4:4089100000000000 5:4070e00000000000 +series __name__=b|host=h2 ; +series __name__=a|host=h1|job=ax|zone=z1 ; 3:4039000000000000 +series __name__=a|host=h10|zone=z1 ; 6:4077200000000000 7:407de00000000000 8:4075a00000000000 +result __name__=a|host=h1|job=ax|new=-h1-|zone=z1 ; 3:4039000000000000 +result __name__=a|host=h10|new=-h10-|zone=z1 ; 6:4077200000000000 7:407de00000000000 8:4075a00000000000 +result __name__=a|host=h2|job=ax|new=-h2-|zone=z1 ; 3:406d600000000000 4:4089100000000000 5:4070e00000000000 +end +case label_join job - __name__ zone +grid 100000 10000 12 +series __name__=a|host=h10|job=y ; +series __name__=a|host=h1 ; 11:4064a00000000000 +series __name__=a|host=h1|zone=z1 ; +series __name__=b|host=h1 ; +series __name__=b|host=h2 ; 0:4063200000000000 1:408ac80000000000 2:408e900000000000 5:4076b00000000000 6:408cd00000000000 7:4080780000000000 8:4075900000000000 9:4073100000000000 10:4078f00000000000 11:4086880000000000 +result __name__=a|host=h1|job=a- ; 11:4064a00000000000 +result __name__=b|host=h2|job=b- ; 0:4063200000000000 1:408ac80000000000 2:408e900000000000 5:4076b00000000000 6:408cd00000000000 7:4080780000000000 8:4075900000000000 9:4073100000000000 10:4078f00000000000 11:4086880000000000 +end +case label_join job __name__ +grid 100000 10000 12 +series __name__=b|host=h10 ; 1:4087180000000000 +series __name__=b|host=x|job=y ; 11:406a000000000000 +result __name__=b|host=h10|job=b ; 1:4087180000000000 +result __name__=b|host=x|job=b ; 11:406a000000000000 +end +case label_join zone __name__ +grid 100000 10000 2 +series __name__=a|host=h2|job=ax|zone=z1 ; 0:408e980000000000 +series __name__=a|host=x|job=ax ; 1:4086b80000000000 +series __name__=b|host=h10|job=y ; 0:408ce00000000000 +series __name__=b|host=x ; +result __name__=a|host=h2|job=ax|zone=a ; 0:408e980000000000 +result __name__=a|host=x|job=ax|zone=a ; 1:4086b80000000000 +result __name__=b|host=h10|job=y|zone=b ; 0:408ce00000000000 +end +case label_join host - missing missing missing +grid 100000 10000 8 +series __name__=a|host=h1|job=y ; 6:4056400000000000 7:4084080000000000 +series __name__=a|host=h1 ; +series __name__=b|host=h10|zone=z1 ; 3:4082a00000000000 +series __name__=a|host=x|job=x ; 1:407e700000000000 +result __name__=a|host=--|job=x ; 1:407e700000000000 +result __name__=a|host=--|job=y ; 6:4056400000000000 7:4084080000000000 +result __name__=b|host=--|zone=z1 ; 3:4082a00000000000 +end +case label_join new job +grid 100000 10000 3 +series __name__=b|host=h1|job=y ; +series __name__=a|host=x|job=ax ; 2:408e180000000000 +result __name__=a|host=x|job=ax|new=ax ; 2:408e180000000000 +end +case label_join __name__ - new new +grid 100000 10000 10 +series __name__=b|host=h10|job=x ; 0:4082a00000000000 1:4075e00000000000 2:407ad00000000000 3:408cc80000000000 +series __name__=b|host=h1|job=x ; 0:4075c00000000000 1:4081f00000000000 2:408b180000000000 3:407e900000000000 +series __name__=a|host=h2|job=ax|zone=z1 ; 7:4084680000000000 8:406be00000000000 +result __name__=-|host=h1|job=x ; 0:4075c00000000000 1:4081f00000000000 2:408b180000000000 3:407e900000000000 +result __name__=-|host=h10|job=x ; 0:4082a00000000000 1:4075e00000000000 2:407ad00000000000 3:408cc80000000000 +result __name__=-|host=h2|job=ax|zone=z1 ; 7:4084680000000000 8:406be00000000000 +end +case label_join new +grid 100000 10000 2 +series __name__=a|host=h10|job=x ; 0:4069a00000000000 +series __name__=b|host=x|job=ax ; 1:408e700000000000 +series __name__=b|host=x ; 0:4080680000000000 +result __name__=a|host=h10|job=x ; 0:4069a00000000000 +result __name__=b|host=x ; 0:4080680000000000 +result __name__=b|host=x|job=ax ; 1:408e700000000000 +end +case label_join new , new +grid 100000 10000 9 +series __name__=b|host=h10|job=ax ; 7:4086680000000000 8:4050000000000000 +series __name__=a|host=x|job=ax|zone=z1 ; 6:4069a00000000000 +series __name__=a|host=h10 ; 7:4085b00000000000 +series __name__=a|host=h2|job=y ; 2:4061400000000000 +result __name__=a|host=h10 ; 7:4085b00000000000 +result __name__=a|host=h2|job=y ; 2:4061400000000000 +result __name__=a|host=x|job=ax|zone=z1 ; 6:4069a00000000000 +result __name__=b|host=h10|job=ax ; 7:4086680000000000 8:4050000000000000 +end +case label_join zone new +grid 100000 10000 7 +series __name__=a|host=h1 ; 5:4051000000000000 +series __name__=b|host=h1|job=ax ; 2:4078500000000000 +series __name__=b|host=x|job=y ; 1:4077600000000000 2:408e180000000000 3:408a680000000000 4:4080080000000000 5:4080b80000000000 6:4070c00000000000 +error invalid source label name in label_join(): +end +case label_join new - job +grid 100000 10000 6 +series __name__=a|host=h10|zone=z1 ; 4:407d400000000000 +series __name__=b|host=h1|job=y|zone=z1 ; 4:408cf00000000000 +series __name__=a|host=x|job=y ; 4:4073800000000000 5:4026000000000000 +series __name__=b|host=h2 ; +series __name__=a|host=h1|job=x|zone=z1 ; 2:4075c00000000000 4:408ef00000000000 +result __name__=a|host=h1|job=x|new=x|zone=z1 ; 2:4075c00000000000 4:408ef00000000000 +result __name__=a|host=h10|zone=z1 ; 4:407d400000000000 +result __name__=a|host=x|job=y|new=y ; 4:4073800000000000 5:4026000000000000 +result __name__=b|host=h1|job=y|new=y|zone=z1 ; 4:408cf00000000000 +end +case label_join host - job +grid 100000 10000 8 +series __name__=b|host=h2|zone=z1 ; 1:4080800000000000 2:4076900000000000 3:4086a00000000000 5:4082b00000000000 +series __name__=a|host=h2|job=x|zone=z1 ; 3:4059000000000000 +series __name__=a|host=h1|job=ax ; 1:4060e00000000000 2:407b200000000000 +series __name__=a|host=h1|job=y ; 6:408c280000000000 +series __name__=b|host=x|zone=z1 ; 3:4084800000000000 4:4073300000000000 5:408e780000000000 +error vector cannot contain metrics with the same labelset +end +case label_join zone , missing +grid 100000 10000 3 +series __name__=a|host=h1|job=x ; 2:4074a00000000000 +series __name__=a|host=h10|job=ax|zone=z1 ; 0:408de80000000000 +series __name__=b|host=h1 ; 0:405c400000000000 1:408d580000000000 +series __name__=a|host=x|job=ax ; 2:4051400000000000 +series __name__=b|host=h2|job=y|zone=z1 ; 0:4081200000000000 1:408f380000000000 +result __name__=a|host=h1|job=x ; 2:4074a00000000000 +result __name__=a|host=h10|job=ax ; 0:408de80000000000 +result __name__=a|host=x|job=ax ; 2:4051400000000000 +result __name__=b|host=h1 ; 0:405c400000000000 1:408d580000000000 +result __name__=b|host=h2|job=y ; 0:4081200000000000 1:408f380000000000 +end +case label_join job , __name__ +grid 100000 10000 10 +series __name__=a|host=h1 ; 4:4061200000000000 6:4057000000000000 7:4088e00000000000 8:4080100000000000 +series __name__=b|host=h1|job=ax|zone=z1 ; +series __name__=b|host=x ; 6:4050400000000000 +series __name__=a|host=h10|job=x ; 5:4064200000000000 +series __name__=b|host=h1|job=x ; 5:402a000000000000 6:4053c00000000000 8:408d800000000000 +result __name__=a|host=h1|job=a ; 4:4061200000000000 6:4057000000000000 7:4088e00000000000 8:4080100000000000 +result __name__=a|host=h10|job=a ; 5:4064200000000000 +result __name__=b|host=h1|job=b ; 5:402a000000000000 6:4053c00000000000 8:408d800000000000 +result __name__=b|host=x|job=b ; 6:4050400000000000 +end +case label_join zone - __name__ +grid 100000 10000 3 +series __name__=b|host=h1 ; +end +case label_join new job missing missing +grid 100000 10000 3 +series __name__=b|host=h10|zone=z1 ; 1:4088100000000000 +series __name__=a|host=h1|job=x ; 0:4081580000000000 1:4086400000000000 2:4072d00000000000 +series __name__=b|host=x ; +series __name__=b|host=h1|zone=z1 ; 1:4055c00000000000 +series __name__=a|host=x|job=ax|zone=z1 ; 1:4075200000000000 +series __name__=a|host=h2|job=ax ; 2:4086000000000000 +result __name__=a|host=h1|job=x|new=x ; 0:4081580000000000 1:4086400000000000 2:4072d00000000000 +result __name__=a|host=h2|job=ax|new=ax ; 2:4086000000000000 +result __name__=a|host=x|job=ax|new=ax|zone=z1 ; 1:4075200000000000 +result __name__=b|host=h1|zone=z1 ; 1:4055c00000000000 +result __name__=b|host=h10|zone=z1 ; 1:4088100000000000 +end +case label_join __name__ +grid 100000 10000 3 +series __name__=b|host=h10|job=x|zone=z1 ; 1:4070000000000000 +series __name__=a|host=h10|job=y ; 2:4089200000000000 +series __name__=b|host=h2|job=y|zone=z1 ; 1:4078100000000000 +series __name__=a|host=x|job=y ; +result host=h10|job=x|zone=z1 ; 1:4070000000000000 +result host=h10|job=y ; 2:4089200000000000 +result host=h2|job=y|zone=z1 ; 1:4078100000000000 +end +case label_join job job +grid 100000 10000 10 +series __name__=b|host=h1|job=y ; 4:408bf00000000000 5:407c100000000000 6:4081b80000000000 +series __name__=a|host=x ; 1:4081880000000000 2:4089b00000000000 +result __name__=a|host=x ; 1:4081880000000000 2:4089b00000000000 +result __name__=b|host=h1|job=y ; 4:408bf00000000000 5:407c100000000000 6:4081b80000000000 +end +case label_join new - host +grid 100000 10000 3 +series __name__=b|host=h1|job=x|zone=z1 ; +series __name__=b|host=h1|job=ax|zone=z1 ; 2:407fd00000000000 +result __name__=b|host=h1|job=ax|new=h1|zone=z1 ; 2:407fd00000000000 +end +case label_join new +grid 100000 10000 8 +series __name__=a|host=x|zone=z1 ; 6:4057800000000000 7:4041000000000000 +series __name__=a|host=h1|job=ax|zone=z1 ; 4:4082700000000000 5:408cb00000000000 6:4083680000000000 7:4085400000000000 +result __name__=a|host=h1|job=ax|zone=z1 ; 4:4082700000000000 5:408cb00000000000 6:4083680000000000 7:4085400000000000 +result __name__=a|host=x|zone=z1 ; 6:4057800000000000 7:4041000000000000 +end +case label_join job - +grid 100000 10000 8 +series __name__=a|host=h1|job=x ; 6:4080900000000000 7:407bc00000000000 +series __name__=b|host=x|job=y ; 6:4072500000000000 7:408ef80000000000 +series __name__=b|host=h1 ; 2:4088c80000000000 3:408c600000000000 4:4083500000000000 5:406a800000000000 6:407a400000000000 +series __name__=b|host=h1|job=x ; 2:4082c80000000000 3:4072000000000000 +error vector cannot contain metrics with the same labelset +end +case label_join new , __name__ new +grid 100000 10000 4 +series __name__=b|host=h2 ; 2:4076100000000000 +series __name__=a|host=h2 ; 2:408bb00000000000 +series __name__=b|host=h1|job=y ; 2:4080600000000000 +result __name__=a|host=h2|new=a, ; 2:408bb00000000000 +result __name__=b|host=h1|job=y|new=b, ; 2:4080600000000000 +result __name__=b|host=h2|new=b, ; 2:4076100000000000 +end +case label_join zone , +grid 100000 10000 9 +series __name__=b|host=h2|job=y|zone=z1 ; +series __name__=a|host=h2 ; 2:408a780000000000 3:4055c00000000000 4:4085100000000000 5:4082200000000000 6:408e980000000000 8:408af80000000000 +series __name__=a|host=x|job=ax|zone=z1 ; 2:408a580000000000 +series __name__=b|host=h10|job=y ; 6:407cd00000000000 +series __name__=b|host=h1|job=y ; 4:4088c80000000000 5:4084c00000000000 +series __name__=a|host=x|job=y|zone=z1 ; +result __name__=a|host=h2 ; 2:408a780000000000 3:4055c00000000000 4:4085100000000000 5:4082200000000000 6:408e980000000000 8:408af80000000000 +result __name__=a|host=x|job=ax ; 2:408a580000000000 +result __name__=b|host=h1|job=y ; 4:4088c80000000000 5:4084c00000000000 +result __name__=b|host=h10|job=y ; 6:407cd00000000000 +end +case label_join job host host missing +grid 100000 10000 4 +series __name__=a|host=h2|job=y ; 3:4084c00000000000 +series __name__=a|host=h2|zone=z1 ; 0:4061000000000000 1:4088d80000000000 2:408d700000000000 +series __name__=a|host=h2|job=y|zone=z1 ; 2:407cc00000000000 3:406c200000000000 +series __name__=b|host=h2|zone=z1 ; 0:408e680000000000 1:4080400000000000 2:4079000000000000 3:4083c00000000000 +error vector cannot contain metrics with the same labelset +end +case label_join new - zone new __name__ +grid 100000 10000 8 +series __name__=a|host=h10 ; 5:4081980000000000 6:4062400000000000 +series __name__=a|host=x|job=ax ; 1:4086600000000000 +series __name__=b|host=h10|zone=z1 ; 1:406a400000000000 2:408d380000000000 +series __name__=b|host=h2|job=x|zone=z1 ; 5:4080900000000000 +series __name__=b|host=h10|job=y|zone=z1 ; 4:4064600000000000 5:4086780000000000 +series __name__=a|host=h1|job=ax ; 6:408ec80000000000 7:407b000000000000 +result __name__=a|host=h1|job=ax|new=--a ; 6:408ec80000000000 7:407b000000000000 +result __name__=a|host=h10|new=--a ; 5:4081980000000000 6:4062400000000000 +result __name__=a|host=x|job=ax|new=--a ; 1:4086600000000000 +result __name__=b|host=h10|job=y|new=z1--b|zone=z1 ; 4:4064600000000000 5:4086780000000000 +result __name__=b|host=h10|new=z1--b|zone=z1 ; 1:406a400000000000 2:408d380000000000 +result __name__=b|host=h2|job=x|new=z1--b|zone=z1 ; 5:4080900000000000 +end +case label_join __name__ +grid 100000 10000 1 +series __name__=a|host=h2|job=ax ; +series __name__=a|host=h1 ; +series __name__=b|host=x|job=x ; 0:407a700000000000 +series __name__=b|host=h10|job=x ; 0:408c500000000000 +series __name__=b|host=h1 ; 0:4045000000000000 +result host=h1 ; 0:4045000000000000 +result host=h10|job=x ; 0:408c500000000000 +result host=x|job=x ; 0:407a700000000000 +end +case label_join __name__ - host __name__ +grid 100000 10000 11 +series __name__=a|host=h1|job=x ; 0:4083e80000000000 3:4088200000000000 4:4084980000000000 +series __name__=b|host=h1 ; +series __name__=a|host=h2|job=ax ; 10:4085d80000000000 +series __name__=a|host=h1 ; 4:4076b00000000000 5:4060600000000000 6:405e800000000000 8:4078c00000000000 9:4082180000000000 +series __name__=a|host=x|job=x ; 5:408d800000000000 6:407ab00000000000 8:408e680000000000 +result __name__=h1-a|host=h1 ; 4:4076b00000000000 5:4060600000000000 6:405e800000000000 8:4078c00000000000 9:4082180000000000 +result __name__=h1-a|host=h1|job=x ; 0:4083e80000000000 3:4088200000000000 4:4084980000000000 +result __name__=h2-a|host=h2|job=ax ; 10:4085d80000000000 +result __name__=x-a|host=x|job=x ; 5:408d800000000000 6:407ab00000000000 8:408e680000000000 +end +case label_join new - missing +grid 100000 10000 7 +series __name__=a|host=h2|job=ax ; 5:4065600000000000 +series __name__=a|host=h1 ; 1:4085080000000000 2:403e000000000000 +series __name__=b|host=h2|job=x ; 2:406d000000000000 3:4087500000000000 4:408bb80000000000 +series __name__=b|host=h1|zone=z1 ; 0:4085600000000000 2:4079e00000000000 +series __name__=b|host=h2|job=ax|zone=z1 ; 5:407e000000000000 6:4052c00000000000 +result __name__=a|host=h1 ; 1:4085080000000000 2:403e000000000000 +result __name__=a|host=h2|job=ax ; 5:4065600000000000 +result __name__=b|host=h1|zone=z1 ; 0:4085600000000000 2:4079e00000000000 +result __name__=b|host=h2|job=ax|zone=z1 ; 5:407e000000000000 6:4052c00000000000 +result __name__=b|host=h2|job=x ; 2:406d000000000000 3:4087500000000000 4:408bb80000000000 +end +case label_join zone , job __name__ +grid 100000 10000 7 +series __name__=a|host=h1|zone=z1 ; 2:408bc00000000000 5:4084400000000000 +series __name__=b|host=h10|zone=z1 ; 3:408cd80000000000 +series __name__=a|host=x ; 1:4083200000000000 +series __name__=a|host=h2 ; 6:4063400000000000 +series __name__=a|host=h2|job=y ; 1:406f600000000000 2:4073c00000000000 4:4055c00000000000 5:406c000000000000 +result __name__=a|host=h1|zone=,a ; 2:408bc00000000000 5:4084400000000000 +result __name__=a|host=h2|job=y|zone=y,a ; 1:406f600000000000 2:4073c00000000000 4:4055c00000000000 5:406c000000000000 +result __name__=a|host=h2|zone=,a ; 6:4063400000000000 +result __name__=a|host=x|zone=,a ; 1:4083200000000000 +result __name__=b|host=h10|zone=,b ; 3:408cd80000000000 +end +case label_join job , +grid 100000 10000 8 +series __name__=b|host=h2 ; 3:4060000000000000 5:4064000000000000 +series __name__=a|host=h1|zone=z1 ; 6:4062c00000000000 +series __name__=a|host=x ; 3:403f000000000000 +series __name__=a|host=x|job=ax ; 3:405c000000000000 4:4082e80000000000 5:4050800000000000 6:4087b00000000000 7:4057800000000000 +series __name__=a|host=h10|job=x ; 4:408ad00000000000 +series __name__=b|host=h2|zone=z1 ; 3:406da00000000000 +error vector cannot contain metrics with the same labelset +end +case label_join __name__ +grid 100000 10000 11 +series __name__=b|host=h2|job=x|zone=z1 ; 6:4050000000000000 7:4074500000000000 8:4068200000000000 +series __name__=b|host=x|zone=z1 ; 5:406b400000000000 7:4070000000000000 +result host=h2|job=x|zone=z1 ; 6:4050000000000000 7:4074500000000000 8:4068200000000000 +result host=x|zone=z1 ; 5:406b400000000000 7:4070000000000000 +end +case label_join __name__ , +grid 100000 10000 4 +series __name__=b|host=h2 ; 3:4055800000000000 +series __name__=a|host=x ; 1:4082600000000000 2:4064c00000000000 +series __name__=a|host=h10|job=x ; 3:4088400000000000 +result host=h10|job=x ; 3:4088400000000000 +result host=h2 ; 3:4055800000000000 +result host=x ; 1:4082600000000000 2:4064c00000000000 +end +case label_join new missing missing +grid 100000 10000 2 +series __name__=a|host=x|job=ax|zone=z1 ; 0:407be00000000000 1:4079000000000000 +series __name__=b|host=h1|job=ax ; 1:4065400000000000 +series __name__=a|host=h10|job=x ; 1:406e800000000000 +series __name__=b|host=h1|job=y|zone=z1 ; +series __name__=a|host=h1|job=x ; 0:404e000000000000 +series __name__=a|host=h10 ; 0:405d000000000000 +result __name__=a|host=h1|job=x ; 0:404e000000000000 +result __name__=a|host=h10 ; 0:405d000000000000 +result __name__=a|host=h10|job=x ; 1:406e800000000000 +result __name__=a|host=x|job=ax|zone=z1 ; 0:407be00000000000 1:4079000000000000 +result __name__=b|host=h1|job=ax ; 1:4065400000000000 +end +case label_join new host +grid 100000 10000 4 +series __name__=a|host=x ; 2:4084380000000000 +series __name__=b|host=x|job=x ; 1:4057800000000000 +series __name__=b|host=h1|job=ax ; 2:4077500000000000 3:408d400000000000 +series __name__=a|host=h1|zone=z1 ; 0:4085180000000000 1:407e400000000000 3:4058400000000000 +series __name__=b|host=h2 ; 0:404e800000000000 1:406b200000000000 2:4080780000000000 +result __name__=a|host=h1|new=h1|zone=z1 ; 0:4085180000000000 1:407e400000000000 3:4058400000000000 +result __name__=a|host=x|new=x ; 2:4084380000000000 +result __name__=b|host=h1|job=ax|new=h1 ; 2:4077500000000000 3:408d400000000000 +result __name__=b|host=h2|new=h2 ; 0:404e800000000000 1:406b200000000000 2:4080780000000000 +result __name__=b|host=x|job=x|new=x ; 1:4057800000000000 +end +case label_join zone +grid 100000 10000 6 +series __name__=a|host=h2|job=x ; 3:407f000000000000 +result __name__=a|host=h2|job=x ; 3:407f000000000000 +end +case label_join zone +grid 100000 10000 3 +series __name__=a|host=h1|job=ax ; +series __name__=b|host=x|job=ax ; 2:408f200000000000 +result __name__=b|host=x|job=ax ; 2:408f200000000000 +end +case label_join new +grid 100000 10000 4 +series __name__=a|host=h10 ; 0:4069400000000000 +series __name__=a|host=h10|job=y ; 0:4080b80000000000 +series __name__=a|host=h1|job=ax ; 0:4067200000000000 1:4072200000000000 2:408c480000000000 +result __name__=a|host=h1|job=ax ; 0:4067200000000000 1:4072200000000000 2:408c480000000000 +result __name__=a|host=h10 ; 0:4069400000000000 +result __name__=a|host=h10|job=y ; 0:4080b80000000000 +end +case label_join host - +grid 100000 10000 1 +series __name__=a|host=h10 ; 0:4053800000000000 +result __name__=a ; 0:4053800000000000 +end +case label_join new +grid 100000 10000 2 +series __name__=b|host=h1|job=x|zone=z1 ; +series __name__=a|host=h1 ; 1:4063e00000000000 +series __name__=a|host=h2|job=x ; +result __name__=a|host=h1 ; 1:4063e00000000000 +end +case label_join __name__ - host +grid 100000 10000 2 +series __name__=a|host=x ; 0:4089900000000000 1:4089800000000000 +series __name__=a|host=h1 ; 1:4069c00000000000 +series __name__=a|host=x|job=x ; 1:408b780000000000 +series __name__=b|host=h2|job=x ; 1:4051000000000000 +result __name__=h1|host=h1 ; 1:4069c00000000000 +result __name__=h2|host=h2|job=x ; 1:4051000000000000 +result __name__=x|host=x ; 0:4089900000000000 1:4089800000000000 +result __name__=x|host=x|job=x ; 1:408b780000000000 +end +case label_join new host missing +grid 100000 10000 3 +series __name__=a|host=h10 ; 2:4089e80000000000 +series __name__=a|host=h10|job=x ; 0:4066a00000000000 1:4086100000000000 2:4070e00000000000 +result __name__=a|host=h10|job=x|new=h10 ; 0:4066a00000000000 1:4086100000000000 2:4070e00000000000 +result __name__=a|host=h10|new=h10 ; 2:4089e80000000000 +end +case label_join job , +grid 100000 10000 12 +series __name__=b|host=h2|job=x ; 6:4087d00000000000 7:4085a80000000000 8:4071900000000000 9:406dc00000000000 +series __name__=a|host=h2|job=x ; 7:408be00000000000 +series __name__=a|host=h2 ; 4:4055400000000000 +result __name__=a|host=h2 ; 4:4055400000000000 7:408be00000000000 +result __name__=b|host=h2 ; 6:4087d00000000000 7:4085a80000000000 8:4071900000000000 9:406dc00000000000 +end +case label_join zone , job +grid 100000 10000 2 +series __name__=a|host=h1 ; +end +case label_join zone , host host new +grid 100000 10000 8 +series __name__=a|host=h1|job=ax|zone=z1 ; 7:408a180000000000 +series __name__=a|host=h1|zone=z1 ; 3:405a400000000000 4:4080b80000000000 5:4082100000000000 +series __name__=b|host=x|job=y ; 0:4079500000000000 1:4084180000000000 2:408e680000000000 3:4083b80000000000 +series __name__=a|host=h10 ; +series __name__=a|host=h2|job=y ; +series __name__=b|host=h1 ; +result __name__=a|host=h1|job=ax|zone=h1,h1, ; 7:408a180000000000 +result __name__=a|host=h1|zone=h1,h1, ; 3:405a400000000000 4:4080b80000000000 5:4082100000000000 +result __name__=b|host=x|job=y|zone=x,x, ; 0:4079500000000000 1:4084180000000000 2:408e680000000000 3:4083b80000000000 +end +case label_join __name__ , +grid 100000 10000 4 +series __name__=b|host=h1|job=x|zone=z1 ; 3:4069400000000000 +series __name__=a|host=h2|job=ax ; 2:4074300000000000 +series __name__=b|host=h1|job=ax|zone=z1 ; 3:407ed00000000000 +series __name__=b|host=x|job=x|zone=z1 ; 1:4057800000000000 +series __name__=a|host=h2|job=y ; 2:408a280000000000 +result host=h1|job=ax|zone=z1 ; 3:407ed00000000000 +result host=h1|job=x|zone=z1 ; 3:4069400000000000 +result host=h2|job=ax ; 2:4074300000000000 +result host=h2|job=y ; 2:408a280000000000 +result host=x|job=x|zone=z1 ; 1:4057800000000000 +end +case label_join zone - host new +grid 100000 10000 9 +series __name__=b|host=x ; 1:4083200000000000 2:407b100000000000 3:4086c80000000000 4:4066400000000000 5:4085b80000000000 6:4089280000000000 +series __name__=b|host=h2|job=ax ; 2:408ba80000000000 +result __name__=b|host=h2|job=ax|zone=h2- ; 2:408ba80000000000 +result __name__=b|host=x|zone=x- ; 1:4083200000000000 2:407b100000000000 3:4086c80000000000 4:4066400000000000 5:4085b80000000000 6:4089280000000000 +end +case label_join host - new +grid 100000 10000 8 +series __name__=b|host=h10|zone=z1 ; 0:4086f80000000000 2:408b900000000000 3:4072f00000000000 4:4085580000000000 5:4084780000000000 +series __name__=a|host=h1|job=ax|zone=z1 ; 1:4079f00000000000 2:4061800000000000 3:406be00000000000 4:4073100000000000 5:4071300000000000 6:408b680000000000 +result __name__=a|job=ax|zone=z1 ; 1:4079f00000000000 2:4061800000000000 3:406be00000000000 4:4073100000000000 5:4071300000000000 6:408b680000000000 +result __name__=b|zone=z1 ; 0:4086f80000000000 2:408b900000000000 3:4072f00000000000 4:4085580000000000 5:4084780000000000 +end diff --git a/src/promql/src/map_label/tests.rs b/src/promql/src/map_label/tests.rs new file mode 100644 index 00000000000..5d779eb2c99 --- /dev/null +++ b/src/promql/src/map_label/tests.rs @@ -0,0 +1,86 @@ +// Copyright 2023 Greptime Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::collections::BTreeMap; +use std::sync::Arc; + +use datatypes::series::samples::{FieldSpec, SeriesSchema}; + +use super::{label_join, label_replace}; +use crate::grid_series::reference::{ + canonical_bits, golden_cases, labels_of, points_of, series_of, +}; + +#[test] +fn label_functions_match_prometheus() { + let cases = golden_cases(include_str!("prometheus_cases.txt")); + assert_eq!(cases.len(), 200); + let (mut matched, mut merged, mut failed) = (0, 0, 0); + for case in cases { + let schema = Arc::new(SeriesSchema { + fields: vec![FieldSpec { + name: Arc::from("value"), + }] + .into(), + eval_grid: Some(case.grid.clone()), + }); + let input = case + .inputs + .iter() + .filter_map(|(labels, points)| series_of(&schema, labels, points)) + .collect::>(); + let inputs = input.len(); + let spec: Vec<&str> = case.spec.iter().map(String::as_str).collect(); + let actual = match spec[0] { + "label_replace" => label_replace(&schema, input, spec[1], spec[2], spec[3], spec[4]), + "label_join" => label_join(&schema, input, spec[1], spec[2], &spec[3..]), + other => panic!("unknown case {other}"), + }; + match (actual, case.outcome) { + (Ok(actual), Ok(expected)) => { + if expected.len() < inputs { + merged += 1; + } + let actual: BTreeMap<_, _> = actual + .iter() + .map(|series| (labels_of(&series.metric), points_of(series))) + .collect(); + let expected: BTreeMap<_, _> = expected + .into_iter() + .map(|(labels, points)| { + let points = points + .into_iter() + .map(|(index, bits)| (index, canonical_bits(f64::from_bits(bits)))) + .collect(); + (labels, points) + }) + .collect(); + assert_eq!(actual, expected, "case {spec:?}"); + matched += 1; + } + (Err(actual), Err(expected)) => { + assert!( + actual.to_string().contains(&expected), + "case {spec:?}: {actual} is not {expected}" + ); + failed += 1; + } + (actual, expected) => panic!("case {spec:?}: {actual:?} is not {expected:?}"), + } + } + assert!( + matched > 150 && merged > 2 && failed > 20, + "{matched} matched, {merged} merged, {failed} failed" + ); +} diff --git a/src/promql/src/map_time.rs b/src/promql/src/map_time.rs new file mode 100644 index 00000000000..61d416ebf7e --- /dev/null +++ b/src/promql/src/map_time.rs @@ -0,0 +1,216 @@ +// Copyright 2023 Greptime Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! `time()` and the date functions over evaluated series, following Prometheus `funcTime` and +//! `dateWrapper`. + +use std::sync::Arc; + +use datafusion::arrow::array::Float64Array; +use datafusion::error::{DataFusionError, Result}; +use datatypes::series::MetricName; +use datatypes::series::samples::{ + DenseSamplesRef, SampleRef, Samples, Series, SeriesFields, SeriesSchema, +}; +use datatypes::series::time::{GridRange, TimeAxis}; + +use crate::grid_series::GridSeriesBuilder; + +#[cfg(test)] +mod tests; + +/// A PromQL date function: `minute(v)`, `year()` and so on. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum DateFunction { + DayOfMonth, + DayOfWeek, + DayOfYear, + DaysInMonth, + Hour, + Minute, + Month, + Year, +} + +/// `time()`: the evaluation time in seconds at every point of the schema's grid, unlabelled. +pub fn time(schema: &SeriesSchema) -> Result { + eval_time_series(schema, |ms| ms as f64 / 1000.0) +} + +/// A date function without argument, which reads the evaluation time: one unlabelled series +/// over the whole grid. +pub fn date_of_eval_time(function: DateFunction, schema: &SeriesSchema) -> Result { + // Prometheus truncates the timestamp to whole seconds towards zero. + eval_time_series(schema, |ms| function.apply(ms / 1000)) +} + +/// A date function over `series`: each float value is read as Unix seconds and replaced by the +/// date component, and the metric name is dropped. Missing values stay missing; histogram +/// samples are dropped, so the result is `None` when no float remains. +/// +/// Series that share a label set once their names are dropped must then go through +/// [`merge_same_labelset`](crate::grid_series::merge_same_labelset). +pub fn map_date( + function: DateFunction, + schema: &Arc, + series: &Series, +) -> Result> { + let TimeAxis::Grid(range) = &series.time else { + return Err(DataFusionError::Execution( + "date functions require an evaluated series".into(), + )); + }; + let mut metric = series.metric.clone(); + metric.remove("__name__"); + let map = |seconds: f64| function.apply(go_int64(seconds)); + + let all_floats = series.fields.iter().all(|samples| { + samples + .segments() + .iter() + .all(|segment| matches!(segment.dense(), Some(DenseSamplesRef::Float(_)))) + }); + if all_floats { + let fields = series + .fields + .iter() + .map(|samples| { + let segments = samples + .segments() + .iter() + .map(|segment| { + let Some(DenseSamplesRef::Float(floats)) = segment.dense() else { + unreachable!("checked above"); + }; + Samples::from_float(floats.unary(map)) + }) + .collect(); + Samples::try_from_chunks(segments).map_err(external) + }) + .collect::>>()?; + let fields = SeriesFields::try_from_vec(fields).map_err(external)?; + return Series::try_new(schema, metric, series.time.clone(), fields) + .map(Some) + .map_err(external); + } + + // Histogram samples leave holes, which may move the ends of the series. + let mut builder = GridSeriesBuilder::try_new(schema.clone())?; + let mut values = vec![None; series.fields.len()]; + for row in 0..range.len() { + for (value, samples) in values.iter_mut().zip(series.fields.iter()) { + *value = match samples.sample(row) { + SampleRef::Float(seconds) => Some(map(seconds)), + SampleRef::Missing | SampleRef::Histogram(_) => None, + }; + } + builder.push(range.start() + row, &values)?; + } + builder.finish(metric) +} + +fn eval_time_series(schema: &SeriesSchema, value: impl Fn(i64) -> f64) -> Result { + let grid = schema.eval_grid.clone().ok_or_else(|| { + DataFusionError::Execution("time functions require an evaluation grid".into()) + })?; + let values: Float64Array = grid.timestamps().iter().map(|&ms| value(ms)).collect(); + let range = GridRange::try_new(grid.clone(), 0, values.len()).map_err(external)?; + let fields = vec![Samples::from_float(values); schema.fields.len()]; + Series::try_new( + schema, + MetricName::try_new(None, Vec::new()).map_err(external)?, + TimeAxis::Grid(range), + SeriesFields::try_from_vec(fields).map_err(external)?, + ) + .map_err(external) +} + +/// Go's `int64(f)` on amd64: NaN and values out of range become `i64::MIN`. +fn go_int64(value: f64) -> i64 { + if (-9_223_372_036_854_775_808.0..9_223_372_036_854_775_808.0).contains(&value) { + value as i64 + } else { + i64::MIN + } +} + +const SECONDS_PER_DAY: u64 = 86_400; +const MARCH_THRU_DECEMBER: u32 = 306; +const ABSOLUTE_YEARS: u64 = 292_277_022_400; +/// Go's `unixToInternal + internalToAbsolute`. +const UNIX_TO_ABSOLUTE: i64 = (1969 * 365 + 1969 / 4 - 1969 / 100 + 1969 / 400) * 86_400 + + (ABSOLUTE_YEARS as i64 / 400 * 146_097 + MARCH_THRU_DECEMBER as i64) * 86_400; + +impl DateFunction { + /// The component of Unix second `seconds` in UTC, computed the way Go's `time` package does, + /// including its wrapping arithmetic for instants out of its range. + fn apply(self, seconds: i64) -> f64 { + let abs = seconds.wrapping_add(UNIX_TO_ABSOLUTE) as u64; + let days = abs / SECONDS_PER_DAY; + let value = match self { + Self::Hour => (abs % SECONDS_PER_DAY / 3600) as i64, + Self::Minute => (abs % 3600 / 60) as i64, + Self::DayOfWeek => ((days + 3) % 7) as i64, + Self::Year => civil(days).year, + Self::Month => civil(days).month as i64, + Self::DayOfMonth => civil(days).day as i64, + Self::DayOfYear => civil(days).year_day, + Self::DaysInMonth => { + let Civil { year, month, .. } = civil(days); + let leap = year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); + match month { + 2 if leap => 29, + 2 => 28, + 4 | 6 | 9 | 11 => 30, + _ => 31, + } + } + }; + value as f64 + } +} + +struct Civil { + year: i64, + month: u32, + day: u32, + year_day: i64, +} + +/// Go's `absDays.split`, `date` and `yearYday`: days since March 1 of year `-ABSOLUTE_YEARS`. +fn civil(days: u64) -> Civil { + let d = days.wrapping_mul(4).wrapping_add(3); + let century = d / 146_097; + let cd = (d % 146_097) as u32 | 3; + let product = 2_939_745u64 * cd as u64; + let cyear = (product >> 32) as u32; + let ayday = product as u32 / 2_939_745 / 4; + + let m = 2141 * ayday + 197_913; + let jan_feb = u32::from(ayday >= MARCH_THRU_DECEMBER); + let leap = cyear.is_multiple_of(4) && (cyear != 0 || century.is_multiple_of(4)); + Civil { + year: century.wrapping_mul(100).wrapping_sub(ABSOLUTE_YEARS) as i64 + + cyear as i64 + + jan_feb as i64, + month: (m >> 16) - jan_feb * 12, + day: 1 + (m & 0xFFFF) / 2141, + year_day: ayday as i64 + (1 + 31 + 28) + i64::from(leap && jan_feb == 0) + - 365 * jan_feb as i64, + } +} + +fn external(error: datatypes::error::Error) -> DataFusionError { + DataFusionError::External(Box::new(error)) +} diff --git a/src/promql/src/map_time/prometheus_cases.txt b/src/promql/src/map_time/prometheus_cases.txt new file mode 100644 index 00000000000..f3eb2eb8a55 --- /dev/null +++ b/src/promql/src/map_time/prometheus_cases.txt @@ -0,0 +1,1323 @@ +# Generated by promql-compat cmd/narthex-golden-map built for amd64 (Prometheus v3.15.0 +# engine, seed 1, 100 cases per kind). Each case lists its operation and tab-separated +# arguments, the grid, the input series and either the result series or the error. +# Points are `grid index:hex bits`. +case eval_time days_in_month +grid 7929163584810 2107010052 6 +result - ; 0:403e000000000000 1:403f000000000000 2:403f000000000000 3:403e000000000000 4:403f000000000000 5:403f000000000000 +end +case eval_time minute +grid -7818533654086 217 7 +result - ; 0:4014000000000000 1:4014000000000000 2:4014000000000000 3:4014000000000000 4:4014000000000000 5:4014000000000000 6:4014000000000000 +end +case eval_time days_in_month +grid 5645519297821 76858837 3 +result - ; 0:403e000000000000 1:403e000000000000 2:403e000000000000 +end +case eval_time hour +grid -3905385278752 1510791 3 +result - ; 0:4032000000000000 1:4033000000000000 2:4033000000000000 +end +case eval_time time +grid -2504314496576 638 12 +result - ; 0:c1e2a899d0126e98 1:c1e2a899cffe0419 2:c1e2a899cfe9999a 3:c1e2a899cfd52f1b 4:c1e2a899cfc0c49c 5:c1e2a899cfac5a1d 6:c1e2a899cf97ef9e 7:c1e2a899cf83851f 8:c1e2a899cf6f1aa0 9:c1e2a899cf5ab021 10:c1e2a899cf4645a2 11:c1e2a899cf31db23 +end +case eval_time day_of_year +grid 4546314639929 589 8 +result - ; 0:4039000000000000 1:4039000000000000 2:4039000000000000 3:4039000000000000 4:4039000000000000 5:4039000000000000 6:4039000000000000 7:4039000000000000 +end +case eval_time day_of_year +grid -8490544500134 1267988460 2 +result - ; 0:4075900000000000 1:4076800000000000 +end +case eval_time time +grid 1706554758295 2304658933 9 +result - ; 0:41d96dfd6192e148 1:41d976c8064e978d 2:41d97f92ab0a4dd3 3:41d9885d4fc60419 4:41d99127f481ba5e 5:41d999f2993d70a4 6:41d9a2bd3df926e9 7:41d9ab87e2b4dd2f 8:41d9b45287709375 +end +case eval_time day_of_month +grid 739797390157 12023072 2 +result - ; 0:4026000000000000 1:4026000000000000 +end +case eval_time day_of_year +grid -4436270990729 111 4 +result - ; 0:4063400000000000 1:4063400000000000 2:4063400000000000 3:4063400000000000 +end +case eval_time days_in_month +grid -3651979308485 1164713 10 +result - ; 0:403e000000000000 1:403e000000000000 2:403e000000000000 3:403e000000000000 4:403e000000000000 5:403e000000000000 6:403e000000000000 7:403e000000000000 8:403e000000000000 9:403e000000000000 +end +case eval_time hour +grid -4998790493878 30712747 2 +result - ; 0:402e000000000000 1:4037000000000000 +end +case eval_time day_of_month +grid 4353281279852 887611 12 +result - ; 0:402c000000000000 1:402c000000000000 2:402c000000000000 3:402c000000000000 4:402c000000000000 5:402c000000000000 6:402c000000000000 7:402c000000000000 8:402c000000000000 9:402c000000000000 10:402c000000000000 11:402c000000000000 +end +case eval_time day_of_week +grid 7145855236113 80686270 9 +result - ; 0:4014000000000000 1:4018000000000000 2:0 3:3ff0000000000000 4:4000000000000000 5:4008000000000000 6:4010000000000000 7:4014000000000000 8:4018000000000000 +end +case eval_time minute +grid -123444041313 54113703 8 +result - ; 0:404d800000000000 1:3ff0000000000000 2:4008000000000000 3:4014000000000000 4:4018000000000000 5:4020000000000000 6:4024000000000000 7:4028000000000000 +end +case eval_time year +grid 3796329515399 904819020 7 +result - ; 0:40a0540000000000 1:40a0540000000000 2:40a0540000000000 3:40a0540000000000 4:40a0540000000000 5:40a0540000000000 6:40a0540000000000 +end +case eval_time day_of_week +grid -1731540855678 719022 4 +result - ; 0:4010000000000000 1:4010000000000000 2:4010000000000000 3:4010000000000000 +end +case eval_time day_of_month +grid 3980659773468 2223692042 8 +result - ; 0:4035000000000000 1:4032000000000000 2:4028000000000000 3:4020000000000000 4:4008000000000000 5:403d000000000000 6:4038000000000000 7:4033000000000000 +end +case eval_time time +grid -2345528814484 1738219 3 +result - ; 0:c1e179bdbdcf7cee 1:c1e179bce4887ae1 2:c1e179bc0b4178d5 +end +case eval_time day_of_week +grid 2305767081930 1676488501 8 +result - ; 0:0 1:4014000000000000 2:4008000000000000 3:4000000000000000 4:0 5:4018000000000000 6:4010000000000000 7:4000000000000000 +end +case eval_time hour +grid 2251710509409 1153778806 10 +result - ; 0:4026000000000000 1:4033000000000000 2:4010000000000000 3:4028000000000000 4:4035000000000000 5:4014000000000000 6:402c000000000000 7:4036000000000000 8:401c000000000000 9:402e000000000000 +end +case eval_time day_of_month +grid -8990751320710 2763851 3 +result - ; 0:4008000000000000 1:4008000000000000 2:4008000000000000 +end +case eval_time time +grid -1626870998071 1759731423 7 +result - ; 0:c1d83e0535848b44 1:c1d8374eb8a978d5 2:c1d830983bce6666 3:c1d829e1bef353f8 4:c1d8232b42184189 5:c1d81c74c53d2f1b 6:c1d815be48621cac +end +case eval_time time +grid 1617015330088 3546638 2 +result - ; 0:41d8186c8885a1cb 1:41d8186fff2e76c9 +end +case eval_time days_in_month +grid 1802980715819 2122530 3 +result - ; 0:403c000000000000 1:403c000000000000 2:403c000000000000 +end +case eval_time time +grid -4545601058941 40395707 7 +result - ; 0:c1f0ef05e22f0e56 1:c1f0eefc0573be77 2:c1f0eef228b86e98 3:c1f0eee84bfd1eb8 4:c1f0eede6f41ced9 5:c1f0eed492867efa 6:c1f0eecab5cb2f1b +end +case eval_time time +grid -8454194139006 1471789 1 +result - ; 0:c1ff7e8c3db01893 +end +case eval_time minute +grid 4556902999261 50244560 2 +result - ; 0:4037000000000000 1:4034000000000000 +end +case eval_time year +grid 2301022890000 148 1 +result - ; 0:409fe80000000000 +end +case eval_time day_of_week +grid 1608895555214 50231531 12 +result - ; 0:4014000000000000 1:4018000000000000 2:4018000000000000 3:0 4:0 5:3ff0000000000000 6:3ff0000000000000 7:4000000000000000 8:4008000000000000 9:4008000000000000 10:4010000000000000 11:4010000000000000 +end +case eval_time day_of_week +grid 946447016656 305 5 +result - ; 0:4008000000000000 1:4008000000000000 2:4008000000000000 3:4008000000000000 4:4008000000000000 +end +case eval_time day_of_week +grid 5094629521128 72431413 8 +result - ; 0:3ff0000000000000 1:4000000000000000 2:4008000000000000 3:4010000000000000 4:4010000000000000 5:4014000000000000 6:4018000000000000 7:0 +end +case eval_time minute +grid 2772745366163 85460702 8 +result - ; 0:4000000000000000 1:4047800000000000 2:403f000000000000 3:402e000000000000 4:0 5:4046000000000000 6:403c000000000000 7:402a000000000000 +end +case eval_time month +grid -7628575278533 737 4 +result - ; 0:4010000000000000 1:4010000000000000 2:4010000000000000 3:4010000000000000 +end +case eval_time year +grid 703341306710 226978366 7 +result - ; 0:409f200000000000 1:409f200000000000 2:409f200000000000 3:409f200000000000 4:409f200000000000 5:409f200000000000 6:409f200000000000 +end +case eval_time hour +grid 440995671897 867172841 11 +result - ; 0:4000000000000000 1:4008000000000000 2:4010000000000000 3:4014000000000000 4:4018000000000000 5:401c000000000000 6:4020000000000000 7:4020000000000000 8:4022000000000000 9:4024000000000000 10:4026000000000000 +end +case eval_time hour +grid -8447720475832 990 11 +result - ; 0:4024000000000000 1:4024000000000000 2:4024000000000000 3:4024000000000000 4:4024000000000000 5:4024000000000000 6:4024000000000000 7:4024000000000000 8:4024000000000000 9:4024000000000000 10:4024000000000000 +end +case eval_time month +grid -2802329680926 898 4 +result - ; 0:4008000000000000 1:4008000000000000 2:4008000000000000 3:4008000000000000 +end +case eval_time minute +grid 116947146175 3449151 6 +result - ; 0:4033000000000000 1:4030000000000000 2:402c000000000000 3:4026000000000000 4:4022000000000000 5:4018000000000000 +end +case eval_time day_of_week +grid -7957327326042 43196057 5 +result - ; 0:4010000000000000 1:4010000000000000 2:4014000000000000 3:4014000000000000 4:4018000000000000 +end +case eval_time hour +grid -7341882760067 2191965610 10 +result - ; 0:4028000000000000 1:4035000000000000 2:4014000000000000 3:402c000000000000 4:4037000000000000 5:4020000000000000 6:4031000000000000 7:4000000000000000 8:4026000000000000 9:4034000000000000 +end +case eval_time minute +grid 8529873733272 32275396 9 +result - ; 0:4036000000000000 1:4034000000000000 2:4032000000000000 3:402e000000000000 4:402a000000000000 5:4026000000000000 6:4022000000000000 7:401c000000000000 8:4014000000000000 +end +case eval_time day_of_month +grid 2625000741431 1574269218 5 +result - ; 0:401c000000000000 1:403a000000000000 2:402a000000000000 3:3ff0000000000000 4:4033000000000000 +end +case eval_time day_of_year +grid 3092923912223 2496967117 1 +result - ; 0:4010000000000000 +end +case eval_time hour +grid -11061112457 3048419 4 +result - ; 0:4037000000000000 1:0 2:3ff0000000000000 3:4000000000000000 +end +case eval_time day_of_week +grid -2887258475029 277 10 +result - ; 0:4010000000000000 1:4010000000000000 2:4010000000000000 3:4010000000000000 4:4010000000000000 5:4010000000000000 6:4010000000000000 7:4010000000000000 8:4010000000000000 9:4010000000000000 +end +case eval_time day_of_week +grid 4096390608747 81491577 5 +result - ; 0:4010000000000000 1:4014000000000000 2:4018000000000000 3:0 4:3ff0000000000000 +end +case eval_time minute +grid 6837207233502 1863150300 5 +result - ; 0:402a000000000000 1:4047000000000000 2:4032000000000000 3:4049800000000000 4:4037000000000000 +end +case eval_time minute +grid 7441183132856 2189241 1 +result - ; 0:4032000000000000 +end +case eval_time minute +grid 2376061808198 1557481 9 +result - ; 0:4024000000000000 1:4042000000000000 2:4000000000000000 3:403c000000000000 4:404a800000000000 5:4033000000000000 6:4046800000000000 7:4026000000000000 8:4042800000000000 +end +case eval_time day_of_week +grid 8968928598152 1609867 5 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 +end +case eval_time day_of_year +grid 2905077250500 78468529 3 +result - ; 0:4035000000000000 1:4036000000000000 2:4037000000000000 +end +case eval_time hour +grid 5998352679506 877443448 9 +result - ; 0:4022000000000000 1:4028000000000000 2:4030000000000000 3:4034000000000000 4:0 5:4008000000000000 6:401c000000000000 7:4026000000000000 8:402c000000000000 +end +case eval_time days_in_month +grid -1678738041893 1584866 7 +result - ; 0:403f000000000000 1:403f000000000000 2:403f000000000000 3:403f000000000000 4:403f000000000000 5:403f000000000000 6:403f000000000000 +end +case eval_time day_of_year +grid -1376043230055 657 3 +result - ; 0:4062200000000000 1:4062200000000000 2:4062200000000000 +end +case eval_time hour +grid -8227410440826 1598728 10 +result - ; 0:4020000000000000 1:4020000000000000 2:4022000000000000 3:4022000000000000 4:4022000000000000 5:4024000000000000 6:4024000000000000 7:4026000000000000 8:4026000000000000 9:4028000000000000 +end +case eval_time day_of_week +grid -8584027768611 60045390 1 +result - ; 0:4000000000000000 +end +case eval_time day_of_week +grid -8861738283467 60746099 8 +result - ; 0:3ff0000000000000 1:4000000000000000 2:4000000000000000 3:4008000000000000 4:4010000000000000 5:4014000000000000 6:4014000000000000 7:4018000000000000 +end +case eval_time minute +grid 4858003619695 2127494 2 +result - ; 0:403a000000000000 1:4000000000000000 +end +case eval_time day_of_week +grid 5797672149178 442613 8 +result - ; 0:4010000000000000 1:4010000000000000 2:4010000000000000 3:4010000000000000 4:4010000000000000 5:4010000000000000 6:4010000000000000 7:4010000000000000 +end +case eval_time month +grid -6842690839749 557 9 +result - ; 0:4008000000000000 1:4008000000000000 2:4008000000000000 3:4008000000000000 4:4008000000000000 5:4008000000000000 6:4008000000000000 7:4008000000000000 8:4008000000000000 +end +case eval_time days_in_month +grid -2686227702352 70880468 5 +result - ; 0:403e000000000000 1:403e000000000000 2:403e000000000000 3:403e000000000000 4:403e000000000000 +end +case eval_time time +grid -5257023689284 20315275 3 +result - ; 0:c1f3957d0c948b44 1:c1f3957816e024dd 2:c1f39573212bbe77 +end +case eval_time days_in_month +grid 8059685205502 553 7 +result - ; 0:403f000000000000 1:403f000000000000 2:403f000000000000 3:403f000000000000 4:403f000000000000 5:403f000000000000 6:403f000000000000 +end +case eval_time day_of_month +grid 7969632687672 107384882 11 +result - ; 0:4034000000000000 1:4035000000000000 2:4036000000000000 3:4037000000000000 4:4039000000000000 5:403a000000000000 6:403b000000000000 7:403c000000000000 8:403e000000000000 9:403f000000000000 10:3ff0000000000000 +end +case eval_time minute +grid -4077094386752 71974458 5 +result - ; 0:4047000000000000 1:4047000000000000 2:4047000000000000 3:4046800000000000 4:4046800000000000 +end +case eval_time month +grid -3804510417709 1018101 1 +result - ; 0:4018000000000000 +end +case eval_time day_of_year +grid 8134310666166 56893408 11 +result - ; 0:4071900000000000 1:4071900000000000 2:4071a00000000000 3:4071b00000000000 4:4071b00000000000 5:4071c00000000000 6:4071d00000000000 7:4071d00000000000 8:4071e00000000000 9:4071f00000000000 10:4071f00000000000 +end +case eval_time day_of_year +grid -740079829730 76628550 8 +result - ; 0:4069200000000000 1:4069400000000000 2:4069600000000000 3:4069600000000000 4:4069800000000000 5:4069a00000000000 6:4069c00000000000 7:4069e00000000000 +end +case eval_time day_of_year +grid 177577568513 680 12 +result - ; 0:406cc00000000000 1:406cc00000000000 2:406cc00000000000 3:406cc00000000000 4:406cc00000000000 5:406cc00000000000 6:406cc00000000000 7:406cc00000000000 8:406cc00000000000 9:406cc00000000000 10:406cc00000000000 11:406cc00000000000 +end +case eval_time time +grid 7658422993403 458740 10 +result - ; 0:41fc87a42d1672b0 1:41fc87a449c249ba 2:41fc87a4666e20c5 3:41fc87a48319f7cf 4:41fc87a49fc5ced9 5:41fc87a4bc71a5e3 6:41fc87a4d91d7cee 7:41fc87a4f5c953f8 8:41fc87a512752b02 9:41fc87a52f21020c +end +case eval_time day_of_week +grid 7229297240634 27274176 4 +result - ; 0:4014000000000000 1:4014000000000000 2:4018000000000000 3:4018000000000000 +end +case eval_time time +grid -4373003580498 1042277 7 +result - ; 0:c1f04a6bd3c7f7cf 1:c1f04a6b92a38937 2:c1f04a6b517f1aa0 3:c1f04a6b105aac08 4:c1f04a6acf363d71 5:c1f04a6a8e11ced9 6:c1f04a6a4ced6042 +end +case eval_time day_of_year +grid 602126096060 64042813 4 +result - ; 0:403e000000000000 1:403e000000000000 2:403f000000000000 3:4040000000000000 +end +case eval_time days_in_month +grid -4493359431631 2347937 4 +result - ; 0:403f000000000000 1:403f000000000000 2:403f000000000000 3:403f000000000000 +end +case eval_time day_of_year +grid -4867675403461 174 7 +result - ; 0:4071300000000000 1:4071300000000000 2:4071300000000000 3:4071300000000000 4:4071300000000000 5:4071300000000000 6:4071300000000000 +end +case eval_time year +grid -8225993484812 83105083 12 +result - ; 0:409ab40000000000 1:409ab40000000000 2:409ab40000000000 3:409ab40000000000 4:409ab40000000000 5:409ab40000000000 6:409ab40000000000 7:409ab40000000000 8:409ab40000000000 9:409ab40000000000 10:409ab40000000000 11:409ab40000000000 +end +case eval_time month +grid -2745569050751 39157905 1 +result - ; 0:4028000000000000 +end +case eval_time days_in_month +grid 8288955095367 2524061518 11 +result - ; 0:403f000000000000 1:403e000000000000 2:403f000000000000 3:403e000000000000 4:403f000000000000 5:403f000000000000 6:403c000000000000 7:403f000000000000 8:403e000000000000 9:403f000000000000 10:403e000000000000 +end +case eval_time day_of_year +grid -897229348633 45859765 2 +result - ; 0:406a000000000000 1:406a000000000000 +end +case eval_time minute +grid -4506209868535 79774348 7 +result - ; 0:4000000000000000 1:4026000000000000 2:4035000000000000 3:403e000000000000 4:4044000000000000 5:4049000000000000 6:404d800000000000 +end +case eval_time days_in_month +grid -5022020663358 922 9 +result - ; 0:403e000000000000 1:403e000000000000 2:403e000000000000 3:403e000000000000 4:403e000000000000 5:403e000000000000 6:403e000000000000 7:403e000000000000 8:403e000000000000 +end +case eval_time year +grid 367056397083 2180108 5 +result - ; 0:409ef40000000000 1:409ef40000000000 2:409ef40000000000 3:409ef40000000000 4:409ef40000000000 +end +case eval_time time +grid -7524549594636 57077128 1 +result - ; 0:c1fc07f83daa2d0e +end +case eval_time time +grid -6469644821635 879502850 6 +result - ; 0:c1f819ef215a28f6 1:c1f81918686c8f5c 2:c1f81841af7ef5c3 3:c1f8176af6915c29 4:c1f816943da3c28f 5:c1f815bd84b628f6 +end +case eval_time minute +grid 8415094428388 788 8 +result - ; 0:402a000000000000 1:402a000000000000 2:402a000000000000 3:402a000000000000 4:402a000000000000 5:402a000000000000 6:402a000000000000 7:402a000000000000 +end +case eval_time month +grid 4209387069659 3362880 10 +result - ; 0:4014000000000000 1:4014000000000000 2:4014000000000000 3:4014000000000000 4:4014000000000000 5:4014000000000000 6:4014000000000000 7:4014000000000000 8:4014000000000000 9:4014000000000000 +end +case eval_time time +grid 4393307125190 2727209 12 +result - ; 0:41f05dc8bf530a3d 1:41f05dc969c6624e 2:41f05dca1439ba5e 3:41f05dcabead126f 4:41f05dcb69206a7f 5:41f05dcc1393c28f 6:41f05dccbe071aa0 7:41f05dcd687a72b0 8:41f05dce12edcac1 9:41f05dcebd6122d1 10:41f05dcf67d47ae1 11:41f05dd01247d2f2 +end +case eval_time year +grid 4366635432683 50906431 1 +result - ; 0:40a0780000000000 +end +case eval_time year +grid -2036494129780 40935315 3 +result - ; 0:409dc40000000000 1:409dc40000000000 2:409dc40000000000 +end +case eval_time minute +grid -5425892363262 221584 4 +result - ; 0:4044000000000000 1:4046000000000000 2:4048000000000000 3:4049800000000000 +end +case eval_time month +grid 252424238250 64239039 8 +result - ; 0:4028000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 +end +case eval_time minute +grid 5009468713919 1113261263 7 +result - ; 0:4014000000000000 1:4033000000000000 2:4040800000000000 3:4048000000000000 4:4000000000000000 5:4031000000000000 6:403f000000000000 +end +case eval_time month +grid -8974592207553 3362696 10 +result - ; 0:4020000000000000 1:4020000000000000 2:4020000000000000 3:4020000000000000 4:4020000000000000 5:4020000000000000 6:4020000000000000 7:4020000000000000 8:4020000000000000 9:4020000000000000 +end +case eval_time minute +grid 2571036068460 2704104 9 +result - ; 0:4044800000000000 1:403a000000000000 2:4026000000000000 3:404c000000000000 4:4044800000000000 5:403a000000000000 6:4026000000000000 7:404c000000000000 8:4044800000000000 +end +case eval_time time +grid -2960675600433 1765381328 5 +result - ; 0:c1e60f0a620ddb23 1:c1e60bac61635c29 2:c1e6084e60b8dd2f 3:c1e604f0600e5e35 4:c1e601925f63df3b +end +case eval_time minute +grid 5277861391266 908741244 2 +result - ; 0:4042000000000000 1:4000000000000000 +end +case eval_time hour +grid -8601639621053 416564768 10 +result - ; 0:4037000000000000 1:4033000000000000 2:402e000000000000 3:4024000000000000 4:4018000000000000 5:4000000000000000 6:4035000000000000 7:4031000000000000 8:402a000000000000 9:4022000000000000 +end +case eval_time day_of_month +grid -2383675800910 638273 1 +result - ; 0:4033000000000000 +end +case eval_time hour +grid 8437402184695 31160935 1 +result - ; 0:4000000000000000 +end +case date day_of_year +grid 100000 10000 4 +series __name__=a|host=h2 ; 2:fff0000000000000 3:41cc5a542ec00000 +series __name__=a|host=h1|job=x ; 2:41c3889011b00000 +series __name__=b|host=h10|job=y|zone=z1 ; 2:41c11428afa00000 +series __name__=a|host=h10|job=y|zone=z1 ; 1:41eb429e37000000 2:41b5b349fd800000 +error vector cannot contain metrics with the same labelset +end +case date minute +grid 100000 10000 11 +series __name__=a|host=h1|job=x ; 6:c21c892e53bb7885 +series __name__=b|host=h2|job=y|zone=z1 ; 8:41994bc075000000 +result host=h1|job=x ; 6:4031000000000000 +result host=h2|job=y|zone=z1 ; 8:4049800000000000 +end +case date month +grid 100000 10000 5 +series __name__=a|host=h2|zone=z1 ; 1:41cc5e7b32000000 +series __name__=a|host=x|job=x ; 4:c3dfeb3dd0676600 +series __name__=a|host=h1|job=ax ; 3:c22f1a7fa3eb8dac 4:c226bc7cbdceb648 +series __name__=a|host=h2|job=y|zone=z1 ; 1:424d7ffa20c00000 2:422cc39c28e9dfc2 +series __name__=b|host=x|job=x ; +series __name__=a|host=x|zone=z1 ; 0:4221dc6290428353 1:41e761f3cd980000 3:c234d37a0e01a2ca +result host=h1|job=ax ; 3:4014000000000000 4:4024000000000000 +result host=h2|job=y|zone=z1 ; 1:3ff0000000000000 2:4018000000000000 +result host=h2|zone=z1 ; 1:4008000000000000 +result host=x|job=x ; 4:4014000000000000 +result host=x|zone=z1 ; 0:4018000000000000 1:4018000000000000 3:401c000000000000 +end +case date day_of_week +grid 100000 10000 3 +series __name__=a|host=x|job=ax ; 2:41c078c0ba400000 +series __name__=a|host=h1|job=x ; 2:41e3886f445c0000 +series __name__=b|host=h10 ; 1:41e60491bc640000 +series __name__=b|host=h2 ; 2:43dfeb3dd0676600 +series __name__=a|host=h10|job=y ; 1:41b13a8daa600000 +result host=h1|job=x ; 2:4000000000000000 +result host=h10 ; 1:4014000000000000 +result host=h10|job=y ; 1:4008000000000000 +result host=h2 ; 2:4014000000000000 +result host=x|job=ax ; 2:4000000000000000 +end +case date day_of_year +grid 100000 10000 5 +series __name__=a|host=h10|job=ax ; 3:7ff0000000000000 +series __name__=a|host=h1|job=x ; 1:41b81f21ccc00000 +result host=h1|job=x ; 1:4072d00000000000 +result host=h10|job=ax ; 3:4075300000000000 +end +case date hour +grid 100000 10000 12 +series __name__=b|host=h2 ; 5:c201a317ac080000 6:41fe43f6fff2a8e5 9:41e7a8356b100000 +series __name__=a|host=h10 ; 2:41eb3d795d500000 4:fe37e43c8800759c 8:c1dcc94ca0400000 9:41d7f0c81b300000 +series __name__=a|host=h2|job=ax ; 7:41ee9a8600800000 8:41ead1ba93240000 9:41e57bb526340000 +series __name__=b|host=h10|job=ax ; +series __name__=a|host=h1|job=y ; 1:41c337e3bdf00000 2:41e1685bb5bc0000 +series __name__=a|host=h1|job=y|zone=z1 ; 9:41bde9dec8e00000 10:c2025015fff80000 11:41df363f1fc00000 +result host=h1|job=y ; 1:402e000000000000 2:4034000000000000 +result host=h1|job=y|zone=z1 ; 9:402e000000000000 10:0 11:4037000000000000 +result host=h10 ; 2:3ff0000000000000 4:402e000000000000 8:4037000000000000 9:4010000000000000 +result host=h2 ; 5:4037000000000000 6:402c000000000000 9:4037000000000000 +result host=h2|job=ax ; 7:3ff0000000000000 8:4018000000000000 9:0 +end +case date day_of_month +grid 100000 10000 10 +series __name__=a|host=x ; 8:41e3503123540000 9:4204865240000000 +series __name__=b|host=h10|job=y|zone=z1 ; 8:0 +series __name__=b|host=h1 ; 6:41e9787860600000 7:c225129b8042ac43 +series __name__=b|host=h2 ; 4:c1fb99d458100000 +result host=h1 ; 6:3ff0000000000000 7:4039000000000000 +result host=h10|job=y|zone=z1 ; 8:3ff0000000000000 +result host=h2 ; 4:4034000000000000 +result host=x ; 8:4036000000000000 9:4022000000000000 +end +case date day_of_month +grid 100000 10000 6 +series __name__=b|host=h10|job=x ; 4:41e4fe1ed06c0000 +series __name__=b|host=h2|job=x ; 2:4209557c73100000 3:41d8faecbc480000 4:41e4790c3bf80000 5:41754c9d4c000000 +result host=h10|job=x ; 4:402c000000000000 +result host=h2|job=x ; 2:403f000000000000 3:402c000000000000 4:403b000000000000 5:4030000000000000 +end +case date day_of_month +grid 100000 10000 10 +series __name__=b|host=h1|job=y|zone=z1 ; 2:c22cef23ee020000 3:41c6a761bcd00000 4:c236a21d5da23991 +series __name__=a|host=h10|job=x ; 7:41ed44f334d00000 +result host=h1|job=y|zone=z1 ; 2:403f000000000000 3:3ff0000000000000 4:4039000000000000 +result host=h10|job=x ; 7:403b000000000000 +end +case date year +grid 100000 10000 3 +series __name__=b|host=x ; +series __name__=a|host=h10 ; 0:c23196575fa1b051 1:41eb9e7f0df00000 +series __name__=a|host=x|job=y ; +result host=h10 ; 0:c07a800000000000 1:40a04e0000000000 +end +case date minute +grid 100000 10000 11 +series __name__=b|host=h2 ; 3:41bc16e070000000 4:41e358f24ff00000 6:0 7:c1e0737fbfe00000 8:c23438dd0b37a594 9:c22ebd8ba492495e 10:4210ea268e123282 +result host=h2 ; 3:404b000000000000 4:401c000000000000 6:0 7:0 8:4044000000000000 9:404c800000000000 10:4018000000000000 +end +case date month +grid 100000 10000 3 +series __name__=b|host=h10|job=x|zone=z1 ; 1:41c5845c6c100000 2:41d1a58626800000 +series __name__=b|host=h10|job=x ; 0:420607d15c000000 1:41e7bf79a7500000 2:7ff8000000000001 +series __name__=b|host=x|job=x|zone=z1 ; 1:c205bde8b3580000 2:c1f90f7760000000 +series __name__=b|host=x ; 0:c202925febf80000 1:c22cef23ee020000 +series __name__=a|host=x|job=y ; 1:424d7ffa20c00000 +result host=h10|job=x ; 0:4024000000000000 1:3ff0000000000000 2:4028000000000000 +result host=h10|job=x|zone=z1 ; 1:4026000000000000 2:401c000000000000 +result host=x ; 0:3ff0000000000000 1:4028000000000000 +result host=x|job=x|zone=z1 ; 1:4000000000000000 2:4024000000000000 +result host=x|job=y ; 1:3ff0000000000000 +end +case date days_in_month +grid 100000 10000 3 +series __name__=a|host=h10|job=y ; +series __name__=b|host=h10 ; 2:43dfeb3dd0676600 +series __name__=a|host=h2|job=x ; 0:41e4a7587c1c0000 1:41d8b4686c700000 2:41e45b8f39c40000 +series __name__=b|host=h2 ; 1:41e92e6c34340000 +series __name__=b|host=h2|job=ax|zone=z1 ; 2:c205bd1838e00000 +series __name__=b|host=h10|job=ax ; 1:c2024db248000000 2:424d7ffa20c00000 +result host=h10 ; 2:403f000000000000 +result host=h10|job=ax ; 1:403f000000000000 2:403f000000000000 +result host=h2 ; 1:403c000000000000 +result host=h2|job=ax|zone=z1 ; 2:403f000000000000 +result host=h2|job=x ; 0:403e000000000000 1:403f000000000000 2:403f000000000000 +end +case date day_of_month +grid 100000 10000 1 +series __name__=a|host=h10|job=ax|zone=z1 ; 0:fe37e43c8800759c +result host=h10|job=ax|zone=z1 ; 0:4010000000000000 +end +case date month +grid 100000 10000 9 +series __name__=a|host=h2 ; 7:41e76b3c105c0000 8:421d32c78dfa3e24 +series __name__=a|host=x|job=y ; 2:41cc5db956800000 +series __name__=a|host=h10|job=x ; 1:426d1a94a2000000 2:41d10c50e2800000 3:422d77b5f72d4efd 5:423416def50278ee 6:c216d9cabd46d7f8 8:c3dfeb3dd0676600 +result host=h10|job=x ; 1:4022000000000000 2:4010000000000000 3:4010000000000000 5:4008000000000000 6:4018000000000000 8:4014000000000000 +result host=h2 ; 7:4020000000000000 8:4018000000000000 +result host=x|job=y ; 2:4000000000000000 +end +case date day_of_year +grid 100000 10000 6 +series __name__=a|host=x|job=y ; 5:41ca40ff00800000 +series __name__=a|host=x ; 2:41cda235c7100000 3:41e7f41a2df40000 +result host=x ; 2:4067400000000000 3:4074100000000000 +result host=x|job=y ; 5:4074f00000000000 +end +case date day_of_week +grid 100000 10000 7 +series __name__=a|host=x|job=x ; 1:42095580a5d00000 +series __name__=b|host=x|job=x ; 6:fe37e43c8800759c +series __name__=a|host=x|job=y ; 4:41c841c7d2300000 +series __name__=a|host=h2 ; 5:c1e06dd994800000 +series __name__=a|host=x|zone=z1 ; 4:41dac2e51b480000 +series __name__=b|host=h2|zone=z1 ; 1:41f9f40226fc39b8 2:423723c38ae0f083 +result host=h2 ; 5:4010000000000000 +result host=h2|zone=z1 ; 1:4010000000000000 2:4000000000000000 +result host=x|job=x ; 1:0 6:0 +result host=x|job=y ; 4:4000000000000000 +result host=x|zone=z1 ; 4:0 +end +case date days_in_month +grid 100000 10000 11 +series __name__=b|host=h2|job=x|zone=z1 ; 2:c2360b8e9753cad0 3:41e254aae4f00000 4:41d90ca250680000 5:0 6:41e97155a0840000 +series __name__=b|host=x|job=x|zone=z1 ; 8:4376345785d8a000 +result host=h2|job=x|zone=z1 ; 2:403f000000000000 3:403f000000000000 4:403e000000000000 5:403f000000000000 6:403f000000000000 +result host=x|job=x|zone=z1 ; 8:403e000000000000 +end +case date days_in_month +grid 100000 10000 4 +series __name__=a|host=h1|job=y ; 1:c1e06dd0b4000000 2:41ee9aa6e0400000 +series __name__=b|host=h2|job=x|zone=z1 ; 3:41d0caaf62480000 +series __name__=a|host=h10|job=ax|zone=z1 ; 2:41e8cc862f300000 +series __name__=a|host=h1 ; +series __name__=b|host=x ; 2:41e06584285c0000 +result host=h1|job=y ; 1:403c000000000000 2:403f000000000000 +result host=h10|job=ax|zone=z1 ; 2:403e000000000000 +result host=h2|job=x|zone=z1 ; 3:403e000000000000 +result host=x ; 2:403e000000000000 +end +case date day_of_year +grid 100000 10000 12 +series __name__=b|host=h10|job=x ; 1:41ecb8d428400000 2:c3dfeb3dd0676600 3:41e98e228ddc0000 4:41ee9aa1a8600000 6:c1e54cad7fbac2dd 7:41e25dee3ab80000 8:41d0606cb7900000 +series __name__=b|host=x|job=x|zone=z1 ; 10:41d7f26d9a580000 +series __name__=b|host=h1 ; +series __name__=b|host=h2 ; 7:424d7ffa20c00000 +result host=h10|job=x ; 1:404d800000000000 2:405ec00000000000 3:406f800000000000 4:404e000000000000 6:4062c00000000000 7:4046000000000000 8:4072f00000000000 +result host=h2 ; 7:3ff0000000000000 +result host=x|job=x|zone=z1 ; 10:4075300000000000 +end +case date days_in_month +grid 100000 10000 10 +series __name__=b|host=x|job=ax ; 0:4229bbedda1518e1 2:c3dfeb3dd0676600 3:41ed4c6056b80000 +series __name__=a|host=h1 ; 5:41b66ceb15a00000 +series __name__=a|host=x|job=y ; 8:c2365ec44069e780 +series __name__=b|host=h2 ; 5:41d42cf742d00000 6:c2215fc2dd58091c 7:c2353fb3582c75fb +series __name__=b|host=h2|job=x ; 3:41c04d9a23d00000 4:c376345785d8a000 5:41d179431c400000 6:c21ab4af980d2fce +result host=h1 ; 5:403f000000000000 +result host=h2 ; 5:403e000000000000 6:403e000000000000 7:403f000000000000 +result host=h2|job=x ; 3:403f000000000000 4:403e000000000000 5:403c000000000000 6:403e000000000000 +result host=x|job=ax ; 0:403f000000000000 2:403f000000000000 3:403f000000000000 +result host=x|job=y ; 8:403f000000000000 +end +case date day_of_week +grid 100000 10000 1 +series __name__=b|host=h2|job=ax ; 0:41ee9aa74d800000 +result host=h2|job=ax ; 0:3ff0000000000000 +end +case date year +grid 100000 10000 6 +series __name__=b|host=x|job=y ; 4:fe37e43c8800759c +series __name__=b|host=h1|zone=z1 ; 4:0 +series __name__=a|host=h10|job=x ; 2:41d244a990180000 3:41d00b30c1a00000 4:41d5d81915d80000 +series __name__=a|host=h2 ; 3:7ff0000000000000 +series __name__=a|host=h10|job=ax|zone=z1 ; 2:41d1341da8100000 4:c376345785d8a000 +series __name__=a|host=h2|job=x|zone=z1 ; 2:422360519d9f0b4b +result host=h1|zone=z1 ; 4:409ec80000000000 +result host=h10|job=ax|zone=z1 ; 2:409f580000000000 4:c1e79c24b9200000 +result host=h10|job=x ; 2:409f600000000000 3:409f500000000000 4:409f800000000000 +result host=h2 ; 3:425103445fc90000 +result host=h2|job=x|zone=z1 ; 2:40a9b00000000000 +result host=x|job=y ; 4:425103445fc90000 +end +case date year +grid 100000 10000 11 +series __name__=a|host=h2|zone=z1 ; 2:41f7084f9c5c99b0 3:41e37874f2c40000 5:41e6a069a6400000 6:41e6f46269600000 7:41dac8a81b300000 8:c1e06b6ca7000000 +series __name__=b|host=h10|zone=z1 ; 1:43dfeb3dd0676600 2:41d6ced70ac00000 3:41c7453771700000 4:41dd3bc301980000 5:42095579f5500000 6:c205bdeed4180000 7:c22a9690b242e392 8:41e49f1a2c200000 +series __name__=a|host=h10|job=y ; 6:41e161898d200000 7:41e16736c3580000 8:4221254dee9f74e1 +result host=h10|job=y ; 6:409fec0000000000 7:409ff00000000000 8:40a8800000000000 +result host=h10|zone=z1 ; 1:4250f83b17f20000 2:409f880000000000 3:409f280000000000 4:409fc00000000000 5:40a2c00000000000 6:4099000000000000 7:4064000000000000 8:40a0120000000000 +result host=h2|zone=z1 ; 2:40a0ea0000000000 3:40a0080000000000 5:40a0240000000000 6:40a0260000000000 7:409fa80000000000 8:409db00000000000 +end +case date day_of_month +grid 100000 10000 8 +series __name__=a|host=h1|job=ax ; 4:fe37e43c8800759c 5:41e028cdb4140000 +result host=h1|job=ax ; 4:4010000000000000 5:4037000000000000 +end +case date day_of_week +grid 100000 10000 9 +series __name__=b|host=h1|job=y ; +series __name__=a|host=h1|job=y ; 8:41ddbcdab8780000 +series __name__=b|host=h2|job=ax ; 8:41db20e98fc00000 +result host=h1|job=y ; 8:3ff0000000000000 +result host=h2|job=ax ; 8:4014000000000000 +end +case date year +grid 100000 10000 4 +series __name__=b|host=x ; +series __name__=a|host=h2|job=ax|zone=z1 ; 1:424d7ffa20c00000 +series __name__=b|host=x|zone=z1 ; 2:41e7291abfac0000 +series __name__=a|host=h1|job=x ; 1:41e4f6fb4f580000 2:41c2d8893f800000 3:41d9301e6fc00000 +result host=h1|job=x ; 1:40a0160000000000 2:409f180000000000 3:409f9c0000000000 +result host=h2|job=ax|zone=z1 ; 1:40c3880000000000 +result host=x|zone=z1 ; 2:40a0280000000000 +end +case date hour +grid 100000 10000 1 +series __name__=b|host=h2|job=y|zone=z1 ; 0:4209557d10200000 +result host=h2|job=y|zone=z1 ; 0:402c000000000000 +end +case date hour +grid 100000 10000 11 +series __name__=b|host=h1|job=y|zone=z1 ; 8:41e5894cb55c0000 +series __name__=a|host=h10|job=ax ; 5:4209557a5d380000 6:422232ca13956101 7:41e8c2a106280000 8:41e6743ee6700000 +result host=h1|job=y|zone=z1 ; 8:4028000000000000 +result host=h10|job=ax ; 5:4020000000000000 6:402c000000000000 7:4031000000000000 8:4010000000000000 +end +case date hour +grid 100000 10000 1 +series __name__=a|host=h10|job=ax ; +series __name__=a|host=x ; +series __name__=a|host=h2|job=y ; 0:41b2590a77800000 +series __name__=a|host=h1|job=ax ; 0:c2225cddb7e0ed5b +series __name__=b|host=x|job=x ; 0:c1d5fc137fc00000 +result host=h1|job=ax ; 0:4010000000000000 +result host=h2|job=y ; 0:4033000000000000 +result host=x|job=x ; 0:0 +end +case date day_of_month +grid 100000 10000 3 +series __name__=b|host=h2|job=x|zone=z1 ; 2:41e328ad27e40000 +result host=h2|job=x|zone=z1 ; 2:403b000000000000 +end +case date minute +grid 100000 10000 2 +series __name__=b|host=h10|zone=z1 ; +series __name__=b|host=h2 ; +series __name__=a|host=x|job=ax|zone=z1 ; 1:41ea910d5f800000 +series __name__=b|host=h1|job=y|zone=z1 ; 0:41d719ec6b680000 1:4376345785d8a000 +series __name__=b|host=h1|job=ax ; 0:c205bd1a84400000 +result host=h1|job=ax ; 0:4026000000000000 +result host=h1|job=y|zone=z1 ; 0:4047000000000000 1:4047000000000000 +result host=x|job=ax|zone=z1 ; 1:3ff0000000000000 +end +case date hour +grid 100000 10000 5 +series __name__=a|host=h10|zone=z1 ; 2:c22878660f2921b3 3:41d68205eebdb03f +series __name__=b|host=h1|job=x ; 3:c3dfeb3dd0676600 +result host=h1|job=x ; 3:4028000000000000 +result host=h10|zone=z1 ; 2:4014000000000000 3:4022000000000000 +end +case date day_of_month +grid 100000 10000 6 +series __name__=b|host=h1|job=ax ; 0:41dad8398b680000 +series __name__=b|host=x|job=y ; 1:41dbafa8c4600000 +series __name__=a|host=h1 ; 5:c22966578fed7424 +series __name__=b|host=h10|job=ax|zone=z1 ; 1:41c3022c87400000 2:4227f429e63d0151 3:c1e06b6d07600000 4:41e659fb7a940000 +series __name__=b|host=h2|job=y|zone=z1 ; 2:41bef3f0a9a00000 3:41e51c03da5c0000 4:c22f85fcc1e0ead2 +series __name__=a|host=h1|job=y ; 0:41b82619ba600000 1:41db6c5f4ab00000 2:7ff0000000000000 +result host=h1 ; 5:4022000000000000 +result host=h1|job=ax ; 0:3ff0000000000000 +result host=h1|job=y ; 0:4008000000000000 1:403a000000000000 2:4010000000000000 +result host=h10|job=ax|zone=z1 ; 1:4033000000000000 2:403e000000000000 3:3ff0000000000000 4:4037000000000000 +result host=h2|job=y|zone=z1 ; 2:4030000000000000 3:402a000000000000 4:4033000000000000 +result host=x|job=y ; 1:4030000000000000 +end +case date day_of_week +grid 100000 10000 5 +series __name__=a|host=x|job=y ; 4:41d3c77a6b100000 +series __name__=b|host=x|zone=z1 ; 2:c1f2a8a9c8100000 +series __name__=a|host=h10 ; 0:c2275f1d3722b0d2 1:41c1af7493900000 +series __name__=b|host=h1|job=ax ; 4:41db1d3602b80000 +result host=h1|job=ax ; 4:3ff0000000000000 +result host=h10 ; 0:4008000000000000 1:4014000000000000 +result host=x|job=y ; 4:3ff0000000000000 +result host=x|zone=z1 ; 2:4018000000000000 +end +case date days_in_month +grid 100000 10000 12 +series __name__=a|host=x|zone=z1 ; 7:c22cef23ee020000 8:c205bdec9cf80000 +series __name__=a|host=h10|job=x ; 3:c376345785d8a000 4:bfe0000000000000 5:41e25ab7a12c0000 6:4205f0fe64000000 7:c205bd1f95480000 +series __name__=b|host=h2|zone=z1 ; +result host=h10|job=x ; 3:403e000000000000 4:403f000000000000 5:403f000000000000 6:403e000000000000 7:403f000000000000 +result host=x|zone=z1 ; 7:403f000000000000 8:403d000000000000 +end +case date day_of_month +grid 100000 10000 12 +series __name__=b|host=x ; 11:41d8a4b5e0700000 +series __name__=a|host=x|job=y|zone=z1 ; 10:41ecb2cdb5c40000 11:42005619b0eaf64c +series __name__=b|host=h1|zone=z1 ; 5:41e7844dfc300000 6:41d59a2977000000 +series __name__=b|host=h1 ; 10:41d9efd63fb00000 +result host=h1 ; 10:403a000000000000 +result host=h1|zone=z1 ; 5:4020000000000000 6:4022000000000000 +result host=x ; 11:403d000000000000 +result host=x|job=y|zone=z1 ; 10:4036000000000000 11:4014000000000000 +end +case date day_of_year +grid 100000 10000 3 +series __name__=b|host=h10|zone=z1 ; 0:43dfeb3dd0676600 +series __name__=a|host=h2|job=y ; +series __name__=a|host=h1|job=ax|zone=z1 ; 1:41e212d2c1bc0000 2:41e6824ccb9c0000 +series __name__=a|host=x|job=x|zone=z1 ; 2:c2047b0868080000 +series __name__=a|host=h1|job=y|zone=z1 ; 1:41d2d2f698780000 +series __name__=b|host=h2|job=ax ; 1:43dfeb3dd0676600 +result host=h1|job=ax|zone=z1 ; 1:4073e00000000000 2:4070c00000000000 +result host=h1|job=y|zone=z1 ; 1:4028000000000000 +result host=h10|zone=z1 ; 0:406e800000000000 +result host=h2|job=ax ; 1:406e800000000000 +result host=x|job=x|zone=z1 ; 2:4069e00000000000 +end +case date month +grid 100000 10000 9 +series __name__=a|host=x|job=y|zone=z1 ; +series __name__=a|host=x ; 0:41cc5ded5e800000 1:fff0000000000000 2:c231e52a2694e2a9 5:4376345785d8a000 7:c22cef23ee020000 8:4230797ef1fc279a +series __name__=a|host=h2|job=ax ; 1:7ff0000000000000 2:c2369c715a78ec40 4:41e818ab2e880000 5:41e10904d9740000 6:c3dfeb3dd0676600 7:fe37e43c8800759c 8:41fe5d3630100000 +series __name__=a|host=h10|job=ax ; 3:c1dd3ea21fc00000 4:4204b27ad1459740 5:41c56fd218f00000 6:41e8c2926cf80000 +series __name__=b|host=h1|job=x ; 5:7e37e43c8800759c 6:4224ed7df4c8a2d1 7:c376345785d8a000 +result host=h1|job=x ; 5:4028000000000000 6:4000000000000000 7:4010000000000000 +result host=h10|job=ax ; 3:4024000000000000 4:4000000000000000 5:4024000000000000 6:4010000000000000 +result host=h2|job=ax ; 1:4028000000000000 2:401c000000000000 4:4018000000000000 5:4018000000000000 6:4014000000000000 7:4028000000000000 8:4010000000000000 +result host=x ; 0:4000000000000000 1:4028000000000000 2:4018000000000000 5:4022000000000000 7:4028000000000000 8:4008000000000000 +end +case date day_of_week +grid 100000 10000 1 +series __name__=a|host=h1|job=y ; +series __name__=b|host=x ; 0:41e7b4c98f000000 +series __name__=a|host=h1|job=x ; 0:41c09f4ef5400000 +series __name__=b|host=h2|zone=z1 ; 0:0 +series __name__=a|host=h1|job=x|zone=z1 ; 0:41dc77f37c080000 +series __name__=a|host=h10|job=x|zone=z1 ; 0:bfe0000000000000 +result host=h1|job=x ; 0:4014000000000000 +result host=h1|job=x|zone=z1 ; 0:4008000000000000 +result host=h10|job=x|zone=z1 ; 0:4010000000000000 +result host=h2|zone=z1 ; 0:4010000000000000 +result host=x ; 0:4008000000000000 +end +case date day_of_month +grid 100000 10000 1 +series __name__=a|host=x|job=y ; 0:c376345785d8a000 +series __name__=b|host=h10|job=x ; 0:41e5e52eca800000 +series __name__=b|host=h2|job=y|zone=z1 ; 0:c376345785d8a000 +series __name__=a|host=h2|zone=z1 ; 0:c1e06dbda9a00000 +series __name__=a|host=h2 ; 0:41ced9ecc8b00000 +result host=h10|job=x ; 0:402e000000000000 +result host=h2 ; 0:4035000000000000 +result host=h2|job=y|zone=z1 ; 0:403b000000000000 +result host=h2|zone=z1 ; 0:402e000000000000 +result host=x|job=y ; 0:403b000000000000 +end +case date day_of_month +grid 100000 10000 6 +series __name__=a|host=x ; 2:41c2e564d3800000 3:41cc5d9adb000000 +series __name__=a|host=h2|job=ax|zone=z1 ; 2:41ca425ac7c00000 +series __name__=a|host=h1|job=y|zone=z1 ; 5:c22dd905e7dbbb16 +series __name__=a|host=h2|job=x ; 5:fe37e43c8800759c +series __name__=b|host=h1|job=ax ; 4:41d973740d400000 +series __name__=b|host=h10 ; +result host=h1|job=ax ; 4:402e000000000000 +result host=h1|job=y|zone=z1 ; 5:403f000000000000 +result host=h2|job=ax|zone=z1 ; 2:4008000000000000 +result host=h2|job=x ; 5:4010000000000000 +result host=x ; 2:4008000000000000 3:403d000000000000 +end +case date day_of_year +grid 100000 10000 4 +series __name__=a|host=h10|job=y ; +series __name__=b|host=h1|job=x ; 0:41d5f48d63700000 +series __name__=a|host=h10|job=ax|zone=z1 ; 0:41ea6668a4040000 1:fff0000000000000 +series __name__=b|host=x|job=ax ; 0:41eb25ed89340000 +series __name__=b|host=h1|job=y|zone=z1 ; 0:7e37e43c8800759c 1:41d28baf35180000 2:41e43428acc00000 +series __name__=b|host=h2|job=ax|zone=z1 ; 3:41d91af8c3380000 +result host=h1|job=x ; 0:406fa00000000000 +result host=h1|job=y|zone=z1 ; 0:4075300000000000 1:4064000000000000 2:4075400000000000 +result host=h10|job=ax|zone=z1 ; 0:405a000000000000 1:4075300000000000 +result host=h2|job=ax|zone=z1 ; 3:4061c00000000000 +result host=x|job=ax ; 0:4065400000000000 +end +case date days_in_month +grid 100000 10000 5 +series __name__=b|host=h10 ; 2:41da468294d80000 4:4204fa4128000000 +series __name__=a|host=x|job=x ; 4:4209558057500000 +series __name__=a|host=h10|job=x ; 3:7ff0000000000000 4:41e23e22ccf40000 +result host=h10 ; 2:403e000000000000 4:403e000000000000 +result host=h10|job=x ; 3:403f000000000000 4:403f000000000000 +result host=x|job=x ; 4:403f000000000000 +end +case date day_of_year +grid 100000 10000 5 +series __name__=b|host=h10|job=ax ; 2:c2006e2f34080000 3:41cc5d89df800000 4:41e2fe10ddec0000 +result host=h10|job=ax ; 2:4065800000000000 3:404e000000000000 4:4071c00000000000 +end +case date year +grid 100000 10000 8 +series __name__=a|host=h10 ; 5:41fe5771a0000000 7:c205bdee47d80000 +series __name__=b|host=h2|job=ax ; 0:41eb711ef9840000 +result host=h10 ; 5:40a1680000000000 7:4099000000000000 +result host=h2|job=ax ; 0:40a04c0000000000 +end +case date days_in_month +grid 100000 10000 7 +series __name__=a|host=h10|zone=z1 ; 6:426d1a94a2000000 +series __name__=a|host=h10|job=y|zone=z1 ; +series __name__=b|host=h1 ; 0:41cc649545d00000 +result host=h1 ; 0:403f000000000000 +result host=h10|zone=z1 ; 6:403e000000000000 +end +case date days_in_month +grid 100000 10000 10 +series __name__=b|host=h2|job=ax ; 1:41edc0e960340000 +series __name__=b|host=h10|zone=z1 ; 7:c22198dc7d194349 9:c376345785d8a000 +series __name__=a|host=h10|job=ax ; 8:c1f765b7f8000000 9:41e3034af8840000 +result host=h10|job=ax ; 8:403f000000000000 9:403e000000000000 +result host=h10|zone=z1 ; 7:403f000000000000 9:403e000000000000 +result host=h2|job=ax ; 1:403f000000000000 +end +case date day_of_month +grid 100000 10000 3 +series __name__=a|host=x|zone=z1 ; 0:c1eb677c0fe00000 +series __name__=b|host=x|zone=z1 ; +series __name__=a|host=h10|job=ax ; 0:41d9739a57400000 1:c22665c5445935ba +result host=h10|job=ax ; 0:402e000000000000 1:403c000000000000 +result host=x|zone=z1 ; 0:4028000000000000 +end +case date month +grid 100000 10000 7 +series __name__=b|host=h2|job=y ; 5:41e545c512d00000 +series __name__=b|host=x|job=ax ; 2:c2269f73efbef768 3:41cc5df39f000000 4:41d9738e0e400000 +series __name__=b|host=h10|job=y|zone=z1 ; 4:41cc5e9e40000000 5:41ea583896c80000 +result host=h10|job=y|zone=z1 ; 4:4008000000000000 5:3ff0000000000000 +result host=h2|job=y ; 5:4018000000000000 +result host=x|job=ax ; 2:4018000000000000 3:4000000000000000 4:4000000000000000 +end +case date hour +grid 100000 10000 12 +series __name__=a|host=h1|job=y|zone=z1 ; 10:41ebc3e2184c0000 +series __name__=b|host=h2|job=y ; 11:41c5c80e2a300000 +series __name__=a|host=x|job=x ; 7:c205bde9ecd80000 9:41deebacb6c80000 10:41b9777e57000000 +series __name__=b|host=h2|job=ax|zone=z1 ; 6:bfe0000000000000 7:7ff0000000000000 8:c1d0bd53c0000000 +series __name__=b|host=h10|job=x ; 0:423382b00d7d1f28 3:41be9d7794800000 4:41e702e1a8580000 5:4214e8d16b4f7da4 6:41c0ffa64f300000 7:41ae9d6c26000000 +result host=h1|job=y|zone=z1 ; 10:4030000000000000 +result host=h10|job=x ; 0:4008000000000000 3:4034000000000000 4:4031000000000000 5:402a000000000000 6:402c000000000000 7:4022000000000000 +result host=h2|job=ax|zone=z1 ; 6:0 7:402e000000000000 8:0 +result host=h2|job=y ; 11:3ff0000000000000 +result host=x|job=x ; 7:4034000000000000 9:4031000000000000 10:4008000000000000 +end +case date days_in_month +grid 100000 10000 7 +series __name__=a|host=x|job=y|zone=z1 ; 2:41e8d66c88d00000 +series __name__=a|host=h10|job=y|zone=z1 ; 5:41e8380296c40000 6:41e3fde5f8ac0000 +series __name__=b|host=x|job=y|zone=z1 ; 0:c1cf69fe00800000 2:41eb9fdb21d00000 +series __name__=a|host=h2|job=y ; 3:4209557911700000 4:41d25b2634b80000 +error vector cannot contain metrics with the same labelset +end +case date year +grid 100000 10000 4 +series __name__=a|host=h1|job=ax ; 0:fe37e43c8800759c +series __name__=a|host=h1|zone=z1 ; 0:c201f49563f80000 1:c3dfeb3dd0676600 +series __name__=b|host=h1|job=ax ; 1:41a7e52935800000 +result host=h1|job=ax ; 0:425103445fc90000 1:409ee00000000000 +result host=h1|zone=z1 ; 0:409a000000000000 1:c250f83b14194000 +end +case date day_of_week +grid 100000 10000 10 +series __name__=a|host=x|job=x ; +series __name__=b|host=h10|job=y ; 5:c203b33810000000 +series __name__=a|host=h2|zone=z1 ; 3:41f9cba980000000 +result host=h10|job=y ; 5:3ff0000000000000 +result host=h2|zone=z1 ; 3:4014000000000000 +end +case date minute +grid 100000 10000 12 +series __name__=b|host=x|job=y ; 0:c3dfeb3dd0676600 1:41e90cf371f80000 3:41d3cfaba6900000 4:c2011de5a0000000 5:41ed57d0396c0000 6:c1e06dc95f000000 +result host=x|job=y ; 0:403a000000000000 1:4044000000000000 3:4047000000000000 4:0 5:4018000000000000 6:404b800000000000 +end +case date days_in_month +grid 100000 10000 12 +series __name__=a|host=h10|job=y ; +end +case date day_of_month +grid 100000 10000 7 +series __name__=b|host=h2 ; 2:4209557ba5a00000 +series __name__=a|host=x ; 0:41dd293eae000000 +series __name__=a|host=h2|job=ax ; 6:fe37e43c8800759c +result host=h2 ; 2:403f000000000000 +result host=h2|job=ax ; 6:4010000000000000 +result host=x ; 0:4018000000000000 +end +case date year +grid 100000 10000 2 +series __name__=b|host=x|job=y ; +end +case date year +grid 100000 10000 4 +series __name__=a|host=h2 ; 1:41d9f36508100000 +series __name__=b|host=x|job=ax ; +series __name__=a|host=x ; 2:41ce62db16400000 +series __name__=a|host=x|job=ax ; 0:41cd1a6c21500000 +series __name__=b|host=h10 ; 1:41dcbd72b6b00000 +result host=h10 ; 1:409fbc0000000000 +result host=h2 ; 1:409fa40000000000 +result host=x ; 2:409f480000000000 +result host=x|job=ax ; 0:409f400000000000 +end +case date hour +grid 100000 10000 9 +series __name__=b|host=x ; 8:424d7ffa20c00000 +series __name__=a|host=h1 ; 2:c1e3045f20000000 3:7ff8000000000001 4:424d7ffa20c00000 6:c205bdf099a80000 7:41e7519feb580000 +result host=h1 ; 2:0 3:402e000000000000 4:0 6:4014000000000000 7:402a000000000000 +result host=x ; 8:0 +end +case date hour +grid 100000 10000 4 +series __name__=b|host=h2|job=y|zone=z1 ; 1:423034ca25d1cd3e +series __name__=b|host=x|job=y ; +series __name__=a|host=x|job=ax|zone=z1 ; 3:c1d9a2cb00400000 +series __name__=b|host=h2 ; 3:fe37e43c8800759c +series __name__=b|host=h2|job=ax ; 1:41d509d62ed80000 +series __name__=b|host=x|job=y|zone=z1 ; 3:41e272a2d9fc0000 +result host=h2 ; 3:402e000000000000 +result host=h2|job=ax ; 1:0 +result host=h2|job=y|zone=z1 ; 1:3ff0000000000000 +result host=x|job=ax|zone=z1 ; 3:4037000000000000 +result host=x|job=y|zone=z1 ; 3:402e000000000000 +end +case date day_of_year +grid 100000 10000 8 +series __name__=b|host=h10|job=y|zone=z1 ; 4:0 5:41ed3226d2b40000 +series __name__=b|host=h2|job=y|zone=z1 ; 1:41c7a9a48ec00000 2:41bdd73750200000 +series __name__=b|host=x|job=ax ; 2:41d7886b3e380000 3:c376345785d8a000 +result host=h10|job=y|zone=z1 ; 4:3ff0000000000000 5:4050000000000000 +result host=h2|job=y|zone=z1 ; 1:404d800000000000 2:4073c00000000000 +result host=x|job=ax ; 2:4031000000000000 3:405d400000000000 +end +case date day_of_year +grid 100000 10000 6 +series __name__=a|host=h2|job=y ; +series __name__=b|host=x ; 1:41cc5e834f000000 2:fe37e43c8800759c 3:4154538aa0000000 4:41e4c82909c00000 +series __name__=b|host=h1|job=x ; 3:41cc5dc20d800000 +result host=h1|job=x ; 3:404e000000000000 +result host=x ; 1:404e800000000000 2:4075300000000000 3:404f000000000000 4:4061c00000000000 +end +case date day_of_week +grid 100000 10000 11 +series __name__=a|host=h2 ; 5:c1e06dda77600000 6:41c8d64db4c00000 7:41dc6c924a980000 8:41ead155dbe00000 9:c2299bfe17dd412c +result host=h2 ; 5:4010000000000000 6:4008000000000000 7:4008000000000000 8:4018000000000000 9:4010000000000000 +end +case date days_in_month +grid 100000 10000 1 +series __name__=a|host=x|zone=z1 ; 0:41cdffb4c6700000 +series __name__=a|host=h1 ; 0:41ee9a9ccf200000 +series __name__=a|host=h10|job=x ; 0:c1e06dcc2a600000 +series __name__=a|host=x ; 0:41eba2d4eb3c0000 +result host=h1 ; 0:403f000000000000 +result host=h10|job=x ; 0:403c000000000000 +result host=x ; 0:403f000000000000 +result host=x|zone=z1 ; 0:403e000000000000 +end +case date day_of_month +grid 100000 10000 8 +series __name__=a|host=h10|job=x ; 5:c22eda049881333f +series __name__=b|host=h1|job=x|zone=z1 ; 4:41d4cbe72dd80000 5:41e02f7d66b00000 +series __name__=a|host=h2|job=y ; 7:424d7ffa20c00000 +result host=h1|job=x|zone=z1 ; 4:4038000000000000 5:4008000000000000 +result host=h10|job=x ; 5:401c000000000000 +result host=h2|job=y ; 7:3ff0000000000000 +end +case date day_of_month +grid 100000 10000 4 +series __name__=b|host=h2 ; 2:41e1077cd6800000 3:423277030c8a5f89 +series __name__=a|host=h2|job=ax|zone=z1 ; 0:41d9738f16c00000 +result host=h2 ; 2:4018000000000000 3:4022000000000000 +result host=h2|job=ax|zone=z1 ; 0:402e000000000000 +end +case date day_of_week +grid 100000 10000 12 +series __name__=b|host=h2|job=y ; 2:fe37e43c8800759c 3:c1e06dc128000000 5:41d7f628db900000 9:c22cef23ee020000 10:41cc5e585f800000 11:41ed6c9f63fc0000 +series __name__=a|host=h2 ; 9:41d7a3f66b680000 10:41cc5e1c28000000 11:c203d6a660080000 +series __name__=a|host=x|job=x|zone=z1 ; 3:c205bdedecd80000 +result host=h2 ; 9:4014000000000000 10:4000000000000000 11:3ff0000000000000 +result host=h2|job=y ; 2:0 3:4010000000000000 5:4000000000000000 9:0 10:4008000000000000 11:4008000000000000 +result host=x|job=x|zone=z1 ; 3:4010000000000000 +end +case date day_of_month +grid 100000 10000 6 +series __name__=b|host=h10|job=y ; 5:41e3c6efd5900000 +result host=h10|job=y ; 5:4026000000000000 +end +case date year +grid 100000 10000 10 +series __name__=b|host=h10 ; 6:41ee9a924be00000 7:41e216be22ac0000 +series __name__=a|host=h10|job=x ; 3:41cd388c38700000 4:41e62d4414f00000 6:41cc5dc09d800000 +series __name__=b|host=h2|job=x ; 3:4208f7b1d4080000 4:41cc5dda04800000 5:c1e06b85a8e00000 6:4201b18d9ff80000 +result host=h10 ; 6:40a0680000000000 7:409ff80000000000 +result host=h10|job=x ; 3:409f440000000000 4:40a0200000000000 6:409f400000000000 +result host=h2|job=x ; 3:40a2b40000000000 4:409f400000000000 5:409db00000000000 6:40a1be0000000000 +end +case date year +grid 100000 10000 12 +series __name__=b|host=h2|job=ax ; 2:43dfeb3dd0676600 3:c2265035be6477f0 5:c205bd160c000000 6:41eb5f3fb0d80000 8:41b9fdc045800000 9:41c5305896400000 11:c20a4bfd28b3887b +series __name__=a|host=x|job=ax ; 11:41d46d4e6ec00000 +series __name__=b|host=h10|job=y|zone=z1 ; 2:c3dfeb3dd0676600 5:c22cef23ee020000 +series __name__=a|host=h1 ; 1:41b47b3cbee00000 3:41c4bac978500000 4:423360e0f4d125f8 5:41ce16eef5a00000 6:c1e06de53aa00000 7:41dab045b9f80000 9:41d75d9878080000 +result host=h1 ; 1:409ef00000000000 3:409f200000000000 4:40b1ff0000000000 5:409f440000000000 6:409db00000000000 7:409fa80000000000 9:409f8c0000000000 +result host=h10|job=y|zone=z1 ; 2:c250f83b14194000 5:0 +result host=h2|job=ax ; 2:4250f83b17f20000 3:407c300000000000 5:4099000000000000 6:40a04c0000000000 8:409efc0000000000 9:409f200000000000 11:4097c80000000000 +result host=x|job=ax ; 11:409f740000000000 +end +case date hour +grid 100000 10000 8 +series __name__=a|host=x|job=ax ; 3:41d5fade3cc80000 4:c22cef23ee020000 5:41b7772694e00000 6:41e6a416e5680000 +series __name__=a|host=h2|job=y ; +result host=x|job=ax ; 3:4020000000000000 4:4037000000000000 5:4028000000000000 6:4028000000000000 +end +case date day_of_year +grid 100000 10000 12 +series __name__=b|host=h1 ; 2:41e931b28df00000 +series __name__=a|host=h1|job=y ; 3:42010f457c000000 4:c1e06dd425e00000 +result host=h1 ; 2:404c000000000000 +result host=h1|job=y ; 3:4055800000000000 4:4047000000000000 +end +case date year +grid 100000 10000 8 +series __name__=b|host=h1|job=x|zone=z1 ; 0:42066c2d8bf80000 1:7ff0000000000000 2:c1ff71fc18000000 3:c232032a88f02626 4:4233ab96486e89c1 5:c1f33cd057f00000 6:c2223e9255cbef64 7:41ebe983c77c0000 +series __name__=b|host=x|job=x ; 0:41ea6970bd1c0000 1:41c1b72b04500000 2:421a2f507714cf36 3:42367e7f2e010ecc 5:41ed3b485b240000 7:41daead096b00000 +series __name__=a|host=x ; 6:41d8ab6afde80000 +series __name__=a|host=h2|job=x ; 6:c20079adc8080000 +series __name__=a|host=h1|job=y ; 6:41cc5e6a77000000 7:c2330955091dd7e8 +series __name__=a|host=h2|job=x|zone=z1 ; 7:c1e06dd612e00000 +result host=h1|job=x|zone=z1 ; 0:40a25e0000000000 1:425103445fc90000 2:409a980000000000 3:c07e200000000000 4:40b2270000000000 5:409c380000000000 6:4086c00000000000 7:40a0500000000000 +result host=h1|job=y ; 6:409f400000000000 7:c083680000000000 +result host=h2|job=x ; 6:409a640000000000 +result host=h2|job=x|zone=z1 ; 7:409db00000000000 +result host=x ; 6:409f980000000000 +result host=x|job=x ; 0:40a0440000000000 1:409f100000000000 2:40a6580000000000 3:40b3a70000000000 5:40a05c0000000000 7:409fac0000000000 +end +case date year +grid 100000 10000 1 +series __name__=b|host=h10|job=ax|zone=z1 ; 0:41e6f6b514600000 +series __name__=b|host=h1|job=ax ; +series __name__=b|host=h10|job=y ; 0:4376345785d8a000 +result host=h10|job=ax|zone=z1 ; 0:40a0260000000000 +result host=h10|job=y ; 0:41e79c26a5800000 +end +case date day_of_week +grid 100000 10000 11 +series __name__=b|host=h10|job=x ; 4:c232186587429da7 6:424d7ffa20c00000 7:41cfdad0a3500000 8:41e99f1c18a40000 9:41d3832612c00000 10:fff0000000000000 +series __name__=a|host=h10 ; 9:41e7e8db5d4c0000 10:41acc59078400000 +series __name__=b|host=h2|job=ax ; 7:41e48441bddc0000 8:7ff8000000000001 9:c2022fd3cbf80000 +series __name__=a|host=h1|job=ax ; +series __name__=a|host=h10|job=x ; +series __name__=b|host=x|zone=z1 ; 2:41ebbdc0f8cc0000 3:41e4d9dcdbfc0000 4:c22c344d36c822c7 5:42015a8014080000 +result host=h10 ; 9:4010000000000000 10:4010000000000000 +result host=h10|job=x ; 4:4000000000000000 6:4018000000000000 7:4018000000000000 8:4008000000000000 9:4010000000000000 10:0 +result host=h2|job=ax ; 7:4010000000000000 8:0 9:4008000000000000 +result host=x|zone=z1 ; 2:4018000000000000 3:4014000000000000 4:4010000000000000 5:0 +end +case date month +grid 100000 10000 10 +series __name__=b|host=x|job=x ; +series __name__=a|host=h2|job=ax|zone=z1 ; 5:41edb41c339c0000 +result host=h2|job=ax|zone=z1 ; 5:4014000000000000 +end +case date year +grid 100000 10000 5 +series __name__=a|host=h2|job=x ; +series __name__=b|host=h2|job=x|zone=z1 ; 1:41ac95f8bdc00000 +series __name__=a|host=h10|zone=z1 ; 3:c234a86aed22df0d 4:41cc5e55d3000000 +series __name__=b|host=h2|job=y ; 1:41cc3da5b5000000 2:41ea179a1c540000 3:41e8d41ae91c0000 +series __name__=b|host=h10|job=x ; 1:41edb29133cc0000 +result host=h10|job=x ; 1:40a0600000000000 +result host=h10|zone=z1 ; 3:c08a500000000000 4:409f400000000000 +result host=h2|job=x|zone=z1 ; 1:409ee40000000000 +result host=h2|job=y ; 1:409f400000000000 2:40a0400000000000 3:40a0360000000000 +end +case date minute +grid 100000 10000 3 +series __name__=b|host=h2|job=x ; 1:7ff8000000000001 +series __name__=b|host=x|job=ax|zone=z1 ; 0:41dd81b298b00000 +series __name__=a|host=h1|zone=z1 ; 1:41ee9a9ce8000000 +result host=h1|zone=z1 ; 1:4028000000000000 +result host=h2|job=x ; 1:403e000000000000 +result host=x|job=ax|zone=z1 ; 0:403c000000000000 +end +case date day_of_month +grid 100000 10000 1 +series __name__=b|host=h10|job=ax ; 0:c1e06ddb18200000 +series __name__=b|host=h2|job=y|zone=z1 ; +series __name__=b|host=h10|job=ax|zone=z1 ; 0:41834950ef000000 +series __name__=b|host=h2|job=ax ; +series __name__=a|host=h1|job=x|zone=z1 ; +series __name__=b|host=x|job=y ; +result host=h10|job=ax ; 0:402e000000000000 +result host=h10|job=ax|zone=z1 ; 0:402c000000000000 +end +case date minute +grid 100000 10000 7 +series __name__=a|host=h1|job=x|zone=z1 ; 4:fe37e43c8800759c 5:422672c4094d5edd +series __name__=b|host=h10 ; 4:c1ec5742dfe00000 5:41c3c3d394800000 +series __name__=a|host=h10|job=x|zone=z1 ; 1:41e0c335e9000000 2:41fa316c48000000 3:41e0ef47b6ec0000 +series __name__=a|host=h1|job=ax ; 1:41cc5df2fa800000 2:41dbb96107e80000 +result host=h1|job=ax ; 1:403d000000000000 2:4036000000000000 +result host=h1|job=x|zone=z1 ; 4:403e000000000000 5:4048000000000000 +result host=h10 ; 4:0 5:4043800000000000 +result host=h10|job=x|zone=z1 ; 1:4049000000000000 2:0 3:404b800000000000 +end +case date day_of_month +grid 100000 10000 12 +series __name__=b|host=h2|job=y ; +series __name__=a|host=h1|job=x ; 7:41e934edb4ac0000 8:c1e06dd558c00000 +result host=h1|job=x ; 7:4031000000000000 8:402e000000000000 +end +case date minute +grid 100000 10000 12 +series __name__=b|host=x|job=x ; 3:41d8ee2944c80000 4:422b30dd78d22347 5:41cc5d9794800000 6:424d7ffa20c00000 7:41e1b2fc6dc00000 8:41e4d77fe75c0000 9:41cc5ecb7b800000 +series __name__=a|host=h10|job=y ; 8:c22cef23ee020000 +series __name__=b|host=x|zone=z1 ; 10:c200a753b8000000 +series __name__=b|host=x ; 10:41ea7b162ea40000 +series __name__=a|host=h1|job=ax ; 3:4228495a434e4247 4:41dd6e807db00000 5:bfe0000000000000 +result host=h1|job=ax ; 3:4041000000000000 4:4044800000000000 5:0 +result host=h10|job=y ; 8:404d800000000000 +result host=x ; 10:4008000000000000 +result host=x|job=x ; 3:4047800000000000 4:4035000000000000 5:403e000000000000 6:0 7:4044000000000000 8:403b000000000000 9:4031000000000000 +result host=x|zone=z1 ; 10:0 +end +case date hour +grid 100000 10000 2 +series __name__=a|host=h10|job=ax ; 0:41fba54860000000 1:c205bd15a7b80000 +result host=h10|job=ax ; 0:0 1:4037000000000000 +end +case date month +grid 100000 10000 12 +series __name__=a|host=x ; 1:c221b39fe13f9fcd 2:c22cef23ee020000 3:41bc687028200000 4:41dd2cdefa280000 5:426d1a94a2000000 +series __name__=b|host=h1|job=x|zone=z1 ; 9:4209557f0b880000 11:c1e06b8919800000 +series __name__=a|host=x|job=x|zone=z1 ; 5:c2181a755b968bb2 7:41bfd63f10a00000 8:c205bde9c0e00000 +result host=h1|job=x|zone=z1 ; 9:4028000000000000 11:4008000000000000 +result host=x ; 1:4014000000000000 2:4028000000000000 3:4000000000000000 4:3ff0000000000000 5:4022000000000000 +result host=x|job=x|zone=z1 ; 5:4026000000000000 7:4028000000000000 8:4000000000000000 +end +case date day_of_year +grid 100000 10000 5 +series __name__=a|host=h2|job=x ; 1:41ceee594ec00000 +series __name__=a|host=h10 ; 4:4376345785d8a000 +series __name__=a|host=h1|job=ax ; 4:c1af3a8800000000 +series __name__=a|host=h2|job=y ; 2:41caa9e4b8b00000 3:424d7ffa20c00000 +series __name__=b|host=x|job=ax|zone=z1 ; +result host=h1|job=ax ; 4:4070000000000000 +result host=h10 ; 4:406f400000000000 +result host=h2|job=x ; 1:4074500000000000 +result host=h2|job=y ; 2:4060200000000000 3:3ff0000000000000 +end +case date day_of_month +grid 100000 10000 2 +series __name__=b|host=h10|job=y ; +end +case date month +grid 100000 10000 5 +series __name__=a|host=x|job=x ; 1:41c6a89e45800000 2:41b1ca6c30200000 +series __name__=b|host=h2|job=x ; 2:41e4701f7ce80000 +series __name__=b|host=h1|job=x|zone=z1 ; 2:422bae5ddaf27fd6 3:41e339b72ee80000 4:41bafeee07600000 +series __name__=b|host=h2 ; +series __name__=a|host=x ; 1:41ee9aa353800000 +result host=h1|job=x|zone=z1 ; 2:4022000000000000 3:4024000000000000 4:4014000000000000 +result host=h2|job=x ; 2:4028000000000000 +result host=x ; 1:4008000000000000 +result host=x|job=x ; 1:4000000000000000 2:4018000000000000 +end +case date hour +grid 100000 10000 8 +series __name__=a|host=h1 ; 5:41d0d3b257400000 +series __name__=a|host=x|job=x ; 2:4376345785d8a000 3:41c352ce4e800000 4:c376345785d8a000 +series __name__=b|host=h2|job=y ; 2:c1f16f8d87f00000 +result host=h1 ; 5:4034000000000000 +result host=h2|job=y ; 2:0 +result host=x|job=x ; 2:4022000000000000 3:4026000000000000 4:402c000000000000 +end +case date year +grid 100000 10000 10 +series __name__=a|host=h2|job=y|zone=z1 ; 2:41e8d4db9ddc0000 3:fff0000000000000 4:41e90319af840000 6:bfe0000000000000 7:41e8baa451dc0000 8:41e3bd75fcd00000 9:c1f33fc7b8000000 +series __name__=b|host=h10 ; 3:bfe0000000000000 4:41d1379455b00000 5:41cc5e47ad800000 6:c1e06b70d6600000 7:41e0c1193b2c0000 +series __name__=a|host=h1|job=x|zone=z1 ; 6:c205bd1b17180000 7:4209557de0280000 +series __name__=a|host=x|job=x|zone=z1 ; 2:41de9513c0400000 4:c23546585db3c062 5:fff0000000000000 +series __name__=a|host=h10|job=ax ; 8:7ff0000000000000 9:41cc5e08b3000000 +result host=h1|job=x|zone=z1 ; 6:4099000000000000 7:40a2c00000000000 +result host=h10 ; 3:409ec80000000000 4:409f580000000000 5:409f400000000000 6:409db00000000000 7:409fe40000000000 +result host=h10|job=ax ; 8:425103445fc90000 9:409f400000000000 +result host=h2|job=y|zone=z1 ; 2:40a0360000000000 3:425103445fc90000 4:40a0380000000000 6:409ec80000000000 7:40a0360000000000 8:40a00a0000000000 9:409c380000000000 +result host=x|job=x|zone=z1 ; 2:409fcc0000000000 4:c08cf00000000000 5:425103445fc90000 +end +case date day_of_month +grid 100000 10000 5 +series __name__=a|host=x ; 0:41edb2eac3280000 1:41e6af4da8e00000 2:41e7993e1c780000 3:41cc5e6c8a800000 +series __name__=a|host=x|zone=z1 ; 2:41e147d755640000 3:41cd6d814c600000 +series __name__=a|host=h1|zone=z1 ; 2:c1e06b8c2b000000 3:4236206fe7561be9 4:420ed109195c9e2b +series __name__=b|host=h2|job=y|zone=z1 ; 3:41d916394d480000 +series __name__=b|host=h10|job=y ; 0:41e35f754e000000 1:41d545f2c0500000 +series __name__=a|host=h2 ; 2:41d4214aee280000 3:41b9547762000000 +result host=h1|zone=z1 ; 2:3ff0000000000000 3:403c000000000000 4:4024000000000000 +result host=h10|job=y ; 0:4038000000000000 1:403d000000000000 +result host=h2 ; 2:4036000000000000 3:4034000000000000 +result host=h2|job=y|zone=z1 ; 3:4020000000000000 +result host=x ; 0:4038000000000000 1:4039000000000000 2:402e000000000000 3:3ff0000000000000 +result host=x|zone=z1 ; 2:3ff0000000000000 3:4030000000000000 +end +case date day_of_month +grid 100000 10000 2 +series __name__=b|host=h2|job=ax ; +end +case date minute +grid 100000 10000 9 +series __name__=a|host=x|job=x|zone=z1 ; 1:c2032651bff80000 2:c20aadb012a89675 3:41b92cb1f8000000 +result host=x|job=x|zone=z1 ; 1:0 2:403e000000000000 3:4014000000000000 +end +case date hour +grid 100000 10000 4 +series __name__=a|host=h2|job=x ; +series __name__=a|host=h2|job=x|zone=z1 ; 3:41eb41c127400000 +result host=h2|job=x|zone=z1 ; 3:3ff0000000000000 +end +case date hour +grid 100000 10000 1 +series __name__=b|host=x ; 0:0 +series __name__=a|host=h2 ; 0:41bd5999e4200000 +series __name__=a|host=h2|job=x ; 0:4233e8b00b9cb203 +series __name__=a|host=h1 ; +series __name__=b|host=h2|job=ax ; 0:41e2f881a0200000 +result host=h2 ; 0:4010000000000000 +result host=h2|job=ax ; 0:0 +result host=h2|job=x ; 0:402c000000000000 +result host=x ; 0:0 +end +case date hour +grid 100000 10000 6 +series __name__=a|host=x|job=ax ; 4:c2329da42458fae5 +result host=x|job=ax ; 4:4018000000000000 +end +case date days_in_month +grid 100000 10000 12 +series __name__=a|host=x ; 4:4175483e80000000 6:41e9fbac9c140000 7:c1b713917f000000 8:c205bd1a2fc00000 9:41e91654077c0000 +series __name__=b|host=x|zone=z1 ; 8:41e51726a9300000 9:41cc5e99a4000000 +result host=x ; 4:403e000000000000 6:403f000000000000 7:403e000000000000 8:403f000000000000 9:403e000000000000 +result host=x|zone=z1 ; 8:403e000000000000 9:403f000000000000 +end +case date year +grid 100000 10000 9 +series __name__=b|host=h2|job=x|zone=z1 ; 2:41d9dea3b0600000 3:41e207ebd88c0000 4:41cdf45bcf200000 6:41e0c1b070200000 +series __name__=b|host=h10|job=y|zone=z1 ; 4:c202c55668080000 5:c1f7c85930100000 +series __name__=b|host=x ; 0:41ee9a98ef600000 1:41ed866579440000 3:41d9739274400000 4:c1eeedbca0200000 5:c1f9c68db0000000 +series __name__=a|host=x ; 2:41dc1706a8a80000 3:41e565ec08200000 4:42029347f3f80000 5:41e885f68eb00000 6:c22573854620866b 7:41ed34ba2e8c0000 +series __name__=a|host=h10|job=ax ; 7:c203ce3444000000 8:4227e17660c05c8b +error vector cannot contain metrics with the same labelset +end +case date minute +grid 100000 10000 7 +series __name__=b|host=x|job=y|zone=z1 ; 0:7ff8000000000001 1:41d9738777c00000 2:c2271a26b2a03bcb 3:7ff8000000000001 4:0 +series __name__=b|host=h2 ; 4:c1e06dd6fc800000 +result host=h2 ; 4:4026000000000000 +result host=x|job=y|zone=z1 ; 0:403e000000000000 1:4035000000000000 2:404c800000000000 3:403e000000000000 4:0 +end +case date day_of_month +grid 100000 10000 2 +series __name__=b|host=h2|job=y|zone=z1 ; 1:4201cc4a8c080000 +series __name__=b|host=h10|job=y ; +series __name__=b|host=h2 ; 1:42025d79bc080000 +series __name__=a|host=h10|job=y|zone=z1 ; 1:41df29f6a4180000 +result host=h10|job=y|zone=z1 ; 1:4022000000000000 +result host=h2 ; 1:4026000000000000 +result host=h2|job=y|zone=z1 ; 1:4031000000000000 +end diff --git a/src/promql/src/map_time/tests.rs b/src/promql/src/map_time/tests.rs new file mode 100644 index 00000000000..f4113ac9f81 --- /dev/null +++ b/src/promql/src/map_time/tests.rs @@ -0,0 +1,167 @@ +// Copyright 2023 Greptime Team +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::collections::BTreeMap; +use std::sync::Arc; + +use datafusion::arrow::array::{Float64Array, UInt32Array}; +use datatypes::series::histogram::{ + BucketSideView, CounterResetHint, HistogramBatchBuilder, HistogramView, +}; +use datatypes::series::samples::{FieldSpec, Samples, Series, SeriesFields, SeriesSchema}; +use datatypes::series::time::{EvalGrid, GridRange, GridSpec, TimeAxis}; + +use super::{DateFunction, date_of_eval_time, map_date, time}; +use crate::grid_series::merge_same_labelset; +use crate::grid_series::reference::{ + canonical_bits, golden_cases, labels_of, metric_of, points_of, series_of, +}; + +fn schema(grid: Arc) -> Arc { + Arc::new(SeriesSchema { + fields: vec![FieldSpec { + name: Arc::from("value"), + }] + .into(), + eval_grid: Some(grid), + }) +} + +fn function(name: &str) -> DateFunction { + match name { + "day_of_month" => DateFunction::DayOfMonth, + "day_of_week" => DateFunction::DayOfWeek, + "day_of_year" => DateFunction::DayOfYear, + "days_in_month" => DateFunction::DaysInMonth, + "hour" => DateFunction::Hour, + "minute" => DateFunction::Minute, + "month" => DateFunction::Month, + "year" => DateFunction::Year, + other => panic!("unknown date function {other}"), + } +} + +#[test] +fn time_functions_match_prometheus() { + let cases = golden_cases(include_str!("prometheus_cases.txt")); + assert_eq!(cases.len(), 200); + for case in cases { + let schema = schema(case.grid.clone()); + let actual: Vec = match (case.spec[0].as_str(), case.spec[1].as_str()) { + ("eval_time", "time") => vec![time(&schema).unwrap()], + ("eval_time", name) => vec![date_of_eval_time(function(name), &schema).unwrap()], + ("date", name) => case + .inputs + .iter() + .filter_map(|(labels, points)| series_of(&schema, labels, points)) + .filter_map(|series| map_date(function(name), &schema, &series).unwrap()) + .collect::>(), + (kind, _) => panic!("unknown case {kind}"), + }; + // Dropping `__name__` can give two series one label set. + let actual = match (merge_same_labelset(&schema, actual), case.outcome) { + (Ok(actual), Ok(expected)) => (actual, expected), + (Err(actual), Err(expected)) => { + assert!(actual.to_string().contains(&expected), "{actual}"); + continue; + } + (actual, expected) => panic!("case {:?}: {actual:?} is not {expected:?}", case.spec), + }; + let (actual, expected) = actual; + let actual: BTreeMap<_, _> = actual + .iter() + .map(|series| (labels_of(&series.metric), points_of(series))) + .collect(); + let expected: BTreeMap<_, _> = expected + .into_iter() + .map(|(labels, points)| { + let points = points + .into_iter() + .map(|(index, bits)| (index, canonical_bits(f64::from_bits(bits)))) + .collect(); + (labels, points) + }) + .collect(); + assert_eq!(actual, expected, "case {:?}", case.spec); + } +} + +/// Histogram samples are dropped and the series trimmed to the remaining floats; chunked floats +/// are mapped chunk by chunk. +#[test] +fn map_date_drops_histograms_and_maps_chunks() { + let grid = Arc::new(EvalGrid::try_new(GridSpec::try_new(0, 1000, 4).unwrap()).unwrap()); + let schema = schema(grid.clone()); + let range = GridRange::try_new(grid, 1, 3).unwrap(); + let series = |fields: Samples| { + Series::try_new( + &schema, + metric_of( + &[("__name__", "m"), ("host", "a")] + .map(|(n, v)| (n.into(), v.into())) + .into(), + ), + TimeAxis::Grid(range.clone()), + SeriesFields::one(fields), + ) + .unwrap() + }; + let floats = |values: &[f64]| Samples::from_float(Float64Array::from(values.to_vec())); + + let empty = BucketSideView { + span_offsets: &[], + span_lengths: &[], + buckets: &[], + }; + let mut histograms = HistogramBatchBuilder::new(); + histograms + .push(HistogramView { + schema: 0, + zero_threshold: 0.0, + sum: 1.0, + count: 1.0, + zero_count: 1.0, + reset_hint: CounterResetHint::Unknown, + start_timestamp: None, + custom_values: &[], + positive: empty, + negative: empty, + }) + .unwrap(); + let histogram = + Samples::try_from_histogram(UInt32Array::from(vec![0]), histograms.finish().unwrap()) + .unwrap(); + let mixed = Samples::try_from_chunks(vec![histogram, floats(&[3600.0, 7200.0])]).unwrap(); + let hours = map_date(DateFunction::Hour, &schema, &series(mixed)) + .unwrap() + .unwrap(); + assert_eq!( + points_of(&hours), + BTreeMap::from([(2, 1f64.to_bits()), (3, 2f64.to_bits())]) + ); + assert_eq!(hours.metric.name(), None); + + let chunked = Samples::try_from_chunks(vec![floats(&[60.0]), floats(&[120.0, 180.0])]).unwrap(); + let minutes = map_date(DateFunction::Minute, &schema, &series(chunked)) + .unwrap() + .unwrap(); + assert_eq!( + points_of(&minutes), + BTreeMap::from([ + (1, 1f64.to_bits()), + (2, 2f64.to_bits()), + (3, 3f64.to_bits()) + ]) + ); +} From ee55e3bda7643d360915bfafcd0f645785f3d1ab Mon Sep 17 00:00:00 2001 From: Dennis Zhuang Date: Sat, 17 Oct 2026 22:41:31 +0800 Subject: [PATCH 2/5] fix(promql): drop metadata labels from date function results Prometheus dateWrapper drops __type__ and __unit__ with __name__. Signed-off-by: Dennis Zhuang --- src/promql/src/map_time.rs | 5 ++++- src/promql/src/map_time/tests.rs | 18 +++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/promql/src/map_time.rs b/src/promql/src/map_time.rs index 61d416ebf7e..15d959a3bd8 100644 --- a/src/promql/src/map_time.rs +++ b/src/promql/src/map_time.rs @@ -72,7 +72,7 @@ pub fn map_date( )); }; let mut metric = series.metric.clone(); - metric.remove("__name__"); + metric.remove_all(&METADATA_LABELS); let map = |seconds: f64| function.apply(go_int64(seconds)); let all_floats = series.fields.iter().all(|samples| { @@ -145,6 +145,9 @@ fn go_int64(value: f64) -> i64 { } } +/// Prometheus `schema.IsMetadataLabel`: the labels removed with the metric name. +const METADATA_LABELS: [&str; 3] = ["__name__", "__type__", "__unit__"]; + const SECONDS_PER_DAY: u64 = 86_400; const MARCH_THRU_DECEMBER: u32 = 306; const ABSOLUTE_YEARS: u64 = 292_277_022_400; diff --git a/src/promql/src/map_time/tests.rs b/src/promql/src/map_time/tests.rs index f4113ac9f81..7f96c6bb20f 100644 --- a/src/promql/src/map_time/tests.rs +++ b/src/promql/src/map_time/tests.rs @@ -25,7 +25,7 @@ use datatypes::series::time::{EvalGrid, GridRange, GridSpec, TimeAxis}; use super::{DateFunction, date_of_eval_time, map_date, time}; use crate::grid_series::merge_same_labelset; use crate::grid_series::reference::{ - canonical_bits, golden_cases, labels_of, metric_of, points_of, series_of, + Labels, canonical_bits, golden_cases, labels_of, metric_of, points_of, series_of, }; fn schema(grid: Arc) -> Arc { @@ -108,9 +108,14 @@ fn map_date_drops_histograms_and_maps_chunks() { Series::try_new( &schema, metric_of( - &[("__name__", "m"), ("host", "a")] - .map(|(n, v)| (n.into(), v.into())) - .into(), + &[ + ("__name__", "m"), + ("__type__", "gauge"), + ("__unit__", "seconds"), + ("host", "a"), + ] + .map(|(n, v)| (n.into(), v.into())) + .into(), ), TimeAxis::Grid(range.clone()), SeriesFields::one(fields), @@ -150,7 +155,10 @@ fn map_date_drops_histograms_and_maps_chunks() { points_of(&hours), BTreeMap::from([(2, 1f64.to_bits()), (3, 2f64.to_bits())]) ); - assert_eq!(hours.metric.name(), None); + assert_eq!( + labels_of(&hours.metric), + Labels::from([("host".into(), "a".into())]) + ); let chunked = Samples::try_from_chunks(vec![floats(&[60.0]), floats(&[120.0, 180.0])]).unwrap(); let minutes = map_date(DateFunction::Minute, &schema, &series(chunked)) From 64ac8a8eb8849d13c5c594d9093d23353aca0a70 Mon Sep 17 00:00:00 2001 From: Dennis Zhuang Date: Sat, 17 Oct 2026 23:04:22 +0800 Subject: [PATCH 3/5] fix(promql): expand replacements like Go and merge label sets field by field label_replace expands its template with Go's regexp.Expand rules, where $01 or a reference of more than nine digits names a group. Series that share a label set merge field by field, colliding only when one field has two values at one point. Signed-off-by: Dennis Zhuang --- src/promql/src/grid_series.rs | 42 ++++++++++++++++--------- src/promql/src/grid_series/tests.rs | 30 ++++++++++++++++++ src/promql/src/map_label.rs | 48 ++++++++++++++++++++++++++++- src/promql/src/map_label/tests.rs | 28 +++++++++++++++++ 4 files changed, 133 insertions(+), 15 deletions(-) diff --git a/src/promql/src/grid_series.rs b/src/promql/src/grid_series.rs index e5e9bd53532..4028fe8a056 100644 --- a/src/promql/src/grid_series.rs +++ b/src/promql/src/grid_series.rs @@ -162,7 +162,7 @@ fn label_set(metric: &MetricName) -> LabelSet { } /// Merges series that share a label set into one, as Prometheus does after a function that -/// rewrites labels or drops `__name__`; two of them present at one point fail. +/// rewrites labels or drops `__name__`; two of them holding one field at one point fail. pub fn merge_same_labelset(schema: &Arc, series: Vec) -> Result> { let mut groups: HashMap> = HashMap::with_capacity(series.len()); let mut collided = false; @@ -186,6 +186,7 @@ pub fn merge_same_labelset(schema: &Arc, series: Vec) -> R let mut builder = GridSeriesBuilder::try_new(schema.clone())?; let mut rows = Vec::new(); let mut values = vec![None; schema.fields.len()]; + let mut merged = vec![None; schema.fields.len()]; for (labels, members) in groups { if let [member] = members[..] { output.extend(series[member].take()); @@ -208,19 +209,32 @@ pub fn merge_same_labelset(schema: &Arc, series: Vec) -> R } } rows.sort_unstable_by_key(|&(point, _, _)| point); - if rows.windows(2).any(|pair| pair[0].0 == pair[1].0) { - let labels: Vec<_> = labels - .iter() - .map(|(name, value)| format!("{name}=\"{value}\"")) - .collect(); - return Err(DataFusionError::Execution(format!( - "vector cannot contain metrics with the same labelset {{{}}}", - labels.join(", ") - ))); - } - for &(point, member, row) in &rows { - read_row(series[member].as_ref().unwrap(), row, &mut values)?; - builder.push(point, &values)?; + let mut start = 0; + while start < rows.len() { + let point = rows[start].0; + let end = start + rows[start..].partition_point(|&(p, _, _)| p == point); + // Rows of one point merge field by field; only a field present twice collides. + merged.iter_mut().for_each(|value| *value = None); + for &(_, member, row) in &rows[start..end] { + read_row(series[member].as_ref().unwrap(), row, &mut values)?; + for (slot, value) in merged.iter_mut().zip(&values) { + if value.is_some() { + if slot.is_some() { + let labels: Vec<_> = labels + .iter() + .map(|(name, value)| format!("{name}=\"{value}\"")) + .collect(); + return Err(DataFusionError::Execution(format!( + "vector cannot contain metrics with the same labelset {{{}}}", + labels.join(", ") + ))); + } + *slot = *value; + } + } + } + builder.push(point, &merged)?; + start = end; } let metric = series[members[0]].as_ref().unwrap().metric.clone(); output.extend(builder.finish(metric)?); diff --git a/src/promql/src/grid_series/tests.rs b/src/promql/src/grid_series/tests.rs index aaa98e9312d..4193beb09ab 100644 --- a/src/promql/src/grid_series/tests.rs +++ b/src/promql/src/grid_series/tests.rs @@ -112,3 +112,33 @@ fn merge_treats_empty_label_values_as_absent() { Points::from([(0, 1f64.to_bits()), (1, 2f64.to_bits())]) ); } + +/// Series of one label set merge field by field: different fields at one point combine, and +/// only one field present in both collides. +#[test] +fn merge_combines_disjoint_fields_at_one_point() { + let schema = grid_schema(2, 1); + let series = |row: [Option; 2]| { + let mut builder = GridSeriesBuilder::try_new(schema.clone()).unwrap(); + builder.push(0, &row).unwrap(); + builder.finish(metric(0)).unwrap().unwrap() + }; + let merged = merge_same_labelset( + &schema, + vec![series([Some(1.0), None]), series([None, Some(2.0)])], + ) + .unwrap(); + assert_eq!(merged.len(), 1); + assert_series_eq( + Some(&merged[0]), + &vec![vec![Some(1.0), Some(2.0)]], + &metric(0), + ); + assert!( + merge_same_labelset( + &schema, + vec![series([Some(1.0), None]), series([Some(2.0), None])] + ) + .is_err() + ); +} diff --git a/src/promql/src/map_label.rs b/src/promql/src/map_label.rs index eea21700630..1df90c290d9 100644 --- a/src/promql/src/map_label.rs +++ b/src/promql/src/map_label.rs @@ -53,12 +53,58 @@ pub fn label_replace( continue; }; value.clear(); - captures.expand(replacement, &mut value); + expand(&compiled, &captures, replacement, &mut value); set_label(&mut series.metric, dst, &value)?; } merge_same_labelset(schema, series) } +/// Go `regexp.Expand`, whose template syntax differs from `regex::Captures::expand`: a numeric +/// reference with a leading zero, like `$01`, or of more than nine digits is a group name. +fn expand(regex: &Regex, captures: ®ex::Captures<'_>, template: &str, out: &mut String) { + let mut rest = template; + while let Some(dollar) = rest.find('$') { + out.push_str(&rest[..dollar]); + rest = &rest[dollar + 1..]; + if let Some(after) = rest.strip_prefix('$') { + out.push('$'); + rest = after; + continue; + } + let (braced, body) = match rest.strip_prefix('{') { + Some(body) => (true, body), + None => (false, rest), + }; + let len = body + .find(|c: char| !c.is_alphanumeric() && c != '_') + .unwrap_or(body.len()); + let name = &body[..len]; + let closed = !braced || body[len..].starts_with('}'); + if name.is_empty() || !closed { + // Malformed; Go keeps the `$` as text. + out.push('$'); + continue; + } + rest = &body[len + usize::from(braced)..]; + let number = (name.bytes().all(|b| b.is_ascii_digit()) + && !(name.len() > 1 && name.starts_with('0'))) + .then(|| name.parse::().ok()) + .flatten() + .filter(|_| name.len() <= 9); + let group = match number { + Some(number) => captures.get(number), + None => regex + .capture_names() + .position(|group| group == Some(name)) + .and_then(|index| captures.get(index)), + }; + if let Some(group) = group { + out.push_str(group.as_str()); + } + } + out.push_str(rest); +} + /// `label_join(v, dst, separator, src...)`: `dst` is set to the values of `src` joined by /// `separator`, an absent label joining as the empty string. pub fn label_join( diff --git a/src/promql/src/map_label/tests.rs b/src/promql/src/map_label/tests.rs index 5d779eb2c99..c24f955b40b 100644 --- a/src/promql/src/map_label/tests.rs +++ b/src/promql/src/map_label/tests.rs @@ -84,3 +84,31 @@ fn label_functions_match_prometheus() { "{matched} matched, {merged} merged, {failed} failed" ); } + +/// Replacement templates expand as Go's `regexp.Expand` does; expectations come from Go. +#[test] +fn replacements_expand_like_go() { + let regex = regex::Regex::new("^(?s:(?P[a-z]+)-([0-9]+))$").unwrap(); + let captures = regex.captures("abc-42").unwrap(); + for (template, expected) in [ + ("$01", ""), + ("${01}", ""), + ("$1", "abc"), + ("${1}x", "abcx"), + ("$1x", ""), + ("$$", "$"), + ("$", "$"), + ("${1", "${1"), + ("$word", "abc"), + ("${word}!", "abc!"), + ("$2$1", "42abc"), + ("$-", "$-"), + ("$0", "abc-42"), + ("$9", ""), + ("$1234567890", ""), + ] { + let mut out = String::new(); + super::expand(®ex, &captures, template, &mut out); + assert_eq!(out, expected, "{template}"); + } +} From 9611bb53a4f641ca0b3a366a25af2787d949c43b Mon Sep 17 00:00:00 2001 From: Dennis Zhuang Date: Sat, 17 Oct 2026 23:22:28 +0800 Subject: [PATCH 4/5] fix(promql): read replacement group names with Go's Unicode classes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Go reads a group name as Unicode letters, decimal digits and _, so in $1² the name is 1; char::is_alphanumeric also takes ² and other number characters. Signed-off-by: Dennis Zhuang --- src/promql/src/map_label.rs | 10 ++++++---- src/promql/src/map_label/tests.rs | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/promql/src/map_label.rs b/src/promql/src/map_label.rs index 1df90c290d9..33f8ed18e02 100644 --- a/src/promql/src/map_label.rs +++ b/src/promql/src/map_label.rs @@ -15,7 +15,7 @@ //! `label_replace` and `label_join` over evaluated series, following Prometheus //! `evalLabelReplace`, `evalLabelJoin` and `mergeSeriesWithSameLabelset`. -use std::sync::Arc; +use std::sync::{Arc, LazyLock}; use datafusion::error::{DataFusionError, Result}; use datatypes::series::MetricName; @@ -59,6 +59,10 @@ pub fn label_replace( merge_same_labelset(schema, series) } +/// Go `regexp.Expand` reads a group name as Unicode letters (L), decimal digits (Nd) and `_`, +/// narrower than `char::is_alphanumeric`. +static GROUP_NAME: LazyLock = LazyLock::new(|| Regex::new(r"^[\p{L}\p{Nd}_]*").unwrap()); + /// Go `regexp.Expand`, whose template syntax differs from `regex::Captures::expand`: a numeric /// reference with a leading zero, like `$01`, or of more than nine digits is a group name. fn expand(regex: &Regex, captures: ®ex::Captures<'_>, template: &str, out: &mut String) { @@ -75,9 +79,7 @@ fn expand(regex: &Regex, captures: ®ex::Captures<'_>, template: &str, out: &m Some(body) => (true, body), None => (false, rest), }; - let len = body - .find(|c: char| !c.is_alphanumeric() && c != '_') - .unwrap_or(body.len()); + let len = GROUP_NAME.find(body).map_or(0, |name| name.end()); let name = &body[..len]; let closed = !braced || body[len..].starts_with('}'); if name.is_empty() || !closed { diff --git a/src/promql/src/map_label/tests.rs b/src/promql/src/map_label/tests.rs index c24f955b40b..b90395f5f37 100644 --- a/src/promql/src/map_label/tests.rs +++ b/src/promql/src/map_label/tests.rs @@ -106,6 +106,7 @@ fn replacements_expand_like_go() { ("$0", "abc-42"), ("$9", ""), ("$1234567890", ""), + ("$1²", "abc²"), ] { let mut out = String::new(); super::expand(®ex, &captures, template, &mut out); From 857d8e0b6dbb155cbd72e9012333a1f707757b49 Mon Sep 17 00:00:00 2001 From: Dennis Zhuang Date: Sun, 18 Oct 2026 00:37:15 +0800 Subject: [PATCH 5/5] docs(promql): list the regex dialect differences of label_replace Signed-off-by: Dennis Zhuang --- src/promql/src/map_label.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/promql/src/map_label.rs b/src/promql/src/map_label.rs index 33f8ed18e02..8a8a9ddc62c 100644 --- a/src/promql/src/map_label.rs +++ b/src/promql/src/map_label.rs @@ -29,6 +29,11 @@ mod tests; /// `label_replace(v, dst, replacement, src, regex)`: where `regex` matches the whole value of /// `src`, `dst` is set to `replacement` with `$1`, `${name}` and `$$` expanded. +/// +/// `regex` compiles with the `regex` crate, whose dialect differs from Go's RE2 used by +/// Prometheus: Perl classes (`\d`, `\w`, `\s`, `\b`) are Unicode-aware, `\Q...\E` is rejected, +/// `(?x)` and repeat counts above 1000 are accepted, and `\<`, `\>` are word boundaries instead +/// of literal characters. pub fn label_replace( schema: &Arc, mut series: Vec,