Skip to content

Commit f4cc3ad

Browse files
committed
Merge pull request #14353 from davidkarlsen
* pr/14353: Polish "Add Prometheus push gateway support" Add Prometheus push gateway support
2 parents 35752a5 + 20ecf73 commit f4cc3ad

File tree

9 files changed

+606
-1
lines changed

9 files changed

+606
-1
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,11 @@
147147
<artifactId>micrometer-registry-prometheus</artifactId>
148148
<optional>true</optional>
149149
</dependency>
150+
<dependency>
151+
<groupId>io.prometheus</groupId>
152+
<artifactId>simpleclient_pushgateway</artifactId>
153+
<optional>true</optional>
154+
</dependency>
150155
<dependency>
151156
<groupId>io.micrometer</groupId>
152157
<artifactId>micrometer-registry-signalfx</artifactId>

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfiguration.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,21 @@
1616

1717
package org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus;
1818

19+
import java.time.Duration;
20+
import java.util.Map;
21+
1922
import io.micrometer.core.instrument.Clock;
2023
import io.micrometer.prometheus.PrometheusConfig;
2124
import io.micrometer.prometheus.PrometheusMeterRegistry;
2225
import io.prometheus.client.CollectorRegistry;
26+
import io.prometheus.client.exporter.PushGateway;
2327

2428
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint;
2529
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
2630
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
2731
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
32+
import org.springframework.boot.actuate.metrics.export.prometheus.PrometheusPushGatewayManager;
33+
import org.springframework.boot.actuate.metrics.export.prometheus.PrometheusPushGatewayManager.ShutdownOperation;
2834
import org.springframework.boot.actuate.metrics.export.prometheus.PrometheusScrapeEndpoint;
2935
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
3036
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
@@ -36,12 +42,14 @@
3642
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3743
import org.springframework.context.annotation.Bean;
3844
import org.springframework.context.annotation.Configuration;
45+
import org.springframework.core.env.Environment;
3946

