mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-07-05 00:56:58 +08:00
Polish gh-40023
See gh-41208
This commit is contained in:
parent
448089f935
commit
5a387a85a9
|
@ -22,8 +22,6 @@ import java.time.Duration;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import io.micrometer.core.instrument.Clock;
|
import io.micrometer.core.instrument.Clock;
|
||||||
import io.micrometer.prometheus.PrometheusConfig;
|
|
||||||
import io.micrometer.prometheus.PrometheusMeterRegistry;
|
|
||||||
import io.prometheus.client.CollectorRegistry;
|
import io.prometheus.client.CollectorRegistry;
|
||||||
import io.prometheus.client.exemplars.DefaultExemplarSampler;
|
import io.prometheus.client.exemplars.DefaultExemplarSampler;
|
||||||
import io.prometheus.client.exemplars.ExemplarSampler;
|
import io.prometheus.client.exemplars.ExemplarSampler;
|
||||||
|
@ -69,14 +67,14 @@ import org.springframework.util.StringUtils;
|
||||||
before = { CompositeMeterRegistryAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class },
|
before = { CompositeMeterRegistryAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class },
|
||||||
after = { MetricsAutoConfiguration.class, PrometheusMetricsExportAutoConfiguration.class })
|
after = { MetricsAutoConfiguration.class, PrometheusMetricsExportAutoConfiguration.class })
|
||||||
@ConditionalOnBean(Clock.class)
|
@ConditionalOnBean(Clock.class)
|
||||||
@ConditionalOnClass(PrometheusMeterRegistry.class)
|
@ConditionalOnClass(io.micrometer.prometheus.PrometheusMeterRegistry.class)
|
||||||
@ConditionalOnEnabledMetricsExport("prometheus")
|
@ConditionalOnEnabledMetricsExport("prometheus")
|
||||||
@EnableConfigurationProperties(PrometheusProperties.class)
|
@EnableConfigurationProperties(PrometheusProperties.class)
|
||||||
public class PrometheusSimpleclientMetricsExportAutoConfiguration {
|
public class PrometheusSimpleclientMetricsExportAutoConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
@ConditionalOnMissingBean
|
@ConditionalOnMissingBean
|
||||||
PrometheusConfig simpleclientPrometheusConfig(PrometheusProperties prometheusProperties) {
|
io.micrometer.prometheus.PrometheusConfig simpleclientPrometheusConfig(PrometheusProperties prometheusProperties) {
|
||||||
return new PrometheusSimpleclientPropertiesConfigAdapter(prometheusProperties);
|
return new PrometheusSimpleclientPropertiesConfigAdapter(prometheusProperties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -192,8 +192,8 @@ class DualPrometheusMetricsExportAutoConfigurationTests {
|
||||||
@Test
|
@Test
|
||||||
void scrapeEndpointCanBeDisabled() {
|
void scrapeEndpointCanBeDisabled() {
|
||||||
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
|
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
|
||||||
.withPropertyValues("management.endpoints.web.exposure.include=prometheus")
|
.withPropertyValues("management.endpoints.web.exposure.include=prometheus",
|
||||||
.withPropertyValues("management.endpoint.prometheus.enabled=false")
|
"management.endpoint.prometheus.enabled=false")
|
||||||
.withUserConfiguration(BaseConfiguration.class)
|
.withUserConfiguration(BaseConfiguration.class)
|
||||||
.run((context) -> assertThat(context).doesNotHaveBean(PrometheusSimpleclientScrapeEndpoint.class)
|
.run((context) -> assertThat(context).doesNotHaveBean(PrometheusSimpleclientScrapeEndpoint.class)
|
||||||
.doesNotHaveBean(PrometheusScrapeEndpoint.class));
|
.doesNotHaveBean(PrometheusScrapeEndpoint.class));
|
||||||
|
|
|
@ -138,8 +138,8 @@ class PrometheusMetricsExportAutoConfigurationTests {
|
||||||
@Test
|
@Test
|
||||||
void scrapeEndpointCanBeDisabled() {
|
void scrapeEndpointCanBeDisabled() {
|
||||||
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
|
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
|
||||||
.withPropertyValues("management.endpoints.web.exposure.include=prometheus")
|
.withPropertyValues("management.endpoints.web.exposure.include=prometheus",
|
||||||
.withPropertyValues("management.endpoint.prometheus.enabled=false")
|
"management.endpoint.prometheus.enabled=false")
|
||||||
.withUserConfiguration(BaseConfiguration.class)
|
.withUserConfiguration(BaseConfiguration.class)
|
||||||
.run((context) -> assertThat(context).doesNotHaveBean(PrometheusScrapeEndpoint.class));
|
.run((context) -> assertThat(context).doesNotHaveBean(PrometheusScrapeEndpoint.class));
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,8 +165,8 @@ class PrometheusSimpleclientMetricsExportAutoConfigurationTests {
|
||||||
@Test
|
@Test
|
||||||
void scrapeEndpointCanBeDisabled() {
|
void scrapeEndpointCanBeDisabled() {
|
||||||
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
|
this.contextRunner.withConfiguration(AutoConfigurations.of(ManagementContextAutoConfiguration.class))
|
||||||
.withPropertyValues("management.endpoints.web.exposure.include=prometheus")
|
.withPropertyValues("management.endpoints.web.exposure.include=prometheus",
|
||||||
.withPropertyValues("management.endpoint.prometheus.enabled=false")
|
"management.endpoint.prometheus.enabled=false")
|
||||||
.withUserConfiguration(BaseConfiguration.class)
|
.withUserConfiguration(BaseConfiguration.class)
|
||||||
.run((context) -> assertThat(context).doesNotHaveBean(PrometheusSimpleclientScrapeEndpoint.class));
|
.run((context) -> assertThat(context).doesNotHaveBean(PrometheusSimpleclientScrapeEndpoint.class));
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,21 +62,21 @@ class LazyTracingSpanContextTests {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private final LazyTracingSpanContext spanContextSupplier = new LazyTracingSpanContext(this.objectProvider);
|
private final LazyTracingSpanContext spanContext = new LazyTracingSpanContext(this.objectProvider);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void whenCurrentSpanIsNullThenSpanIdIsNull() {
|
void whenCurrentSpanIsNullThenSpanIdIsNull() {
|
||||||
assertThat(this.spanContextSupplier.getCurrentSpanId()).isNull();
|
assertThat(this.spanContext.getCurrentSpanId()).isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void whenCurrentSpanIsNullThenTraceIdIsNull() {
|
void whenCurrentSpanIsNullThenTraceIdIsNull() {
|
||||||
assertThat(this.spanContextSupplier.getCurrentTraceId()).isNull();
|
assertThat(this.spanContext.getCurrentTraceId()).isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void whenCurrentSpanIsNullThenSampledIsFalse() {
|
void whenCurrentSpanIsNullThenSampledIsFalse() {
|
||||||
assertThat(this.spanContextSupplier.isCurrentSpanSampled()).isFalse();
|
assertThat(this.spanContext.isCurrentSpanSampled()).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -86,7 +86,7 @@ class LazyTracingSpanContextTests {
|
||||||
TraceContext traceContext = mock(TraceContext.class);
|
TraceContext traceContext = mock(TraceContext.class);
|
||||||
given(traceContext.spanId()).willReturn("span-id");
|
given(traceContext.spanId()).willReturn("span-id");
|
||||||
given(span.context()).willReturn(traceContext);
|
given(span.context()).willReturn(traceContext);
|
||||||
assertThat(this.spanContextSupplier.getCurrentSpanId()).isEqualTo("span-id");
|
assertThat(this.spanContext.getCurrentSpanId()).isEqualTo("span-id");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -96,7 +96,7 @@ class LazyTracingSpanContextTests {
|
||||||
TraceContext traceContext = mock(TraceContext.class);
|
TraceContext traceContext = mock(TraceContext.class);
|
||||||
given(traceContext.traceId()).willReturn("trace-id");
|
given(traceContext.traceId()).willReturn("trace-id");
|
||||||
given(span.context()).willReturn(traceContext);
|
given(span.context()).willReturn(traceContext);
|
||||||
assertThat(this.spanContextSupplier.getCurrentTraceId()).isEqualTo("trace-id");
|
assertThat(this.spanContext.getCurrentTraceId()).isEqualTo("trace-id");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -105,7 +105,7 @@ class LazyTracingSpanContextTests {
|
||||||
given(this.tracer.currentSpan()).willReturn(span);
|
given(this.tracer.currentSpan()).willReturn(span);
|
||||||
TraceContext traceContext = mock(TraceContext.class);
|
TraceContext traceContext = mock(TraceContext.class);
|
||||||
given(span.context()).willReturn(traceContext);
|
given(span.context()).willReturn(traceContext);
|
||||||
assertThat(this.spanContextSupplier.getCurrentSpanId()).isNull();
|
assertThat(this.spanContext.getCurrentSpanId()).isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -114,7 +114,7 @@ class LazyTracingSpanContextTests {
|
||||||
given(this.tracer.currentSpan()).willReturn(span);
|
given(this.tracer.currentSpan()).willReturn(span);
|
||||||
TraceContext traceContext = mock(TraceContext.class);
|
TraceContext traceContext = mock(TraceContext.class);
|
||||||
given(span.context()).willReturn(traceContext);
|
given(span.context()).willReturn(traceContext);
|
||||||
assertThat(this.spanContextSupplier.getCurrentTraceId()).isNull();
|
assertThat(this.spanContext.getCurrentTraceId()).isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -124,7 +124,7 @@ class LazyTracingSpanContextTests {
|
||||||
TraceContext traceContext = mock(TraceContext.class);
|
TraceContext traceContext = mock(TraceContext.class);
|
||||||
given(traceContext.sampled()).willReturn(true);
|
given(traceContext.sampled()).willReturn(true);
|
||||||
given(span.context()).willReturn(traceContext);
|
given(span.context()).willReturn(traceContext);
|
||||||
assertThat(this.spanContextSupplier.isCurrentSpanSampled()).isTrue();
|
assertThat(this.spanContext.isCurrentSpanSampled()).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -134,7 +134,7 @@ class LazyTracingSpanContextTests {
|
||||||
TraceContext traceContext = mock(TraceContext.class);
|
TraceContext traceContext = mock(TraceContext.class);
|
||||||
given(traceContext.sampled()).willReturn(false);
|
given(traceContext.sampled()).willReturn(false);
|
||||||
given(span.context()).willReturn(traceContext);
|
given(span.context()).willReturn(traceContext);
|
||||||
assertThat(this.spanContextSupplier.isCurrentSpanSampled()).isFalse();
|
assertThat(this.spanContext.isCurrentSpanSampled()).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -144,7 +144,7 @@ class LazyTracingSpanContextTests {
|
||||||
TraceContext traceContext = mock(TraceContext.class);
|
TraceContext traceContext = mock(TraceContext.class);
|
||||||
given(traceContext.sampled()).willReturn(null);
|
given(traceContext.sampled()).willReturn(null);
|
||||||
given(span.context()).willReturn(traceContext);
|
given(span.context()).willReturn(traceContext);
|
||||||
assertThat(this.spanContextSupplier.isCurrentSpanSampled()).isFalse();
|
assertThat(this.spanContext.isCurrentSpanSampled()).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,7 @@ class PrometheusExemplarsAutoConfigurationTests {
|
||||||
this.contextRunner.withUserConfiguration(CustomConfiguration.class)
|
this.contextRunner.withUserConfiguration(CustomConfiguration.class)
|
||||||
.run((context) -> assertThat(context).hasSingleBean(SpanContext.class)
|
.run((context) -> assertThat(context).hasSingleBean(SpanContext.class)
|
||||||
.getBean(SpanContext.class)
|
.getBean(SpanContext.class)
|
||||||
.isSameAs(CustomConfiguration.SUPPLIER));
|
.isSameAs(CustomConfiguration.SPAN_CONTEXT));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -145,11 +145,11 @@ class PrometheusExemplarsAutoConfigurationTests {
|
||||||
@Configuration(proxyBeanMethods = false)
|
@Configuration(proxyBeanMethods = false)
|
||||||
private static final class CustomConfiguration {
|
private static final class CustomConfiguration {
|
||||||
|
|
||||||
static final SpanContext SUPPLIER = mock(SpanContext.class);
|
static final SpanContext SPAN_CONTEXT = mock(SpanContext.class);
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
SpanContext customSpanContext() {
|
SpanContext customSpanContext() {
|
||||||
return SUPPLIER;
|
return SPAN_CONTEXT;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,20 +47,14 @@ class SecondCustomPrometheusScrapeEndpointIntegrationTests {
|
||||||
|
|
||||||
@WebEndpointTest
|
@WebEndpointTest
|
||||||
void scrapeHasContentTypeText004ByDefault(WebTestClient client) {
|
void scrapeHasContentTypeText004ByDefault(WebTestClient client) {
|
||||||
|
scrapeHasContentTypeText004ByDefault(client, "/actuator/prometheus");
|
||||||
|
scrapeHasContentTypeText004ByDefault(client, "/actuator/prometheussc");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void scrapeHasContentTypeText004ByDefault(WebTestClient client, String uri) {
|
||||||
String expectedContentType = PrometheusTextFormatWriter.CONTENT_TYPE;
|
String expectedContentType = PrometheusTextFormatWriter.CONTENT_TYPE;
|
||||||
client.get()
|
client.get()
|
||||||
.uri("/actuator/prometheus")
|
.uri(uri)
|
||||||
.exchange()
|
|
||||||
.expectStatus()
|
|
||||||
.isOk()
|
|
||||||
.expectHeader()
|
|
||||||
.contentType(MediaType.parseMediaType(expectedContentType))
|
|
||||||
.expectBody(String.class)
|
|
||||||
.value((body) -> assertThat(body).contains("counter1_total")
|
|
||||||
.contains("counter2_total")
|
|
||||||
.contains("counter3_total"));
|
|
||||||
client.get()
|
|
||||||
.uri("/actuator/prometheussc")
|
|
||||||
.exchange()
|
.exchange()
|
||||||
.expectStatus()
|
.expectStatus()
|
||||||
.isOk()
|
.isOk()
|
||||||
|
@ -74,22 +68,16 @@ class SecondCustomPrometheusScrapeEndpointIntegrationTests {
|
||||||
|
|
||||||
@WebEndpointTest
|
@WebEndpointTest
|
||||||
void scrapeHasContentTypeText004ByDefaultWhenClientAcceptsWildcardWithParameter(WebTestClient client) {
|
void scrapeHasContentTypeText004ByDefaultWhenClientAcceptsWildcardWithParameter(WebTestClient client) {
|
||||||
|
scrapeHasContentTypeText004ByDefaultWhenClientAcceptsWildcardWithParameter(client, "/actuator/prometheus");
|
||||||
|
scrapeHasContentTypeText004ByDefaultWhenClientAcceptsWildcardWithParameter(client, "/actuator/prometheussc");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void scrapeHasContentTypeText004ByDefaultWhenClientAcceptsWildcardWithParameter(WebTestClient client,
|
||||||
|
String uri) {
|
||||||
String expectedContentType = PrometheusTextFormatWriter.CONTENT_TYPE;
|
String expectedContentType = PrometheusTextFormatWriter.CONTENT_TYPE;
|
||||||
String accept = "*/*;q=0.8";
|
String accept = "*/*;q=0.8";
|
||||||
client.get()
|
client.get()
|
||||||
.uri("/actuator/prometheus")
|
.uri(uri)
|
||||||
.accept(MediaType.parseMediaType(accept))
|
|
||||||
.exchange()
|
|
||||||
.expectStatus()
|
|
||||||
.isOk()
|
|
||||||
.expectHeader()
|
|
||||||
.contentType(MediaType.parseMediaType(expectedContentType))
|
|
||||||
.expectBody(String.class)
|
|
||||||
.value((body) -> assertThat(body).contains("counter1_total")
|
|
||||||
.contains("counter2_total")
|
|
||||||
.contains("counter3_total"));
|
|
||||||
client.get()
|
|
||||||
.uri("/actuator/prometheussc")
|
|
||||||
.accept(MediaType.parseMediaType(accept))
|
.accept(MediaType.parseMediaType(accept))
|
||||||
.exchange()
|
.exchange()
|
||||||
.expectStatus()
|
.expectStatus()
|
||||||
|
@ -104,21 +92,14 @@ class SecondCustomPrometheusScrapeEndpointIntegrationTests {
|
||||||
|
|
||||||
@WebEndpointTest
|
@WebEndpointTest
|
||||||
void scrapeCanProduceOpenMetrics100(WebTestClient client) {
|
void scrapeCanProduceOpenMetrics100(WebTestClient client) {
|
||||||
|
scrapeCanProduceOpenMetrics100(client, "/actuator/prometheus");
|
||||||
|
scrapeCanProduceOpenMetrics100(client, "/actuator/prometheussc");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void scrapeCanProduceOpenMetrics100(WebTestClient client, String uri) {
|
||||||
MediaType openMetrics = MediaType.parseMediaType(OpenMetricsTextFormatWriter.CONTENT_TYPE);
|
MediaType openMetrics = MediaType.parseMediaType(OpenMetricsTextFormatWriter.CONTENT_TYPE);
|
||||||
client.get()
|
client.get()
|
||||||
.uri("/actuator/prometheus")
|
.uri(uri)
|
||||||
.accept(openMetrics)
|
|
||||||
.exchange()
|
|
||||||
.expectStatus()
|
|
||||||
.isOk()
|
|
||||||
.expectHeader()
|
|
||||||
.contentType(openMetrics)
|
|
||||||
.expectBody(String.class)
|
|
||||||
.value((body) -> assertThat(body).contains("counter1_total")
|
|
||||||
.contains("counter2_total")
|
|
||||||
.contains("counter3_total"));
|
|
||||||
client.get()
|
|
||||||
.uri("/actuator/prometheussc")
|
|
||||||
.accept(openMetrics)
|
.accept(openMetrics)
|
||||||
.exchange()
|
.exchange()
|
||||||
.expectStatus()
|
.expectStatus()
|
||||||
|
@ -133,18 +114,15 @@ class SecondCustomPrometheusScrapeEndpointIntegrationTests {
|
||||||
|
|
||||||
@WebEndpointTest
|
@WebEndpointTest
|
||||||
void scrapePrefersToProduceOpenMetrics100(WebTestClient client) {
|
void scrapePrefersToProduceOpenMetrics100(WebTestClient client) {
|
||||||
|
scrapePrefersToProduceOpenMetrics100(client, "/actuator/prometheus");
|
||||||
|
scrapePrefersToProduceOpenMetrics100(client, "/actuator/prometheussc");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void scrapePrefersToProduceOpenMetrics100(WebTestClient client, String uri) {
|
||||||
MediaType openMetrics = MediaType.parseMediaType(OpenMetricsTextFormatWriter.CONTENT_TYPE);
|
MediaType openMetrics = MediaType.parseMediaType(OpenMetricsTextFormatWriter.CONTENT_TYPE);
|
||||||
MediaType textPlain = MediaType.parseMediaType(PrometheusTextFormatWriter.CONTENT_TYPE);
|
MediaType textPlain = MediaType.parseMediaType(PrometheusTextFormatWriter.CONTENT_TYPE);
|
||||||
client.get()
|
client.get()
|
||||||
.uri("/actuator/prometheus")
|
.uri(uri)
|
||||||
.accept(openMetrics, textPlain)
|
|
||||||
.exchange()
|
|
||||||
.expectStatus()
|
|
||||||
.isOk()
|
|
||||||
.expectHeader()
|
|
||||||
.contentType(openMetrics);
|
|
||||||
client.get()
|
|
||||||
.uri("/actuator/prometheussc")
|
|
||||||
.accept(openMetrics, textPlain)
|
.accept(openMetrics, textPlain)
|
||||||
.exchange()
|
.exchange()
|
||||||
.expectStatus()
|
.expectStatus()
|
||||||
|
@ -155,19 +133,13 @@ class SecondCustomPrometheusScrapeEndpointIntegrationTests {
|
||||||
|
|
||||||
@WebEndpointTest
|
@WebEndpointTest
|
||||||
void scrapeWithIncludedNames(WebTestClient client) {
|
void scrapeWithIncludedNames(WebTestClient client) {
|
||||||
|
scrapeWithIncludedNames(client, "/actuator/prometheus?includedNames=counter1,counter2");
|
||||||
|
scrapeWithIncludedNames(client, "/actuator/prometheussc?includedNames=counter1_total,counter2_total");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void scrapeWithIncludedNames(WebTestClient client, String uri) {
|
||||||
client.get()
|
client.get()
|
||||||
.uri("/actuator/prometheus?includedNames=counter1,counter2")
|
.uri(uri)
|
||||||
.exchange()
|
|
||||||
.expectStatus()
|
|
||||||
.isOk()
|
|
||||||
.expectHeader()
|
|
||||||
.contentType(MediaType.parseMediaType(PrometheusTextFormatWriter.CONTENT_TYPE))
|
|
||||||
.expectBody(String.class)
|
|
||||||
.value((body) -> assertThat(body).contains("counter1_total")
|
|
||||||
.contains("counter2_total")
|
|
||||||
.doesNotContain("counter3_total"));
|
|
||||||
client.get()
|
|
||||||
.uri("/actuator/prometheussc?includedNames=counter1_total,counter2_total")
|
|
||||||
.exchange()
|
.exchange()
|
||||||
.expectStatus()
|
.expectStatus()
|
||||||
.isOk()
|
.isOk()
|
||||||
|
|
|
@ -1492,12 +1492,12 @@ bom {
|
||||||
library("Prometheus Client", "1.2.1") {
|
library("Prometheus Client", "1.2.1") {
|
||||||
group("io.prometheus") {
|
group("io.prometheus") {
|
||||||
imports = [
|
imports = [
|
||||||
"prometheus-metrics-bom"
|
"prometheus-metrics-bom"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
links {
|
links {
|
||||||
site("https://github.com/prometheus/client_java")
|
site("https://github.com/prometheus/client_java")
|
||||||
releaseNotes("https://github.com/prometheus/client_java/releases/tag/parent-{version}")
|
releaseNotes("https://github.com/prometheus/client_java/releases/tag/v{version}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
library("Prometheus Simpleclient", "0.16.0") {
|
library("Prometheus Simpleclient", "0.16.0") {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user