@@ -4,7 +4,6 @@ use std::sync::{Arc, RwLock};
44use prometheus:: IntGauge ;
55use prometheus:: { labels, Histogram , IntCounterVec } ;
66use slog:: info;
7- use slog:: warn;
87
98use crate :: components:: metrics:: { counter_with_labels, gauge_with_labels} ;
109use 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