Skip to content

Commit d13bb2b

Browse files
committed
Use AsRef<str> for owned label values
Signed-off-by: Sander van Harmelen <[email protected]>
1 parent 3bd0e82 commit d13bb2b

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
}
@@ -450,6 +450,40 @@ mod tests {
450450
assert!(vec.remove(&labels3).is_err());
451451
}
452452

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

526+
#[test]
527+
fn test_counter_vec_with_owned_label_values() {
528+
let vec = CounterVec::new(
529+
Opts::new("test_vec", "test counter vec help"),
530+
&["l1", "l2"],
531+
)
532+
.unwrap();
533+
534+
let v1 = "v1".to_string();
535+
let v2 = "v2".to_string();
536+
let v3 = "v3".to_string();
537+
538+
assert!(vec.remove_label_values(&[v1.clone(), v2.clone()]).is_err());
539+
vec.with_label_values(&[v1.clone(), v2.clone()]).inc();
540+
assert!(vec.remove_label_values(&[v1.clone(), v2.clone()]).is_ok());
541+
542+
vec.with_label_values(&[v1.clone(), v2.clone()]).inc();
543+
assert!(vec.remove_label_values(&[v1.clone()]).is_err());
544+
assert!(vec.remove_label_values(&[v1.clone(), v3.clone()]).is_err());
545+
}
546+
492547
#[test]
493548
fn test_counter_vec_local() {
494549
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
}
@@ -216,6 +216,29 @@ mod tests {
216216
assert!(vec.remove(&labels).is_err());
217217
}
218218

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

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

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

786-
fn build(&self, opts: &HistogramOpts, vals: &[&str]) -> Result<Histogram> {
786+
fn build<V: AsRef<str>>(&self, opts: &HistogramOpts, vals: &[V]) -> Result<Histogram> {
787787
Histogram::with_opts_and_label_values(opts, vals)
788788
}
789789
}
@@ -1386,6 +1386,27 @@ mod tests {
13861386
assert!(vec.remove_label_values(&["v1", "v3"]).is_err());
13871387
}
13881388

1389+
#[test]
1390+
fn test_histogram_vec_with_owned_label_values() {
1391+
let vec = HistogramVec::new(
1392+
HistogramOpts::new("test_histogram_vec", "test histogram vec help"),
1393+
&["l1", "l2"],
1394+
)
1395+
.unwrap();
1396+
1397+
let v1 = "v1".to_string();
1398+
let v2 = "v2".to_string();
1399+
let v3 = "v3".to_string();
1400+
1401+
assert!(vec.remove_label_values(&[v1.clone(), v2.clone()]).is_err());
1402+
vec.with_label_values(&[v1.clone(), v2.clone()])
1403+
.observe(1.0);
1404+
assert!(vec.remove_label_values(&[v1.clone(), v2.clone()]).is_ok());
1405+
1406+
assert!(vec.remove_label_values(&[v1.clone()]).is_err());
1407+
assert!(vec.remove_label_values(&[v1.clone(), v3.clone()]).is_err());
1408+
}
1409+
13891410
#[test]
13901411
fn test_histogram_vec_with_opts_buckets() {
13911412
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)?;
@@ -115,7 +115,7 @@ impl<P: Atomic> Value<P> {
115115
}
116116
}
117117

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

0 commit comments

Comments
 (0)