Skip to content

Commit 4598125

Browse files
authored
metrics: keep the latest metric registration (#5781)
1 parent 4e41104 commit 4598125

File tree

1 file changed

+21
-71
lines changed

1 file changed

+21
-71
lines changed

graph/src/components/metrics/registry.rs

Lines changed: 21 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use std::sync::{Arc, RwLock};
44
use prometheus::IntGauge;
55
use prometheus::{labels, Histogram, IntCounterVec};
66
use slog::info;
7-
use slog::warn;
87

98
use crate::components::metrics::{counter_with_labels, gauge_with_labels};
109
use crate::prelude::Collector;
@@ -123,82 +122,33 @@ impl MetricsRegistry {
123122
}
124123
}
125124

126-
pub fn register(&self, name: &str, c: Box<dyn Collector>) {
127-
let err = match self.registry.register(c).err() {
128-
None => {
129-
self.registered_metrics.inc();
130-
return;
131-
}
132-
Some(err) => {
133-
self.register_errors.inc();
134-
err
135-
}
136-
};
137-
match err {
138-
PrometheusError::AlreadyReg => {
139-
error!(
140-
self.logger,
141-
"registering metric [{}] failed because it was already registered", name,
142-
);
143-
}
144-
PrometheusError::InconsistentCardinality { expect, got } => {
145-
error!(
146-
self.logger,
147-
"registering metric [{}] failed due to inconsistent caridinality, expected = {} got = {}",
148-
name,
149-
expect,
150-
got,
151-
);
152-
}
153-
PrometheusError::Msg(msg) => {
154-
error!(
155-
self.logger,
156-
"registering metric [{}] failed because: {}", name, msg,
157-
);
158-
}
159-
PrometheusError::Io(err) => {
160-
error!(
161-
self.logger,
162-
"registering metric [{}] failed due to io error: {}", name, err,
163-
);
164-
}
165-
PrometheusError::Protobuf(err) => {
166-
error!(
167-
self.logger,
168-
"registering metric [{}] failed due to protobuf error: {}", name, err
169-
);
170-
}
171-
};
172-
}
173-
174-
pub fn register_or_replace<T>(&self, name: &str, c: Box<T>)
125+
/// Adds the metric to the registry.
126+
///
127+
/// If the metric is a duplicate, it replaces a previous registration.
128+
fn register<T>(&self, name: &str, collector: Box<T>)
175129
where
176130
T: Collector + Clone + 'static,
177131
{
178-
match self.registry.register(c.clone()) {
132+
let logger = self.logger.new(o!("metric_name" => name.to_string()));
133+
let mut result = self.registry.register(collector.clone());
134+
135+
if matches!(result, Err(PrometheusError::AlreadyReg)) {
136+
info!(logger, "Resolving duplicate metric registration");
137+
138+
// Since the current metric is a duplicate,
139+
// we can use it to unregister the previous registration.
140+
self.unregister(collector.clone());
141+
142+
result = self.registry.register(collector);
143+
}
144+
145+
match result {
179146
Ok(()) => {
180-
info!(self.logger, "metric [{}] successfully registered", name);
147+
info!(logger, "Successfully registered a new metric");
181148
self.registered_metrics.inc();
182149
}
183-
Err(PrometheusError::AlreadyReg) => {
184-
warn!(
185-
self.logger,
186-
"metric [{}] is already registered; \
187-
the previous registration will be dropped so that the new metric can be used",
188-
name,
189-
);
190-
191-
// Since the current metric is a duplicate,
192-
// we can use it to unregister the previous registration.
193-
self.unregister(c.clone());
194-
195-
self.register(name, c);
196-
}
197150
Err(err) => {
198-
error!(
199-
self.logger,
200-
"registering metric [{}] failed: {:#}", name, err,
201-
);
151+
error!(logger, "Failed to register a new metric"; "error" => format!("{err:#}"));
202152
self.register_errors.inc();
203153
}
204154
}
@@ -560,7 +510,7 @@ impl MetricsRegistry {
560510
.collect(),
561511
);
562512
let gauge = IntGauge::with_opts(opts)?;
563-
self.register_or_replace(name.as_ref(), Box::new(gauge.clone()));
513+
self.register(name.as_ref(), Box::new(gauge.clone()));
564514
Ok(gauge)
565515
}
566516
}

0 commit comments

Comments
 (0)