4047
/**
4148
* {@link EnableAutoConfiguration Auto-configuration} for exporting metrics to Prometheus.
4249
*
4350
* @since 2.0.0
4451
* @author Jon Schneider
52+
* @author David J. M. Karlsen
4553
*/
4654
@Configuration
4755
@AutoConfigureBefore({ CompositeMeterRegistryAutoConfiguration.class,
@@ -86,4 +94,47 @@ public PrometheusScrapeEndpoint prometheusEndpoint(
8694

8795
}
8896

97+
/**
98+
* Configuration for <a href="https://github.com/prometheus/pushgateway">Prometheus
99+
* Pushgateway</a>.
100+
*/
101+
@Configuration
102+
@ConditionalOnClass(PushGateway.class)
103+
@ConditionalOnProperty(prefix = "management.metrics.export.prometheus.pushgateway", name = "enabled")
104+
public static class PrometheusPushGatewayConfiguration {
105+
106+
/**
107+
* The fallback job name. We use 'spring' since there's a history of Prometheus
108+
* spring integration defaulting to that name from when Prometheus integration
109+
* didn't exist in Spring itself.
110+
*/
111+
private static final String FALLBACK_JOB = "spring";
112+
113+
@Bean
114+
@ConditionalOnMissingBean
115+
public PrometheusPushGatewayManager prometheusPushGatewayManager(
116+
CollectorRegistry collectorRegistry,
117+
PrometheusProperties prometheusProperties, Environment environment) {
118+
PrometheusProperties.Pushgateway properties = prometheusProperties
119+
.getPushgateway();
120+
PushGateway pushGateway = new PushGateway(properties.getBaseUrl());
121+
Duration pushRate = properties.getPushRate();
122+
String job = getJob(properties, environment);
123+
Map<String, String> groupingKey = properties.getGroupingKey();
124+
ShutdownOperation shutdownOperation = properties.getShutdownOperation();
125+
return new PrometheusPushGatewayManager(pushGateway, collectorRegistry,
126+
pushRate, job, groupingKey, shutdownOperation);
127+
}
128+
129+
private String getJob(PrometheusProperties.Pushgateway properties,
130+
Environment environment) {
131+
String job = properties.getJob();
132+
job = (job != null) ? job
133+
: environment.getProperty("spring.application.name");
134+
job = (job != null) ? job : FALLBACK_JOB;
135+
return job;
136+
}
137+
138+
}
139+
89140
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusProperties.java

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
package org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus;
1818

1919
import java.time.Duration;
20+
import java.util.HashMap;
21+
import java.util.Map;
2022

23+
import org.springframework.boot.actuate.metrics.export.prometheus.PrometheusPushGatewayManager.ShutdownOperation;
2124
import org.springframework.boot.context.properties.ConfigurationProperties;
2225

2326
/**
@@ -36,6 +39,12 @@ public class PrometheusProperties {
3639
*/
3740
private boolean descriptions = true;
3841

42+
/**
43+
* Configuration options for using Prometheus Pushgateway, allowing metrics to be
44+
* pushed when they cannot be scraped.
45+
*/
46+
private Pushgateway pushgateway = new Pushgateway();
47+
3948
/**
4049
* Step size (i.e. reporting frequency) to use.
4150
*/
@@ -57,4 +66,97 @@ public void setStep(Duration step) {
5766
this.step = step;
5867
}
5968

69+
public Pushgateway getPushgateway() {
70+
return this.pushgateway;
71+
}
72+
73+
public void setPushgateway(Pushgateway pushgateway) {
74+
this.pushgateway = pushgateway;
75+
}
76+
77+
/**
78+
* Configuration options for push-based interaction with Prometheus.
79+
*/
80+
public static class Pushgateway {
81+
82+
/**
83+
* Enable publishing via a Prometheus Pushgateway.
84+
*/
85+
private Boolean enabled = false;
86+
87+
/**
88+
* Base URL for the Pushgateway.
89+
*/
90+
private String baseUrl = "localhost:9091";
91+
92+
/**
93+
* Frequency with which to push metrics.
94+
*/
95+
private Duration pushRate = Duration.ofMinutes(1);
96+
97+
/**
98+
* Job identifier for this application instance.
99+
*/
100+
private String job;
101+
102+
/**
103+
* Grouping key for the pushed metrics.
104+
*/
105+
private Map<String, String> groupingKey = new HashMap<>();
106+
107+
/**
108+
* Operation that should be performed on shutdown.
109+
*/
110+
private ShutdownOperation shutdownOperation = ShutdownOperation.NONE;
111+
112+
public Boolean getEnabled() {
113+
return this.enabled;
114+
}
115+
116+
public void setEnabled(Boolean enabled) {
117+
this.enabled = enabled;
118+
}
119+
120+
public String getBaseUrl() {
121+
return this.baseUrl;
122+
}
123+
124+
public void setBaseUrl(String baseUrl) {
125+
this.baseUrl = baseUrl;
126+
}
127+
128+
public Duration getPushRate() {
129+
return this.pushRate;
130+
}
131+
132+
public void setPushRate(Duration pushRate) {
133+
this.pushRate = pushRate;
134+
}
135+
136+
public String getJob() {
137+
return this.job;
138+
}
139+
140+
public void setJob(String job) {
141+
this.job = job;
142+
}
143+
144+
public Map<String, String> getGroupingKey() {
145+
return this.groupingKey;
146+
}
147+
148+
public void setGroupingKey(Map<String, String> groupingKey) {
149+
this.groupingKey = groupingKey;
150+
}
151+
152+
public ShutdownOperation getShutdownOperation() {
153+
return this.shutdownOperation;
154+
}
155+
156+
public void setShutdownOperation(ShutdownOperation shutdownOperation) {
157+
this.shutdownOperation = shutdownOperation;
158+
}
159+
160+
}
161+
60162
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusMetricsExportAutoConfigurationTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.junit.Test;
2424

2525
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration;
26+
import org.springframework.boot.actuate.metrics.export.prometheus.PrometheusPushGatewayManager;
2627
import org.springframework.boot.actuate.metrics.export.prometheus.PrometheusScrapeEndpoint;
2728
import org.springframework.boot.autoconfigure.AutoConfigurations;
2829
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
@@ -128,6 +129,18 @@ public void allowsCustomScrapeEndpointToBeUsed() {
128129
.hasSingleBean(PrometheusScrapeEndpoint.class));
129130
}
130131

132+
@Test
133+
public void withPushGatewayEnabled() {
134+
this.contextRunner
135+
.withConfiguration(
136+
AutoConfigurations.of(ManagementContextAutoConfiguration.class))
137+
.withPropertyValues(
138+
"management.metrics.export.prometheus.pushgateway.enabled=true")
139+
.withUserConfiguration(BaseConfiguration.class)
140+
.run((context) -> assertThat(context)
141+
.hasSingleBean(PrometheusPushGatewayManager.class));
142+
}
143+
131144
@Configuration
132145
static class BaseConfiguration {
133146

spring-boot-project/spring-boot-actuator/pom.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
34
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
45
<modelVersion>4.0.0</modelVersion>
56
<parent>
@@ -61,6 +62,11 @@
6162
<artifactId>micrometer-registry-prometheus</artifactId>
6263
<optional>true</optional>
6364
</dependency>
65+
<dependency>
66+
<groupId>io.prometheus</groupId>
67+
<artifactId>simpleclient_pushgateway</artifactId>
68+
<optional>true</optional>
69+
</dependency>
6470
<dependency>
6571
<groupId>io.reactivex</groupId>
6672
<artifactId>rxjava-reactive-streams</artifactId>

0 commit comments

Comments
 (0)