@@ -241,27 +241,24 @@ Raises:
241
241
Count :: integer ().
242
242
observe_n (Registry , Name , LabelValues , Value , Count ) when is_integer (Value ), is_integer (Count ) ->
243
243
Key = key (Registry , Name , LabelValues ),
244
- case ets :lookup (? TABLE , Key ) of
245
- [Metric ] ->
246
- BucketPosition = calculate_histogram_bucket_position (Metric , Value ),
247
- ets :update_counter (
248
- ? TABLE ,
249
- Key ,
250
- [
251
- {? ISUM_POS , Value * Count },
252
- {? BUCKETS_START + BucketPosition , Count }
253
- ]
254
- );
255
- [] ->
244
+ try ets :lookup_element (? TABLE , Key , ? BOUNDS_POS ) of
245
+ Buckets ->
246
+ BucketPosition = prometheus_buckets :position (Buckets , Value ),
247
+ Spec = [{? ISUM_POS , Value * Count }, {? BUCKETS_START + BucketPosition , Count }],
248
+ ets :update_counter (? TABLE , Key , Spec )
249
+ catch
250
+ error :badarg ->
256
251
insert_metric (Registry , Name , LabelValues , Value , Count , fun observe_n /5 )
257
252
end ,
258
253
ok ;
259
254
observe_n (Registry , Name , LabelValues , Value , Count ) when is_float (Value ), is_integer (Count ) ->
260
255
Key = key (Registry , Name , LabelValues ),
261
- case ets :lookup (? TABLE , Key ) of
262
- [Metric ] ->
263
- fobserve_impl (Key , Metric , Value , Count );
264
- [] ->
256
+ try ets :lookup_element (? TABLE , Key , ? BOUNDS_POS ) of
257
+ Buckets ->
258
+ BucketPosition = prometheus_buckets :position (Buckets , Value ),
259
+ fobserve_impl (Key , Buckets , BucketPosition , Value , Count )
260
+ catch
261
+ error :badarg ->
265
262
insert_metric (Registry , Name , LabelValues , Value , Count , fun observe_n /5 )
266
263
end ;
267
264
observe_n (_Registry , _Name , _LabelValues , Value , Count ) when is_number (Value ) ->
@@ -445,7 +442,6 @@ Raises:
445
442
LabelValues :: prometheus_metric :label_values ().
446
443
value (Registry , Name , LabelValues ) ->
447
444
MF = prometheus_metric :check_mf_exists (? TABLE , Registry , Name , LabelValues ),
448
-
449
445
RawValues = [
450
446
ets :lookup (? TABLE , {Registry , Name , LabelValues , Scheduler })
451
447
|| Scheduler <- schedulers_seq ()
@@ -542,11 +538,6 @@ insert_metric(Registry, Name, LabelValues, Value, Count, CB) ->
542
538
insert_placeholders (Registry , Name , LabelValues ),
543
539
CB (Registry , Name , LabelValues , Value , Count ).
544
540
545
- fobserve_impl (Key , Metric , Value , Count ) ->
546
- Buckets = metric_buckets (Metric ),
547
- BucketPos = calculate_histogram_bucket_position (Metric , Value ),
548
- fobserve_impl (Key , Buckets , BucketPos , Value , Count ).
549
-
550
541
fobserve_impl (Key , Buckets , BucketPos , Value , Count ) ->
551
542
ets :select_replace (? TABLE , generate_select_replace (Key , Buckets , BucketPos , Value , Count )).
552
543
@@ -558,33 +549,33 @@ insert_placeholders(Registry, Name, LabelValues) ->
558
549
prometheus_time :maybe_convert_to_native (DU , Bucket )
559
550
end ,
560
551
BoundCounters = lists :duplicate (length (MFBuckets ), 0 ),
552
+ Buckets = list_to_tuple (lists :map (Fun , MFBuckets )),
561
553
MetricSpec =
562
- [key (Registry , Name , LabelValues ), lists :map (Fun , MFBuckets ), 0 , 0 ] ++
563
- BoundCounters ,
554
+ [key (Registry , Name , LabelValues ), Buckets , 0 , 0 | BoundCounters ],
564
555
ets :insert_new (? TABLE , list_to_tuple (MetricSpec )).
565
556
566
- calculate_histogram_bucket_position (Metric , Value ) ->
567
- Buckets = metric_buckets (Metric ),
568
- prometheus_buckets :position (Buckets , Value ).
569
-
570
557
generate_select_replace (Key , Bounds , BucketPos , Value , Count ) ->
571
558
BoundPlaceholders = gen_query_bound_placeholders (Bounds ),
572
- HistMatch = list_to_tuple ([Key , '$2' , '$3' , '$4' ] ++ BoundPlaceholders ),
559
+ HistMatch = list_to_tuple ([Key , '$2' , '$3' , '$4' | BoundPlaceholders ] ),
573
560
BucketUpdate =
574
561
lists :sublist (BoundPlaceholders , BucketPos ) ++
575
- [{'+' , gen_query_placeholder (? BUCKETS_START + BucketPos ), Count }] ++
576
- lists :nthtail (BucketPos + 1 , BoundPlaceholders ),
577
- HistUpdate = list_to_tuple ([{Key }, '$2' , '$3' , {'+' , '$4' , Value * Count }] ++ BucketUpdate ),
562
+ [
563
+ {'+' , gen_query_placeholder (? BUCKETS_START + BucketPos ), Count }
564
+ | lists :nthtail (BucketPos + 1 , BoundPlaceholders )
565
+ ],
566
+ HistUpdate = list_to_tuple ([{Key }, '$2' , '$3' , {'+' , '$4' , Value * Count } | BucketUpdate ]),
578
567
[{HistMatch , [], [{HistUpdate }]}].
579
568
580
- buckets_seq (Buckets ) ->
581
- lists :seq (? BUCKETS_START , ? BUCKETS_START + length (Buckets ) - 1 ).
569
+ buckets_seq (Buckets ) when is_list (Buckets ) ->
570
+ lists :seq (? BUCKETS_START , ? BUCKETS_START + length (Buckets ) - 1 );
571
+ buckets_seq (Buckets ) when is_tuple (Buckets ) ->
572
+ lists :seq (? BUCKETS_START , ? BUCKETS_START + tuple_size (Buckets ) - 1 ).
582
573
583
574
generate_update_spec (Buckets ) ->
584
575
[{Index , 0 } || Index <- buckets_seq (Buckets )].
585
576
586
577
gen_query_placeholder (Index ) ->
587
- list_to_atom (" $ " ++ integer_to_list (Index )).
578
+ list_to_atom ([ $$ | integer_to_list (Index )] ).
588
579
589
580
gen_query_bound_placeholders (Buckets ) ->
590
581
[gen_query_placeholder (Index ) || Index <- buckets_seq (Buckets )].
@@ -593,9 +584,9 @@ augment_counters([Start | Counters]) ->
593
584
augment_counters (Counters , [Start ], Start ).
594
585
595
586
augment_counters ([], LAcc , _CAcc ) ->
596
- LAcc ;
587
+ lists : reverse ( LAcc ) ;
597
588
augment_counters ([Counter | Counters ], LAcc , CAcc ) ->
598
- augment_counters (Counters , LAcc ++ [CAcc + Counter ], CAcc + Counter ).
589
+ augment_counters (Counters , [CAcc + Counter | LAcc ], CAcc + Counter ).
599
590
600
591
metric_buckets (Metric ) ->
601
592
element (? BOUNDS_POS , Metric ).
@@ -606,7 +597,7 @@ reduce_buckets_counters(Metrics) ->
606
597
sub_tuple_to_list (
607
598
Metric ,
608
599
? BUCKETS_START ,
609
- ? BUCKETS_START + length (metric_buckets (Metric ))
600
+ ? BUCKETS_START + tuple_size (metric_buckets (Metric ))
610
601
)
611
602
|| Metric <- Metrics
612
603
],
@@ -636,17 +627,17 @@ create_histogram_metric(CLabels, Labels, DU, Bounds, LabelValues, [ISum, FSum |
636
627
637
628
load_all_values (Registry , Name , Bounds ) ->
638
629
BoundPlaceholders = gen_query_bound_placeholders (Bounds ),
639
- QuerySpec = [{Registry , Name , '$1' , '_' }, '_' , '$3' , '$4' ] ++ BoundPlaceholders ,
630
+ QuerySpec = [{Registry , Name , '$1' , '_' }, '_' , '$3' , '$4' | BoundPlaceholders ] ,
640
631
ets :match (? TABLE , list_to_tuple (QuerySpec )).
641
632
642
633
deregister_select (Registry , Name , Buckets ) ->
643
634
BoundCounters = lists :duplicate (length (Buckets ), '_' ),
644
- MetricSpec = [{Registry , Name , '_' , '_' }, '_' , '_' , '_' ] ++ BoundCounters ,
635
+ MetricSpec = [{Registry , Name , '_' , '_' }, '_' , '_' , '_' | BoundCounters ] ,
645
636
[{list_to_tuple (MetricSpec ), [], [true ]}].
646
637
647
638
delete_metrics (Registry , Buckets ) ->
648
639
BoundCounters = lists :duplicate (length (Buckets ), '_' ),
649
- MetricSpec = [{Registry , '_' , '_' , '_' }, '_' , '_' , '_' ] ++ BoundCounters ,
640
+ MetricSpec = [{Registry , '_' , '_' , '_' }, '_' , '_' , '_' | BoundCounters ] ,
650
641
ets :match_delete (? TABLE , list_to_tuple (MetricSpec )).
651
642
652
643
sub_tuple_to_list (Tuple , Pos , Size ) when Pos < Size ->
0 commit comments