Skip to content

Commit b23e161

Browse files
authored
Merge pull request #41 from Cinimex-Informatica/feature/issue32_smart_gauge
issue32 Resolves:#32 ExtremeGauges added, typo in readme fixed.
2 parents adcebb2 + 2359aeb commit b23e161

File tree

9 files changed

+99
-9
lines changed

9 files changed

+99
-9
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ The only input parameter is the path to your configuration file.
137137
<td><strong>Prometheus metric name</strong></td>
138138
<td><strong>Metric type</strong></td>
139139
<td><strong>Short description</strong></td>
140-
<td><strong>MQ metric elemen</strong></td>
140+
<td><strong>MQ metric element</strong></td>
141141
</tr>
142142
<tr>
143143
<td>system_cpu_user_cpu_time_percentage</td>

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
</dependency>
5555
</dependencies>
5656
<build>
57-
<finalName>webspheremq_exporter</finalName>
57+
<finalName>mq_exporter</finalName>
5858
<plugins>
5959
<!-- Set a JDK compiler level -->
6060
<plugin>

src/main/java/ru/cinimex/exporter/prometheus/HTTPServer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import io.prometheus.client.exporter.common.TextFormat;
88
import org.apache.logging.log4j.LogManager;
99
import org.apache.logging.log4j.Logger;
10-
import ru.cinimex.exporter.ExporterLauncher;
10+
import ru.cinimex.exporter.prometheus.metrics.MetricsManager;
1111

1212
import java.io.ByteArrayOutputStream;
1313
import java.io.IOException;
@@ -149,6 +149,7 @@ public void handle(HttpExchange t) throws IOException {
149149
}
150150
t.close();
151151
logger.debug("Data was sent to Prometheus.");
152+
MetricsManager.notifyMetricsWereScraped();
152153
}
153154

154155
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package ru.cinimex.exporter.prometheus.metrics;
2+
3+
import io.prometheus.client.Gauge;
4+
import ru.cinimex.exporter.prometheus.Registry;
5+
6+
/**
7+
* Represents custom Prometheus metric. Counter, which can increase and decrease. Used to store max or min value
8+
* between Prometheus scrapes.
9+
*/
10+
public class ExtremeGauge implements MetricInterface {
11+
private Gauge gauge;
12+
private boolean storeMax;
13+
private volatile boolean wasScraped = true;
14+
15+
/**
16+
* ExtremeGauge constructor.
17+
*
18+
* @param metricName - metric name.
19+
* @param metricInfo - metric info (description).
20+
* @param storeMaxValue - true, if gauge should keep max value between scrapes, false otherwise.
21+
* @param labelNames - labels.
22+
*/
23+
public ExtremeGauge(String metricName, String metricInfo, boolean storeMaxValue, String... labelNames) {
24+
this.storeMax = storeMaxValue;
25+
gauge = Gauge.build().name(metricName).help(metricInfo).labelNames(labelNames).register(Registry.getRegistry());
26+
}
27+
28+
/**
29+
* Sets gauge to exact value.
30+
*
31+
* @param value - new value.
32+
* @param labelValues - value labels.
33+
*/
34+
private void setGauge(double value, String... labelValues) {
35+
gauge.labels(labelValues).set(value);
36+
}
37+
38+
@Override
39+
public synchronized void update(double value, String... labels) {
40+
double currentValue = gauge.labels(labels).get();
41+
if (wasScraped) {
42+
setGauge(value, labels);
43+
wasScraped = false;
44+
} else if (storeMax && value > currentValue) {
45+
setGauge(value, labels);
46+
} else if (!storeMax && value < currentValue) {
47+
setGauge(value, labels);
48+
}
49+
}
50+
51+
@Override
52+
public void notifyWasScraped() {
53+
wasScraped = true;
54+
}
55+
}

src/main/java/ru/cinimex/exporter/prometheus/metrics/MetricInterface.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,16 @@ public interface MetricInterface {
77

88
/**
99
* Method should contain all logic about updating exact metric.
10-
* @param value - incoming value.
10+
*
11+
* @param value - incoming value.
1112
* @param labels - incoming labels.
1213
*/
1314
void update(double value, String... labels);
1415

16+
/**
17+
* Method should contain additional processing for metric, when it was scraped by Prometheus.
18+
* Leave empty, if there is no need to do anything after metric was scraped.
19+
*/
20+
void notifyWasScraped();
21+
1522
}

