Skip to content

Commit 4a0e282

Browse files
svanharmelenlucab
andauthored
Use AsRef<str> for owned label values (#537)
Signed-off-by: Sander van Harmelen <[email protected]> Co-authored-by: Luca Bruno <[email protected]>
1 parent c3865f3 commit 4a0e282

File tree

5 files changed

+307
-33
lines changed

5 files changed

+307
-33
lines changed

src/counter.rs

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ impl<P: Atomic> GenericCounter<P> {
4444

4545
/// Create a [`GenericCounter`] with the `opts` options.
4646
pub fn with_opts(opts: Opts) -> Result<Self> {
47-
Self::with_opts_and_label_values(&opts, &[])
47+
Self::with_opts_and_label_values::<&str>(&opts, &[])
4848
}
4949

50-
fn with_opts_and_label_values(opts: &Opts, label_values: &[&str]) -> Result<Self> {
50+
fn with_opts_and_label_values<V: AsRef<str>>(opts: &Opts, label_values: &[V]) -> Result<Self> {
5151
let v = Value::new(opts, ValueType::Counter, P::T::from_i64(0), label_values)?;
5252
Ok(Self { v: Arc::new(v) })
5353
}
@@ -126,7 +126,7 @@ impl<P: Atomic> MetricVecBuilder for CounterVecBuilder<P> {
126126
type M = GenericCounter<P>;
127127
type P = Opts;
128128

129-
fn build(&self, opts: &Opts, vals: &[&str]) -> Result<Self::M> {
129+
fn build<V: AsRef<str>>(&self, opts: &Opts, vals: &[V]) -> Result<Self::M> {
130130
Self::M::with_opts_and_label_values(opts, vals)
131131
}
132132
}
@@ -452,6 +452,40 @@ mod tests {
452452
assert!(vec.remove(&labels3).is_err());
453453
}
454454

455+
#[test]
456+
fn test_counter_vec_with_owned_labels() {
457+
let vec = CounterVec::new(
458+
Opts::new("test_couter_vec", "test counter vec help"),
459+
&["l1", "l2"],
460+
)
461+
.unwrap();
462+
463+
let v1 = "v1".to_string();
464+
let v2 = "v2".to_string();
465+
466+
let mut labels = HashMap::new();
467+
labels.insert("l1", v1.clone());
468+
labels.insert("l2", v2.clone());
469+
assert!(vec.remove(&labels).is_err());
470+
471+
vec.with(&labels).inc();
472+
assert!(vec.remove(&labels).is_ok());
473+
assert!(vec.remove(&labels).is_err());
474+
475+
let mut labels2 = HashMap::new();
476+
labels2.insert("l1", v2.clone());
477+
labels2.insert("l2", v1.clone());
478+
479+
vec.with(&labels).inc();
480+
assert!(vec.remove(&labels2).is_err());
481+
482+
vec.with(&labels).inc();
483+
484+
let mut labels3 = HashMap::new();
485+
labels3.insert("l1", v1.clone());
486+
assert!(vec.remove(&labels3).is_err());
487+
}
488+
455489
#[test]
456490
fn test_int_counter_vec() {
457491
let vec = IntCounterVec::new(Opts::new("foo", "bar"), &["l1", "l2"]).unwrap();
@@ -491,6 +525,27 @@ mod tests {
491525
assert!(vec.remove_label_values(&["v1", "v3"]).is_err());
492526
}
493527

528+
#[test]
529+
fn test_counter_vec_with_owned_label_values() {
530+
let vec = CounterVec::new(
531+
Opts::new("test_vec", "test counter vec help"),
532+
&["l1", "l2"],
533+
)
534+
.unwrap();
535+
536+
let v1 = "v1".to_string();
537+
let v2 = "v2".to_string();
538+
let v3 = "v3".to_string();
539+
540+
assert!(vec.remove_label_values(&[v1.clone(), v2.clone()]).is_err());
541+
vec.with_label_values(&[v1.clone(), v2.clone()]).inc();
542+
assert!(vec.remove_label_values(&[v1.clone(), v2.clone()]).is_ok());
543+
544+
vec.with_label_values(&[v1.clone(), v2.clone()]).inc();
545+
assert!(vec.remove_label_values(&[v1.clone()]).is_err());
546+
assert!(vec.remove_label_values(&[v1.clone(), v3.clone()]).is_err());
547+
}
548+
494549
#[test]
495550
fn test_counter_vec_local() {
496551
let vec = CounterVec::new(

src/gauge.rs

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ impl<P: Atomic> GenericGauge<P> {
4343

4444
/// Create a [`GenericGauge`] with the `opts` options.
4545
pub fn with_opts(opts: Opts) -> Result<Self> {
46-
Self::with_opts_and_label_values(&opts, &[])
46+
Self::with_opts_and_label_values::<&str>(&opts, &[])
4747
}
4848

49-
fn with_opts_and_label_values(opts: &Opts, label_values: &[&str]) -> Result<Self> {
49+
fn with_opts_and_label_values<V: AsRef<str>>(opts: &Opts, label_values: &[V]) -> Result<Self> {
5050
let v = Value::new(opts, ValueType::Gauge, P::T::from_i64(0), label_values)?;
5151
Ok(Self { v: Arc::new(v) })
5252
}
@@ -129,7 +129,7 @@ impl<P: Atomic> MetricVecBuilder for GaugeVecBuilder<P> {
129129
type M = GenericGauge<P>;
130130
type P = Opts;
131131

132-
fn build(&self, opts: &Opts, vals: &[&str]) -> Result<Self::M> {
132+
fn build<V: AsRef<str>>(&self, opts: &Opts, vals: &[V]) -> Result<Self::M> {
133133
Self::M::with_opts_and_label_values(opts, vals)
134134
}
135135
}
@@ -218,6 +218,29 @@ mod tests {
218218
assert!(vec.remove(&labels).is_err());
219219
}
220220

221+
#[test]
222+
fn test_gauge_vec_with_owned_labels() {
223+
let vec = GaugeVec::new(
224+
Opts::new("test_gauge_vec", "test gauge vec help"),
225+
&["l1", "l2"],
226+
)
227+
.unwrap();
228+
229+
let mut labels = HashMap::new();
230+
labels.insert("l1", "v1");
231+
labels.insert("l2", "v2");
232+
assert!(vec.remove(&labels).is_err());
233+
234+
vec.with(&labels).inc();
235+
vec.with(&labels).dec();
236+
vec.with(&labels).add(42.0);
237+
vec.with(&labels).sub(42.0);
238+
vec.with(&labels).set(42.0);
239+
240+
assert!(vec.remove(&labels).is_ok());
241+
assert!(vec.remove(&labels).is_err());
242+
}
243+
221244
#[test]
222245
fn test_gauge_vec_with_label_values() {
223246
let vec = GaugeVec::new(
@@ -239,4 +262,30 @@ mod tests {
239262
assert!(vec.remove_label_values(&["v1"]).is_err());
240263
assert!(vec.remove_label_values(&["v1", "v3"]).is_err());
241264
}
265+
266+
#[test]
267+
fn test_gauge_vec_with_owned_label_values() {
268+
let vec = GaugeVec::new(
269+
Opts::new("test_gauge_vec", "test gauge vec help"),
270+
&["l1", "l2"],
271+
)
272+
.unwrap();
273+
274+
let v1 = "v1".to_string();
275+
let v2 = "v2".to_string();
276+
let v3 = "v3".to_string();
277+
278+
assert!(vec.remove_label_values(&[v1.clone(), v2.clone()]).is_err());
279+
vec.with_label_values(&[v1.clone(), v2.clone()]).inc();
280+
assert!(vec.remove_label_values(&[v1.clone(), v2.clone()]).is_ok());
281+
282+
vec.with_label_values(&[v1.clone(), v2.clone()]).inc();
283+
vec.with_label_values(&[v1.clone(), v2.clone()]).dec();
284+
vec.with_label_values(&[v1.clone(), v2.clone()]).add(42.0);
285+
vec.with_label_values(&[v1.clone(), v2.clone()]).sub(42.0);
286+
vec.with_label_values(&[v1.clone(), v2.clone()]).set(42.0);
287+
288+
assert!(vec.remove_label_values(&[v1.clone()]).is_err());
289+
assert!(vec.remove_label_values(&[v1.clone(), v3.clone()]).is_err());
290+
}
242291
}

src/histogram.rs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ pub struct HistogramCore {
327327
}
328328

329329
impl HistogramCore {
330-
pub fn new(opts: &HistogramOpts, label_values: &[&str]) -> Result<HistogramCore> {
330+
pub fn new<V: AsRef<str>>(opts: &HistogramOpts, label_values: &[V]) -> Result<HistogramCore> {
331331
let desc = opts.describe()?;
332332

333333
for name in &desc.variable_labels {
@@ -674,12 +674,12 @@ pub struct Histogram {
674674
impl Histogram {
675675
/// `with_opts` creates a [`Histogram`] with the `opts` options.
676676
pub fn with_opts(opts: HistogramOpts) -> Result<Histogram> {
677-
Histogram::with_opts_and_label_values(&opts, &[])
677+
Histogram::with_opts_and_label_values::<&str>(&opts, &[])
678678
}
679679

680-
fn with_opts_and_label_values(
680+
fn with_opts_and_label_values<V: AsRef<str>>(
681681
opts: &HistogramOpts,
682-
label_values: &[&str],
682+
label_values: &[V],
683683
) -> Result<Histogram> {
684684
let core = HistogramCore::new(opts, label_values)?;
685685

@@ -782,7 +782,7 @@ impl MetricVecBuilder for HistogramVecBuilder {
782782
type M = Histogram;
783783
type P = HistogramOpts;
784784

785-
fn build(&self, opts: &HistogramOpts, vals: &[&str]) -> Result<Histogram> {
785+
fn build<V: AsRef<str>>(&self, opts: &HistogramOpts, vals: &[V]) -> Result<Histogram> {
786786
Histogram::with_opts_and_label_values(opts, vals)
787787
}
788788
}
@@ -1389,6 +1389,27 @@ mod tests {
13891389
assert!(vec.remove_label_values(&["v1", "v3"]).is_err());
13901390
}
13911391

1392+
#[test]
1393+
fn test_histogram_vec_with_owned_label_values() {
1394+
let vec = HistogramVec::new(
1395+
HistogramOpts::new("test_histogram_vec", "test histogram vec help"),
1396+
&["l1", "l2"],
1397+
)
1398+
.unwrap();
1399+
1400+
let v1 = "v1".to_string();
1401+
let v2 = "v2".to_string();
1402+
let v3 = "v3".to_string();
1403+
1404+
assert!(vec.remove_label_values(&[v1.clone(), v2.clone()]).is_err());
1405+
vec.with_label_values(&[v1.clone(), v2.clone()])
1406+
.observe(1.0);
1407+
assert!(vec.remove_label_values(&[v1.clone(), v2.clone()]).is_ok());
1408+
1409+
assert!(vec.remove_label_values(&[v1.clone()]).is_err());
1410+
assert!(vec.remove_label_values(&[v1.clone(), v3.clone()]).is_err());
1411+
}
1412+
13921413
#[test]
13931414
fn test_histogram_vec_with_opts_buckets() {
13941415
let labels = ["l1", "l2"];

src/value.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ pub struct Value<P: Atomic> {
3737
}
3838

3939
impl<P: Atomic> Value<P> {
40-
pub fn new<D: Describer>(
40+
pub fn new<D: Describer, V: AsRef<str>>(
4141
describer: &D,
4242
val_type: ValueType,
4343
val: P::T,
44-
label_values: &[&str],
44+
label_values: &[V],
4545
) -> Result<Self> {
4646
let desc = describer.describe()?;
4747
let label_pairs = make_label_pairs(&desc, label_values)?;
@@ -114,7 +114,7 @@ impl<P: Atomic> Value<P> {
114114
}
115115
}
116116

117-
pub fn make_label_pairs(desc: &Desc, label_values: &[&str]) -> Result<Vec<LabelPair>> {
117+
pub fn make_label_pairs<V: AsRef<str>>(desc: &Desc, label_values: &[V]) -> Result<Vec<LabelPair>> {
118118
if desc.variable_labels.len() != label_values.len() {
119119
return Err(Error::InconsistentCardinality {
120120
expect: desc.variable_labels.len(),
@@ -135,7 +135,7 @@ pub fn make_label_pairs(desc: &Desc, label_values: &[&str]) -> Result<Vec<LabelP
135135
for (i, n) in desc.variable_labels.iter().enumerate() {
136136
let mut label_pair = LabelPair::default();
137137
label_pair.set_name(n.clone());
138-
label_pair.set_value(label_values[i].to_owned());
138+
label_pair.set_value(label_values[i].as_ref().to_owned());
139139
label_pairs.push(label_pair);
140140
}
141141

0 commit comments

Comments
 (0)