@@ -4,7 +4,6 @@ use std::sync::{Arc, RwLock};
4
4
use prometheus:: IntGauge ;
5
5
use prometheus:: { labels, Histogram , IntCounterVec } ;
6
6
use slog:: info;
7
- use slog:: warn;
8
7
9
8
use crate :: components:: metrics:: { counter_with_labels, gauge_with_labels} ;
10
9
use crate :: prelude:: Collector ;
@@ -123,82 +122,33 @@ impl MetricsRegistry {
123
122
}
124
123
}
125
124
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 > )
175
129
where
176
130
T : Collector + Clone + ' static ,
177
131
{
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 {
179
146
Ok ( ( ) ) => {
180
- info ! ( self . logger, "metric [{}] successfully registered" , name ) ;
147
+ info ! ( logger, "Successfully registered a new metric" ) ;
181
148
self . registered_metrics . inc ( ) ;
182
149
}
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
- }
197
150
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:#}" ) ) ;
202
152
self . register_errors . inc ( ) ;
203
153
}
204
154
}
@@ -560,7 +510,7 @@ impl MetricsRegistry {
560
510
. collect ( ) ,
561
511
) ;
562
512
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 ( ) ) ) ;
564
514
Ok ( gauge)
565
515
}
566
516
}
0 commit comments