@@ -229,33 +229,36 @@ fn extract_universal_tags(
229
229
tags
230
230
}
231
231
232
- /// Returns the unit of the provided metric. Defaults to None.
232
+ /// Returns the unit of the provided metric.
233
+ ///
234
+ /// For known measurements, this returns `Some(MetricUnit)`, which can also include
235
+ /// `Some(MetricUnit::None)`. For unknown measurement names, this returns `None`.
233
236
#[ cfg( feature = "processing" ) ]
234
- fn get_metric_measurement_unit ( metric : & str ) -> MetricUnit {
237
+ fn get_metric_measurement_unit ( metric : & str ) -> Option < MetricUnit > {
235
238
match metric {
236
239
// Web
237
- "fcp" => MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ,
238
- "lcp" => MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ,
239
- "fid" => MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ,
240
- "fp" => MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ,
241
- "ttfb" => MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ,
242
- "ttfb.requesttime" => MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ,
243
- "cls" => MetricUnit :: None ,
240
+ "fcp" => Some ( MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ) ,
241
+ "lcp" => Some ( MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ) ,
242
+ "fid" => Some ( MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ) ,
243
+ "fp" => Some ( MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ) ,
244
+ "ttfb" => Some ( MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ) ,
245
+ "ttfb.requesttime" => Some ( MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ) ,
246
+ "cls" => Some ( MetricUnit :: None ) ,
244
247
245
248
// Mobile
246
- "app_start_cold" => MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ,
247
- "app_start_warm" => MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ,
248
- "frames_total" => MetricUnit :: None ,
249
- "frames_slow" => MetricUnit :: None ,
250
- "frames_frozen" => MetricUnit :: None ,
249
+ "app_start_cold" => Some ( MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ) ,
250
+ "app_start_warm" => Some ( MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ) ,
251
+ "frames_total" => Some ( MetricUnit :: None ) ,
252
+ "frames_slow" => Some ( MetricUnit :: None ) ,
253
+ "frames_frozen" => Some ( MetricUnit :: None ) ,
251
254
252
255
// React-Native
253
- "stall_count" => MetricUnit :: None ,
254
- "stall_total_time" => MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ,
255
- "stall_longest_time" => MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ,
256
+ "stall_count" => Some ( MetricUnit :: None ) ,
257
+ "stall_total_time" => Some ( MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ) ,
258
+ "stall_longest_time" => Some ( MetricUnit :: Duration ( DurationUnit :: MilliSecond ) ) ,
256
259
257
260
// Default
258
- _ => MetricUnit :: None ,
261
+ _ => None ,
259
262
}
260
263
}
261
264
@@ -316,7 +319,7 @@ fn extract_transaction_metrics_inner(
316
319
317
320
// Measurements
318
321
if let Some ( measurements) = event. measurements . value ( ) {
319
- for ( measurement_name , annotated) in measurements. iter ( ) {
322
+ for ( name , annotated) in measurements. iter ( ) {
320
323
let measurement = match annotated. value ( ) {
321
324
Some ( m) => m,
322
325
None => continue ,
@@ -328,19 +331,22 @@ fn extract_transaction_metrics_inner(
328
331
} ;
329
332
330
333
let mut tags_for_measurement = tags. clone ( ) ;
331
- if let Some ( rating) = get_measurement_rating ( measurement_name , value) {
334
+ if let Some ( rating) = get_measurement_rating ( name , value) {
332
335
tags_for_measurement. insert ( "measurement_rating" . to_owned ( ) , rating) ;
333
336
}
334
337
335
- let unit = match measurement. unit . value ( ) {
336
- Some ( unit) => * unit,
337
- None => get_metric_measurement_unit ( measurement_name) ,
338
- } ;
338
+ let stated_unit = measurement. unit . value ( ) . copied ( ) ;
339
+ let default_unit = get_metric_measurement_unit ( name) ;
340
+ if let ( Some ( default) , Some ( stated) ) = ( default_unit, stated_unit) {
341
+ if default != stated {
342
+ relay_log:: error!( "unit mismatch on measurements.{}: {}" , name, stated) ;
343
+ }
344
+ }
339
345
340
346
push_metric ( Metric :: new_mri (
341
347
METRIC_NAMESPACE ,
342
- format_args ! ( "measurements.{}" , measurement_name ) ,
343
- unit ,
348
+ format_args ! ( "measurements.{}" , name ) ,
349
+ stated_unit . or ( default_unit ) . unwrap_or_default ( ) ,
344
350
MetricValue :: Distribution ( value) ,
345
351
unix_timestamp,
346
352
tags_for_measurement,
0 commit comments