66import java .math .BigDecimal ;
77import java .util .Arrays ;
88import java .util .Collection ;
9+ import java .util .HashMap ;
910import java .util .LinkedHashMap ;
1011import java .util .Map ;
12+ import java .util .Set ;
1113import java .util .stream .Stream ;
1214
1315public interface RawMetric {
@@ -26,24 +28,27 @@ static RawMetric create(String name, Map<String, String> labels, BigDecimal valu
2628
2729 static Stream <MetricSnapshot > groupIntoSnapshot (Collection <RawMetric > rawMetrics ) {
2830 Map <String , Gauge > map = new LinkedHashMap <>();
31+ Map <String , String []> gaugeLabels = new HashMap <>();
2932 for (RawMetric m : rawMetrics ) {
3033 var lbls = m .labels ().keySet ()
3134 .stream ()
3235 .map (PrometheusNaming ::sanitizeLabelName )
3336 .toArray (String []::new );
34- var lblVals = Arrays .stream (lbls )
37+ var lblVals = m .labels ().keySet ()
38+ .stream ()
3539 .map (l -> m .labels ().get (l ))
3640 .toArray (String []::new );
3741 var sanitizedName = PrometheusNaming .sanitizeMetricName (m .name ());
3842 var gauge = map .computeIfAbsent (
39- sanitizedName ,
40- n -> Gauge .builder ()
41- .name (sanitizedName )
42- .help (sanitizedName )
43- .labelNames (lbls )
44- .build ()
43+ sanitizedName , n -> {
44+ gaugeLabels .put (n , lbls );
45+ return Gauge .builder ().name (n ).help (n ).labelNames (lbls ).build ();
46+ }
4547 );
46- gauge .labelValues (lblVals ).set (m .value ().doubleValue ());
48+ if (Arrays .equals (lbls , gaugeLabels .get (sanitizedName ))) {
49+ //using labels of first registered gauge, if not fit - skipping
50+ gauge .labelValues (lblVals ).set (m .value ().doubleValue ());
51+ }
4752 }
4853 return map .values ().stream ().map (Gauge ::collect );
4954 }
0 commit comments