Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Atomic for usize #193

Open
link2xt opened this issue Apr 16, 2024 · 3 comments
Open

Implement Atomic for usize #193

link2xt opened this issue Apr 16, 2024 · 3 comments

Comments

@link2xt
Copy link

link2xt commented Apr 16, 2024

I want to store usize in a gauge metric without conveting it to u64, but Atomic trait is not implemented for usize:
https://docs.rs/prometheus-client/0.22.2/prometheus_client/metrics/gauge/trait.Atomic.html

Because of this Gauge::<usize, AtomicUsize>::default(). Is there any reason for not supporting it? Would it require too high MSRV?

@mxinden
Copy link
Member

mxinden commented Apr 16, 2024

without conveting it to u64

Note that gauge::Atomic is also not implemented for u64, but only i64. This is due to the OpenMetrics Protobuf definition requiring a value to be either i64 or f64, not u64:

https://github.com/OpenObservability/OpenMetrics/blob/1386544931307dff279688f332890c31b6c5de36/proto/openmetrics_data_model.proto#L105

In other words, say that you provide a u64::MAX to Gauge::set, what should prometheus-client do? It can't store it in an i64. It can't store it in an f64 without loss.

Does that make sense?

@link2xt
Copy link
Author

link2xt commented Apr 17, 2024

In other words, say that you provide a u64::MAX to Gauge::set, what should prometheus-client do? It can't store it in an i64. It can't store it in an f64 without loss.

If it is encoded in text format, just write it out as text. There are no such restrictions in text format, any integer can be encoded there even if it does not fit 128 bits. If it is not supported by the receiver, it is the receiver problem.
If it is encoded in protobuf, also does not matter, could be not encoded or encoded as i64::MAX then.

Currently in the application I have to do this:

metrics.heartbeat_token_count.set(tokens.len() as i64);

Metrics are then exported as text. This as i64 should not be necessary for a gauge that tracks some structure size and is then encoded into text.

@bobrik
Copy link
Contributor

bobrik commented Sep 21, 2024

I opened #226 to add u64 that generates an error if u64::MAX is encoded into protobuf.

A similar thing can be done for usize.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants