Skip to content

Commit

Permalink
refactor(metrics/histogram): constructor accepts IntoIterator
Browse files Browse the repository at this point in the history
this is a very small, **non-breaking**, alteration to the signature of
`Histogram`'s constructor.

rather than accepting an `impl Iterator`, this commit changes the
parameter of `Histogram::new()` to be an `impl IntoIterator` instead.
this does not affect the existing contract because of the blanket
`impl<I: Iterator> IntoIterator for I` implementation provided by the
standard library.

by accepting `IntoIterator` however, callers providing a collection such
as a `[f64; 5]` array or a `Vec<f64>` vector do not need to invoke
`into_iter()` themselves at the call-site.

```rust
// now, constructing a histogram needn't involve `into_iter()`...
use prometheus_client::metrics::histogram::Histogram;
let histogram = Histogram::new([10.0, 100.0, 1_000.0]);
```

this leans on the same sugar used by `for {}` loops, see the relevant
section of the `std::iter` documentation here:
<https://doc.rust-lang.org/stable/std/iter/index.html#for-loops-and-intoiterator>

no changes are needed within `Histogram::new()` because we already call
`into_iter()` on the provider iterator when appending `f64::MAX` and
collecting the buckets into a `Vec<_>`.

Signed-off-by: katelyn martin <me+cratelyn@katelyn.world>
  • Loading branch information
cratelyn committed Nov 18, 2024
1 parent 12923ca commit 9993c64
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions src/metrics/histogram.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ use std::sync::Arc;
/// let custom_buckets = [
/// 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0,
/// ];
/// let histogram = Histogram::new(custom_buckets.into_iter());
/// let histogram = Histogram::new(custom_buckets);
/// histogram.observe(4.2);
/// ```
// TODO: Consider using atomics. See
Expand Down Expand Up @@ -57,7 +57,12 @@ pub(crate) struct Inner {

impl Histogram {
/// Create a new [`Histogram`].
pub fn new(buckets: impl Iterator<Item = f64>) -> Self {
///
/// ```rust
/// # use prometheus_client::metrics::histogram::Histogram;
/// let histogram = Histogram::new([10.0, 100.0, 1_000.0]);
/// ```
pub fn new(buckets: impl IntoIterator<Item = f64>) -> Self {
Self {
inner: Arc::new(RwLock::new(Inner {
sum: Default::default(),
Expand Down

0 comments on commit 9993c64

Please sign in to comment.