Skip to content

refactor(metrics/histogram): 🎂 constructor accepts IntoIterator - #243

Merged
mxinden merged 2 commits into
prometheus:masterfrom
cratelyn:histogram-into-iter
Jan 15, 2025
Merged

refactor(metrics/histogram): 🎂 constructor accepts IntoIterator#243
mxinden merged 2 commits into
prometheus:masterfrom
cratelyn:histogram-into-iter

Conversation

@cratelyn

Copy link
Copy Markdown
Contributor

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.

// 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<_>.

@cratelyn cratelyn changed the title refactor(metrics/histogram): constructor accepts IntoIterator Nov 18, 2024

@mxinden mxinden left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks good to me. Neat!

@cratelyn would you mind adding a changelog entry?

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>
@cratelyn
cratelyn force-pushed the histogram-into-iter branch from 9993c64 to 1e216f1 Compare January 8, 2025 19:55
@cratelyn

cratelyn commented Jan 8, 2025

Copy link
Copy Markdown
Contributor Author

sure thing! i've rebased this on the latest master branch, and have added a changelog entry for this pull request. how does 1e216f1 look?

Comment thread CHANGELOG.md Outdated
Comment thread CHANGELOG.md
cratelyn added a commit to cratelyn/prometheus-client that referenced this pull request Jan 15, 2025
this commit addresses some chores related to the package manifest, and
the changelog, noticed in review.

see:

- <prometheus#243 (comment)>
- <prometheus#243 (comment)>
this commit addresses some chores related to the package manifest, and
the changelog, noticed in review.

see:

- <prometheus#243 (comment)>
- <prometheus#243 (comment)>

Signed-off-by: katelyn martin <me+cratelyn@katelyn.world>
@cratelyn
cratelyn force-pushed the histogram-into-iter branch from ce22f2d to 984d76f Compare January 15, 2025 17:26

@mxinden mxinden left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@mxinden
mxinden merged commit 9a74e99 into prometheus:master Jan 15, 2025
@cratelyn
cratelyn deleted the histogram-into-iter branch January 15, 2025 18:03
@mxinden

mxinden commented Jan 15, 2025

Copy link
Copy Markdown
Member

Tagged and published.

eleboucher pushed a commit to eleboucher/towonel that referenced this pull request Apr 18, 2026
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [prometheus-client](https://github.com/prometheus/client_rust) | workspace.dependencies | minor | `0.22` → `0.24` |

---

### Release Notes

<details>
<summary>prometheus/client_rust (prometheus-client)</summary>

### [`v0.24.1`](https://github.com/prometheus/client_rust/blob/HEAD/CHANGELOG.md#0241)

[Compare Source](prometheus/client_rust@v0.24.0...v0.24.1)

##### Added

- `EncodeGaugeValue` is implemented for `usize` and `isize`, and
  `EncodeCounterValue` is implemented for `usize`. See [PR 282].

##### Fixed

- `EncodeGaugeValue`, `EncodeCounterValue` and `EncodeExemplarValue` now use
  fewer `as` casts in their implementation. This caught an issue where
  `EncodeGaugeValue` would not error when encoding some `u64`s that don't fit
  in a `i64`. See [PR 281].
- Filter out empty metric families, to match the go client. See [PR 279].
- `Histogram` now exposes `count()` and `sum()` methods when the `test-util`
  feature is enabled. See [PR 242].
- `Family` now exposes a `contains()` method when the `test-util` feature
  is enabled. See [PR 245].
- `Family` now exposes `len()` and `is_empty()` methods when the
  `test-util` feature is enabled. See [PR 246].

[PR 279]: prometheus/client_rust#279

[PR 281]: prometheus/client_rust#281

[PR 242]: prometheus/client_rust#242

[PR 245]: prometheus/client_rust#245

[PR 246]: prometheus/client_rust#246

[PR 281]: prometheus/client_rust#281

[PR 282]: prometheus/client_rust#282

### [`v0.24.0`](https://github.com/prometheus/client_rust/blob/HEAD/CHANGELOG.md#0240)

[Compare Source](prometheus/client_rust@v0.23.1...v0.24.0)

##### Added

- `EncodeLabelSet` is now implemented for tuples `(A: EncodeLabelSet, B: EncodeLabelSet)`.
  See [PR 257].

- `Family::get_or_create_owned` can access a metric in a labeled family. This
  method avoids the risk of runtime deadlocks at the expense of creating an
  owned type. See [PR 244].

- `impl<T: Collector> Collector for std::sync::Arc<T>`.
  See [PR 273].

[PR 244]: prometheus/client_rust#244

[PR 257]: prometheus/client_rust#257

[PR 273]: prometheus/client_rust#273

##### Changed

- `EncodeLabelSet::encode()` now accepts a mutable reference to its encoder parameter.
- Exemplar timestamps can now be passed, which are required for `convert_classic_histograms_to_nhcb: true`
  in Prometheus scraping. See [PR 276].

[PR 276]: prometheus/client_rust#276

### [`v0.23.1`](https://github.com/prometheus/client_rust/blob/HEAD/CHANGELOG.md#0231)

[Compare Source](prometheus/client_rust@v0.23.0...v0.23.1)

##### Changed

- `Histogram::new` now accepts an `IntoIterator` argument, rather than an `Iterator`.
  See [PR 243].

[PR 243]: prometheus/client_rust#243

### [`v0.23.0`](https://github.com/prometheus/client_rust/blob/HEAD/CHANGELOG.md#0230)

[Compare Source](prometheus/client_rust@v0.22.3...v0.23.0)

##### Changed

- `ConstCounter::new` now requires specifying the type of literal arguments, like this: `ConstCounter::new(42u64);`.
  See [PR 173].

- Update `prost` dependencies to `v0.12`.
  See [PR 198].

- Implement `Atomic<u64>` for `AtomicU64` for gauges.
  See [PR 226].

- Implement `EnableLabelValue` for `bool`.
  See [PR 237]

[PR 173]: prometheus/client_rust#173

[PR 198]: prometheus/client_rust#198

[PR 226]: prometheus/client_rust#226

[PR 237]: prometheus/client_rust#237

##### Added

- Support `i32`/`f32` for `Gauge` and `u32`/`f32` for `Counter`/`CounterWithExemplar`.
  See [PR 173] and [PR 216].

- Supoort `Arc<String>` for `EncodeLabelValue`.
  See [PR 217].

- Add `histogram::exponential_buckets_range`.
  See [PR 233].

- Added `get` method to `Family`.
  See [PR 234].

[PR 173]: prometheus/client_rust#173

[PR 216]: prometheus/client_rust#216

[PR 217]: prometheus/client_rust#217

[PR 233]: prometheus/client_rust#233

[PR 234]: prometheus/client_rust#234

##### Fixed

- Don't prepend `,` when encoding empty family label set.
  See [PR 175].

[PR 175]: prometheus/client_rust#175

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJ0eXBlL21pbm9yIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/towonel/pulls/7
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

2 participants