7
7
import ru .cinimex .exporter .mq .pcf .PCFElementRow ;
8
8
9
9
import java .util .ArrayList ;
10
+ import java .util .Arrays ;
10
11
import java .util .HashMap ;
11
12
import java .util .List ;
13
+ import java .util .Map ;
14
+ import java .util .Set ;
15
+
16
+ import static ru .cinimex .exporter .prometheus .metrics .MetricsReference .getAdditionalMqObjectMetricsReference ;
17
+ import static ru .cinimex .exporter .prometheus .metrics .MetricManagerUtils .*;
12
18
13
19
/**
14
20
* Class is used to manage work of all metrics.
@@ -25,6 +31,7 @@ public class MetricsManager {
25
31
*/
26
32
public static void initMetrics (List <PCFElement > elements , List <MQObject .MQType > types ) {
27
33
logger .debug ("Preparing to initialize metrics. {} metrics will be received from MQ topics and {} metrics will be received via direct PCF commands." , elements .size (), types .size ());
34
+ String logString = " created! Name: {}, description: {}, labels: {}." ;
28
35
metrics = new HashMap <>();
29
36
for (PCFElement element : elements ) {
30
37
for (PCFElementRow row : element .getRows ()) {
@@ -33,32 +40,32 @@ public static void initMetrics(List<PCFElement> elements, List<MQObject.MQType>
33
40
ArrayList <String > labels = new ArrayList <>();
34
41
labels .add (Labels .QMGR_NAME .name ());
35
42
MetricInterface metric ;
36
- if (element .requiresMQObject ()) {
37
- labels .add (Labels .MQ_OBJECT_NAME .name ());
38
- }
43
+ if (element .requiresMQObject ()) labels .add (Labels .MQ_OBJECT_NAME .name ());
39
44
switch (metricType ) {
40
45
case SIMPLE_GAUGE :
41
- metric = new SimpleGauge (metricName , row .getRowDesc (), labels .stream (). toArray (String []:: new ));
46
+ metric = new SimpleGauge (metricName , row .getRowDesc (), labels .toArray (new String [0 ] ));
42
47
metrics .put (metricName , metric );
43
- logger .trace ("New gauge created! Name: {}, description: {}, labels: {}." , metricName , row .getRowDesc (), labels );
48
+ logger .trace ("New " + "gauge" + logString , metricName , row .getRowDesc (), labels );
44
49
break ;
45
50
case SIMPLE_COUNTER :
46
- metric = new SimpleCounter (metricName , row .getRowDesc (), labels .stream (). toArray (String []:: new ));
51
+ metric = new SimpleCounter (metricName , row .getRowDesc (), labels .toArray (new String [0 ] ));
47
52
metrics .put (metricName , metric );
48
- logger .trace ("New counter created! Name: {}, description: {}, labels: {}." , metricName , row .getRowDesc (), labels );
53
+ logger .trace ("New counter " + logString , metricName , row .getRowDesc (), labels );
49
54
break ;
50
55
case EXTREME_GAUGE_MAX :
51
- metric = new ExtremeGauge (metricName , row .getRowDesc (), true , labels .stream (). toArray (String []:: new ));
56
+ metric = new ExtremeGauge (metricName , row .getRowDesc (), true , labels .toArray (new String [0 ] ));
52
57
metrics .put (metricName , metric );
53
- logger .trace ("New extreme gauge created! Name: {}, description: {}, labels: {}." , metricName , row .getRowDesc (), labels );
58
+ logger .trace ("New extreme gauge" + logString , metricName , row .getRowDesc (), labels );
54
59
break ;
55
60
case EXTREME_GAUGE_MIN :
56
- metric = new ExtremeGauge (metricName , row .getRowDesc (), false , labels .stream (). toArray (String []:: new ));
61
+ metric = new ExtremeGauge (metricName , row .getRowDesc (), false , labels .toArray (new String [0 ] ));
57
62
metrics .put (metricName , metric );
58
- logger .trace ("New extreme gauge created! Name: {}, description: {}, labels: {}." , metricName , row .getRowDesc (), labels );
63
+ logger .trace ("New extreme gauge" + logString , metricName , row .getRowDesc (), labels );
59
64
break ;
60
65
default :
61
- logger .error ("Error during metrics initialization: Unknown metric type! Make sure it is one " + "of: {}" , MetricsReference .Metric .Type .values ());
66
+ logger .error (
67
+ "Error during metrics initialization: Unknown metric type! Make sure it is one " + "of: {}" ,
68
+ (Object []) MetricsReference .Metric .Type .values ());
62
69
}
63
70
}
64
71
}
@@ -67,9 +74,19 @@ public static void initMetrics(List<PCFElement> elements, List<MQObject.MQType>
67
74
metrics .put (metricName , new SimpleGauge (metricName , MetricsReference .getMetricHelp (type ), Labels .QMGR_NAME .name (), Labels .MQ_OBJECT_NAME .name ()));
68
75
logger .trace ("New gauge created! Name: {}, description: {}, labels: {}." , metricName , MetricsReference .getMetricHelp (type ), Labels .MQ_OBJECT_NAME .name ());
69
76
}
77
+ initAdditionalMetrics ();
78
+
70
79
logger .info ("Successfully initialized {} metrics!" , metrics .size ());
71
80
}
72
81
82
+ private static void initAdditionalMetrics () {
83
+ getAdditionalMqObjectMetricsReference ().forEach ((metricInfo , metric ) -> {
84
+ List <String > labels = Arrays .asList (Labels .QMGR_NAME .name (), Labels .MQ_OBJECT_NAME .name ());
85
+ metrics .put (metric .name , new SimpleGauge (metric .name , metricInfo , labels .toArray (new String [0 ])));
86
+ logger .trace ("New gauge created! Name: {}, description: {}, labels: {}." , metric .name , metricInfo , labels );
87
+ });
88
+ }
89
+
73
90
/**
74
91
* Updates specific metric
75
92
*
@@ -81,13 +98,33 @@ public static void updateMetric(String metricName, Double value, String... label
81
98
metrics .get (metricName ).update (value , labels );
82
99
}
83
100
101
+ /**
102
+ * Updates additional metrics, for which need special conversion
103
+ *
104
+ * @param parsedQuery - parameter, needed for getting metric in special family metrics
105
+ */
106
+ public static void updateAdditionalMetrics (Set <String > parsedQuery ) {
107
+ getUpdatedMetricNames ().forEach (updatedMetricName -> complexUpdateMetrics (
108
+ getMetricsUsedToUpdate (
109
+ parsedQuery ,
110
+ updatedMetricName ),
111
+ updatedMetricName ));
112
+ logger .trace ("Additional metrics was updated" );
113
+ }
114
+
115
+ private static void complexUpdateMetrics (
116
+ Map <List <String >, List <Double >> metricsUsedToUpdate ,
117
+ String updatedMetricName ) {
118
+ metricsUsedToUpdate .forEach ((k , l ) -> updateMetric (
119
+ updatedMetricName , getConversionFunction (updatedMetricName ).apply (l ), k .toArray (new String [0 ])));
120
+ logger .trace ("Additional metrics {} was updated" , updatedMetricName );
121
+ }
122
+
84
123
/**
85
124
* Notifies all metrics after each Prometheus scrape.
86
125
*/
87
126
public static void notifyMetricsWereScraped () {
88
- for (MetricInterface metric : metrics .values ()) {
89
- metric .notifyWasScraped ();
90
- }
127
+ metrics .values ().forEach (MetricInterface ::notifyWasScraped );
91
128
}
92
129
93
130
/**
0 commit comments