-
Notifications
You must be signed in to change notification settings - Fork 1
refactor!: make global core optional, add derive macro, add MetricsGroup
and MetricsGroupSet
traits, reoganize modules
#15
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
Conversation
Documentation for this PR has been generated and is available at: https://n0-computer.github.io/iroh-metrics/pr/15/docs/iroh_metrics/ Last updated: 2025-04-14T10:49:00Z |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just a small typo comment, this is great stuff!
src/base.rs
Outdated
if let Some(counter) = item.downcast_ref::<Counter>() { | ||
sub_registry.register(metric, counter.description, counter.counter.clone()); | ||
} | ||
if let Some(gauge) = item.downcast_ref::<Gauge>() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
Thanks for the review! One thing I'm wondering, while we're already doing breaking API changes: To me the trait |
Yeah, that makes sense, at least it should have been a plural like |
I went ahead with the rename: |
@Arqu @dignifiedquire |
I don't see a reason not to, we already decided we want to move forward with it. |
LFG |
Make it consistent how the `metrics` feature flag is applied to metrics methods.
MetricsGroup
and MetricsGroupSet
traits, reoganize modules
## Description Depends on n0-computer/net-tools#20 Until now, we were using a superglobal static `iroh_metrics::core::Core` struct to collect metrics into. This allowed us to use macros to track metrics from anywhere in the codebase. However, this also made it impossible to collect metrics *per endpoint*, which is what you want usually as soon as you have more than one endpoint in your app. This PR builds on n0-computer/iroh-metrics#15, n0-computer/iroh-metrics#22, and n0-computer/iroh-metrics#23. It removes the global metrics collection from all crates in the iroh repository. Instead, we now create and pass metrics collector structs to all places where we need to collect metrics. This PR disables the `static_core` feature from iroh-metrics, which means the macros for superglobal metrics collection are not available anymore. This is good, because otherwise we could easily miss metrics not tracked onto the proper metrics collector. This PR also updates iroh-dns-server and iroh-relay to use manual metrics collection. While this means that we have to pass our metrics structs to more places, it also makes metrics collection more visible, and we can now also split the metrics structs further easily if we want to separate concerns more. This PR should not change anything apart from metrics collection. Most places are straightforward conversions from the macros to methods on the metrics collectors. At a few places, logic was changed slightly to move metrics collection a layer up to save a few clones. ## Breaking Changes * All metrics structs (`iroh::metrics::{MagicsockMetrics, PortmapMetrics, NetReportMetrics}`) now implement `MetricsGroup` from the new version `0.34` of `iroh-metrics` and no longer implement traits from `[email protected]`. * Metrics are no longer registered onto the static superglobal `Core`. `iroh` does not use `static_core` feature of `iroh-metrics`. Metrics are now exposed from the subsystems that track them, see e.g. `Endpoint::metrics`. Several methods now take a `Metrics` argument. You can always pass `Default::default` if you don't want to unify metrics tracking with other sections. #### `iroh` * `iroh::metrics::{MagicsockMetrics, NetReportMetrics, PortmapMetrics}` all are now marked `non_exhaustive`, and implement `iroh_metrics::MetricsGroup` from `[email protected]` and no longer implement `iroh_metrics::Metric` from `[email protected]`. They also no longer implement `Clone` (put them into an `Arc` for cloning instead). * `iroh::net_report::Client::new` now takes `iroh::net_report::metrics::Metrics` as forth argument #### `iroh-dns-server` * `iroh_dns_server::server::Server::spawn` now takes `Metrics` as third argument * `iroh_dns_server::ZoneStore::persistent` now takes `Metrics` as third argument * `iroh_dns_server::ZoneStore::in_memory` now takes `Metrics` as third argument * `iroh_dns_server::ZoneStore::new` now takes `Metrics` as third argument * `iroh_dns_server::state::AppState` now has a public `metrics: Metrics` field * `iroh_dns_server::dns::DnsHandler::new` now takes `Metrics` as third argument * function `iroh_dns_server::metrics::init_metrics` is removed #### `iroh-relay` * `iroh_relay::metrics::{StunMetrics, Metrics}` all are now marked `non_exhaustive`, and implement `iroh_metrics::MetricsGroup` from `[email protected]` and no longer implement `iroh_metrics::Metric` from `[email protected]`. They also no longer implement `Clone` (put them into an `Arc` for cloning instead). ## Notes & open questions <!-- Any notes, remarks or open questions you have to make about the PR. --> ## Change checklist <!-- Remove any that are not relevant. --> - [x] Self-review. - [x] Documentation updates following the [style guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text), if relevant. - [x] Tests if relevant. - [x] All breaking changes documented. - [x] List all breaking changes in the above "Breaking Changes" section. - [x] Open an issue or PR on any number0 repos that are affected by this breaking change. Give guidance on how the updates should be handled or do the actual updates themselves. - [x] [`iroh-gossip`](https://github.com/n0-computer/iroh-gossip) - n0-computer/iroh-gossip#58 - [x] [`iroh-blobs`](https://github.com/n0-computer/iroh-blobs) - n0-computer/iroh-blobs#85 - [x] [`iroh-docs`](https://github.com/n0-computer/iroh-docs) - n0-computer/iroh-docs#41 --------- Co-authored-by: dignifiedquire <[email protected]>
## Description Adapts iroh-metrics for n0-computer/iroh-metrics#15 and n0-computer/iroh#3262 Depends on n0-computer/iroh#3262 ## Breaking Changes * `metrics::Metrics` now implements `MetricsGroup` from the ì[email protected]` * Metrics are no longer tracked into the `static_core` from `iroh-metrics`, but instead are tracked per `Gossip` and exposed via `Gossip::metrics` * `proto::state::State::handle` now takes `Option<&Metrics>` as new 4th parameter ## Notes & open questions <!-- Any notes, remarks or open questions you have to make about the PR. --> ## Change checklist - [x] Self-review. - [x] Documentation updates following the [style guide](https://rust-lang.github.io/rfcs/1574-more-api-documentation-conventions.html#appendix-a-full-conventions-text), if relevant. - [x] Tests if relevant. - [x] All breaking changes documented.
Description
Core
optional behind the newstatic_core
feature. The macros to modify metrics tracked in the static core,inc
,inc_by
, etc are also behind this feature flag now.Metric
trait dyn-compatible, and renames it toMetricsGroup
. Thename
method now takes&self
. Adds aregister(&self, registry: &mut Registry)
method to theMetric
trait to register already-constructed metrics to a prometheus-client registry. Thenew
method is moved to a new traitMetricsGroupExt
which is auto-impl'd for all types that implMetricsGroup
.Metric
trait that is implemented onGauge
andCounter
to provide a common interface.Iterable
that works similar tostruct_iterable
, but returns an iterator over&dyn Metric
and does not allocate for iteration. Removes thestruct_iterable
dependency.MetricsGroup
that expands to theIterable
impl and also implementsDefault
by callingFieldType::new(description)
for each field, wheredescription
is the first line of the field's doc comment, or a custom string set via#[metrics(description = "my description")]
. Also implementsMetricsGroup
, with aname
of either the struct name converted to camel_case, or a custom name set via#[metrics_group(name = "my_name")]
MetricsGroupSet
that can be implemented on structs that contain multiple structs which each implementMetric
. Requires a methodgroups(&self) -> impl Iterator<Item = &dyn MetricsGroup>
to iterate over all contained metric structs. Provides a methodregister(&self, registry: &mut Registry)
which usesiter
to register all contained metrics onto a prometheus-client registry. Provides a methoditer(&self) -> impl Iterator<Item = (&'static str, &dyn MetricItem>
to iterate over all metric items from all contained groups.start_metrics_service
,start_metrics_dumper
,start_metrics_exporter
) to take aimpl MetricsSource
as additional required argument. When thestatic_core
feature is enabled, you can pass the zerosizedGlobalRegistry
struct, which impls MetricsSource and exposes all metrics contained in the staticCore
. When not using the static core, you can either pass aRegistry
or anArc<RwLock<Registry>>
to run the services for a regular registry created in application code.Breaking Changes
Most import paths changed, but apart from that it is mostly API additions. Migration should be straightforward.
iroh_metrics::core::{Counter, Gauge}
are nowiroh_metrics::{Counter, Gauge}
iroh_metrics::core::Metric
is nowiroh_metrics::MetricsGroup
.MetricsGroup::name
now takes&self
as argumentMetricsGroup::new
is removed.metrics::{start_metrics_server, start_metrics_exporter, start_metrics_dumper}
is nowservice::{start_metrics_server, start_metrics_exporter, start_metrics_dumper}
. They all take aregistry
argument, which takes anyT: impl MetricSource
. For the old behavior of using the staticCore
, pass the zero-sized structstatic_core::GlobalRegistry
.iroh_metrics::core::Core
is now atiroh_metrics::static_core::Core
and behind thestatic_core
feature flag (not enabled by default)inc
,inc_by
,set
,dec
,dec_by
are now behind thestatic_core
feature flag (not enabled by default)iroh_metrics::core
module is removedstruct_iterable::Iterable
is no longer exported fromiroh-metrics
, and is no longer a supertrait ofMetricsGroup
MetricsGroup
now hasiroh_metrics::Iterable
andiroh_metrics::IntoIterable
supertraits. They can be implemented manually, but it is recommended to use the newMetricsGroup
orIterable
derive macros exported fromiroh_metrics
. See their docs for details.iroh_metrics::MetricsGroup
derive macro that includes the functionality previously provided bystruct_iterable
.Notes & open questions
Change checklist