From baadd90ae6502753bebdc330a160fa6364d43715 Mon Sep 17 00:00:00 2001 From: Tyler Levine Date: Mon, 8 Jan 2024 13:04:43 -0800 Subject: [PATCH] refactor(encoding): replace `EncodeLabelSet` impl for `()` with private uninhabited type Signed-off-by: Tyler Levine --- src/encoding.rs | 5 ++++- src/encoding/text.rs | 32 ++++++-------------------------- src/metrics/counter.rs | 6 +++--- src/metrics/histogram.rs | 4 ++-- 4 files changed, 15 insertions(+), 32 deletions(-) diff --git a/src/encoding.rs b/src/encoding.rs index a8ad8615..2e122484 100644 --- a/src/encoding.rs +++ b/src/encoding.rs @@ -244,6 +244,9 @@ pub trait EncodeLabel { #[derive(Debug)] pub struct LabelEncoder<'a>(LabelEncoderInner<'a>); +/// Uninhabited type to represent the lack of a label set for a metric +pub(crate) enum NoLabelSet {} + #[derive(Debug)] enum LabelEncoderInner<'a> { Text(text::LabelEncoder<'a>), @@ -349,7 +352,7 @@ impl EncodeLabelSet for Vec { } } -impl EncodeLabelSet for () { +impl EncodeLabelSet for NoLabelSet { fn encode(&self, _encoder: LabelSetEncoder) -> Result<(), std::fmt::Error> { Ok(()) } diff --git a/src/encoding/text.rs b/src/encoding/text.rs index 26b3cd5d..5fb8c226 100644 --- a/src/encoding/text.rs +++ b/src/encoding/text.rs @@ -24,7 +24,7 @@ //! assert_eq!(expected, buffer); //! ``` -use crate::encoding::{EncodeExemplarValue, EncodeLabelSet}; +use crate::encoding::{EncodeExemplarValue, EncodeLabelSet, NoLabelSet}; use crate::metrics::exemplar::Exemplar; use crate::metrics::MetricType; use crate::registry::{Prefix, Registry, Unit}; @@ -186,7 +186,7 @@ impl<'a> MetricEncoder<'a> { self.write_suffix("total")?; - self.encode_labels::<()>(None)?; + self.encode_labels::(None)?; v.encode( &mut CounterValueEncoder { @@ -210,7 +210,7 @@ impl<'a> MetricEncoder<'a> { ) -> Result<(), std::fmt::Error> { self.write_prefix_name_unit()?; - self.encode_labels::<()>(None)?; + self.encode_labels::(None)?; v.encode( &mut GaugeValueEncoder { @@ -266,14 +266,14 @@ impl<'a> MetricEncoder<'a> { ) -> Result<(), std::fmt::Error> { self.write_prefix_name_unit()?; self.write_suffix("sum")?; - self.encode_labels::<()>(None)?; + self.encode_labels::(None)?; self.writer.write_str(" ")?; self.writer.write_str(dtoa::Buffer::new().format(sum))?; self.newline()?; self.write_prefix_name_unit()?; self.write_suffix("count")?; - self.encode_labels::<()>(None)?; + self.encode_labels::(None)?; self.writer.write_str(" ")?; self.writer.write_str(itoa::Buffer::new().format(count))?; self.newline()?; @@ -747,24 +747,6 @@ mod tests { parse_with_python_client(encoded); } - #[test] - fn encode_histogram_family_with_empty_family_labels() { - let mut registry = Registry::default(); - let family = - Family::new_with_constructor(|| Histogram::new(exponential_buckets(1.0, 2.0, 10))); - registry.register("my_histogram", "My histogram", family.clone()); - - family - .get_or_create(&()) - .observe(1.0); - - let mut encoded = String::new(); - - encode(&mut encoded, ®istry).unwrap(); - - parse_with_python_client(encoded); - } - #[test] fn encode_histogram_family_with_empty_struct_family_labels() { let mut registry = Registry::default(); @@ -781,9 +763,7 @@ mod tests { } } - family - .get_or_create(&EmptyLabels {}) - .observe(1.0); + family.get_or_create(&EmptyLabels {}).observe(1.0); let mut encoded = String::new(); diff --git a/src/metrics/counter.rs b/src/metrics/counter.rs index c1c5e511..dff710c7 100644 --- a/src/metrics/counter.rs +++ b/src/metrics/counter.rs @@ -2,7 +2,7 @@ //! //! See [`Counter`] for details. -use crate::encoding::{EncodeMetric, MetricEncoder}; +use crate::encoding::{EncodeMetric, MetricEncoder, NoLabelSet}; use super::{MetricType, TypedMetric}; use std::marker::PhantomData; @@ -179,7 +179,7 @@ where A: Atomic, { fn encode(&self, mut encoder: MetricEncoder) -> Result<(), std::fmt::Error> { - encoder.encode_counter::<(), _, u64>(&self.get(), None) + encoder.encode_counter::(&self.get(), None) } fn metric_type(&self) -> MetricType { @@ -211,7 +211,7 @@ where N: crate::encoding::EncodeCounterValue, { fn encode(&self, mut encoder: MetricEncoder) -> Result<(), std::fmt::Error> { - encoder.encode_counter::<(), _, u64>(&self.value, None) + encoder.encode_counter::(&self.value, None) } fn metric_type(&self) -> MetricType { diff --git a/src/metrics/histogram.rs b/src/metrics/histogram.rs index 66f4496d..1e418ad9 100644 --- a/src/metrics/histogram.rs +++ b/src/metrics/histogram.rs @@ -2,7 +2,7 @@ //! //! See [`Histogram`] for details. -use crate::encoding::{EncodeMetric, MetricEncoder}; +use crate::encoding::{EncodeMetric, MetricEncoder, NoLabelSet}; use super::{MetricType, TypedMetric}; use parking_lot::{MappedRwLockReadGuard, RwLock, RwLockReadGuard}; @@ -133,7 +133,7 @@ pub fn linear_buckets(start: f64, width: f64, length: u16) -> impl Iterator Result<(), std::fmt::Error> { let (sum, count, buckets) = self.get(); - encoder.encode_histogram::<()>(sum, count, &buckets, None) + encoder.encode_histogram::(sum, count, &buckets, None) } fn metric_type(&self) -> MetricType {