6
6
import java .math .BigDecimal ;
7
7
import java .util .Arrays ;
8
8
import java .util .Collection ;
9
+ import java .util .HashMap ;
9
10
import java .util .LinkedHashMap ;
10
11
import java .util .Map ;
12
+ import java .util .Set ;
11
13
import java .util .stream .Stream ;
12
14
13
15
public interface RawMetric {
@@ -26,24 +28,27 @@ static RawMetric create(String name, Map<String, String> labels, BigDecimal valu
26
28
27
29
static Stream <MetricSnapshot > groupIntoSnapshot (Collection <RawMetric > rawMetrics ) {
28
30
Map <String , Gauge > map = new LinkedHashMap <>();
31
+ Map <String , String []> gaugeLabels = new HashMap <>();
29
32
for (RawMetric m : rawMetrics ) {
30
33
var lbls = m .labels ().keySet ()
31
34
.stream ()
32
35
.map (PrometheusNaming ::sanitizeLabelName )
33
36
.toArray (String []::new );
34
- var lblVals = Arrays .stream (lbls )
37
+ var lblVals = m .labels ().keySet ()
38
+ .stream ()
35
39
.map (l -> m .labels ().get (l ))
36
40
.toArray (String []::new );
37
41
var sanitizedName = PrometheusNaming .sanitizeMetricName (m .name ());
38
42
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
+ }
45
47
);
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
+ }
47
52
}
48
53
return map .values ().stream ().map (Gauge ::collect );
49
54
}
0 commit comments