src/main/java/ru/cinimex/exporter/prometheus/metrics/MetricsManager.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,16 @@ public static void initMetrics(ArrayList<PCFElement> elements, ArrayList<MQObjec
4646
metrics.put(metricName, metric);
4747
logger.trace("New counter created! Name: {}, description: {}, labels: {}.", metricName, row.getRowDesc(), labels);
4848
break;
49+
case ExtremeGaugeMax:
50+
metric = new ExtremeGauge(metricName, row.getRowDesc(), true, labels.stream().toArray(String[]::new));
51+
metrics.put(metricName, metric);
52+
logger.trace("New extreme gauge created! Name: {}, description: {}, labels: {}.", metricName, row.getRowDesc(), labels);
53+
break;
54+
case ExtremeGaugeMin:
55+
metric = new ExtremeGauge(metricName, row.getRowDesc(), false, labels.stream().toArray(String[]::new));
56+
metrics.put(metricName, metric);
57+
logger.trace("New extreme gauge created! Name: {}, description: {}, labels: {}.", metricName, row.getRowDesc(), labels);
58+
break;
4959
default:
5060
logger.error("Error during metrics initialization: Unknown metric type! Make sure it is one " + "of: {}", MetricsReference.Metric.Type.values());
5161
}
@@ -70,6 +80,15 @@ public static void updateMetric(String metricName, Double value, String... label
7080
metrics.get(metricName).update(value, labels);
7181
}
7282

83+
/**
84+
* Notifies all metrics after each Prometheus scrape.
85+
*/
86+
public static void notifyMetricsWereScraped() {
87+
for (MetricInterface metric : metrics.values()) {
88+
metric.notifyWasScraped();
89+
}
90+
}
91+
7392
/**
7493
* Contains all possible labels
7594
*/

src/main/java/ru/cinimex/exporter/prometheus/metrics/MetricsReference.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,10 @@ public class MetricsReference {
8888
put("Subscription delete failure count", new Metric("mq_subscribe_subscription_delete_failure_count_totalcalls", Metric.Type.SimpleCounter));
8989
put("MQSUBRQ count", new Metric("mq_subscribe_mqsubrq_count_totalcalls", Metric.Type.SimpleCounter));
9090
put("Failed MQSUBRQ count", new Metric("mq_subscribe_failed_mqsubrq_count_totalcalls", Metric.Type.SimpleCounter));
91-
put("Durable subscriber - high water mark", new Metric("mq_subscribe_durable_subscriber_high_water_mark_subscriptions", Metric.Type.SimpleGauge));
92-
put("Durable subscriber - low water mark", new Metric("mq_subscribe_durable_subscriber_low_water_mark_subscriptions", Metric.Type.SimpleGauge));
93-
put("Non-durable subscriber - high water mark", new Metric("mq_subscribe_non_durable_subscriber_high_water_mark_subscriptions", Metric.Type.SimpleGauge));
94-
put("Non-durable subscriber - low water mark", new Metric("mq_subscribe_non_durable_subscriber_low_water_mark_subscriptions", Metric.Type.SimpleGauge));
91+
put("Durable subscriber - high water mark", new Metric("mq_subscribe_durable_subscriber_high_water_mark_subscriptions", Metric.Type.ExtremeGaugeMax));
92+
put("Durable subscriber - low water mark", new Metric("mq_subscribe_durable_subscriber_low_water_mark_subscriptions", Metric.Type.ExtremeGaugeMin));
93+
put("Non-durable subscriber - high water mark", new Metric("mq_subscribe_non_durable_subscriber_high_water_mark_subscriptions", Metric.Type.ExtremeGaugeMax));
94+
put("Non-durable subscriber - low water mark", new Metric("mq_subscribe_non_durable_subscriber_low_water_mark_subscriptions", Metric.Type.ExtremeGaugeMin));
9595
put("Topic MQPUT/MQPUT1 interval total", new Metric("mq_publish_topic_mqput_mqput1_interval_total_totalmessages", Metric.Type.SimpleCounter));
9696
put("Interval total topic bytes put", new Metric("mq_publish_interval_total_topic_bytes_put_totalbytes", Metric.Type.SimpleCounter));
9797
put("Published to subscribers - message count", new Metric("mq_publish_published_to_subscribers_message_count_totalmessages", Metric.Type.SimpleCounter));
@@ -289,7 +289,7 @@ public Metric(String name, Type type) {
289289
}
290290

291291
public enum Type {
292-
SimpleCounter, SimpleGauge
292+
SimpleCounter, SimpleGauge, ExtremeGaugeMin, ExtremeGaugeMax
293293
}
294294
}
295295
}

src/main/java/ru/cinimex/exporter/prometheus/metrics/SimpleCounter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public class SimpleCounter implements MetricInterface {
1111

1212
/**
1313
* Counter constructor.
14+
*
1415
* @param metricName - metric name.
1516
* @param metricInfo - metric info (description).
1617
* @param labelNames - labels.
@@ -35,4 +36,8 @@ private void incCounter(double value, String... labelValues) {
3536
public void update(double value, String... labels) {
3637
incCounter(value, labels);
3738
}
39+
40+
@Override
41+
public void notifyWasScraped() {
42+
}
3843
}

src/main/java/ru/cinimex/exporter/prometheus/metrics/SimpleGauge.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ private void setGauge(double value, String... labelValues) {
3535
@Override
3636
public void update(double value, String... labels) {
3737
setGauge(value, labels);
38+
}
3839

40+
@Override
41+
public void notifyWasScraped() {
3942
}
4043
}

0 commit comments

Comments
 (0)