Skip to content

Commit 1f7a983

Browse files
committed
Switch to jersey-micrometer for Jersey metrics
Closes gh-39502
1 parent 78dc1b6 commit 1f7a983

File tree

3 files changed

+89
-12
lines changed

3 files changed

+89
-12
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ dependencies {
102102
optional("org.flywaydb:flyway-core")
103103
optional("org.glassfish.jersey.core:jersey-server")
104104
optional("org.glassfish.jersey.containers:jersey-container-servlet-core")
105+
optional("org.glassfish.jersey.ext:jersey-micrometer")
105106
optional("org.hibernate.orm:hibernate-core")
106107
optional("org.hibernate.orm:hibernate-micrometer")
107108
optional("org.hibernate.validator:hibernate-validator")

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/jersey/JerseyServerMetricsAutoConfiguration.java

+38-8
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,16 @@
2020
import java.lang.reflect.AnnotatedElement;
2121

2222
import io.micrometer.core.instrument.MeterRegistry;
23-
import io.micrometer.core.instrument.binder.jersey.server.AnnotationFinder;
24-
import io.micrometer.core.instrument.binder.jersey.server.DefaultJerseyTagsProvider;
25-
import io.micrometer.core.instrument.binder.jersey.server.JerseyTagsProvider;
26-
import io.micrometer.core.instrument.binder.jersey.server.MetricsApplicationEventListener;
23+
import io.micrometer.core.instrument.Tag;
2724
import io.micrometer.core.instrument.config.MeterFilter;
25+
import org.glassfish.jersey.micrometer.server.AnnotationFinder;
26+
import org.glassfish.jersey.micrometer.server.DefaultJerseyTagsProvider;
27+
import org.glassfish.jersey.micrometer.server.JerseyTagsProvider;
28+
import org.glassfish.jersey.micrometer.server.MetricsApplicationEventListener;
2829
import org.glassfish.jersey.server.ResourceConfig;
30+
import org.glassfish.jersey.server.monitoring.RequestEvent;
2931

32+
import org.springframework.beans.factory.ObjectProvider;
3033
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
3134
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsProperties;
3235
import org.springframework.boot.actuate.autoconfigure.metrics.OnlyOnceLoggingDenyMeterFilter;
@@ -66,17 +69,22 @@ public JerseyServerMetricsAutoConfiguration(ObservationProperties observationPro
6669
}
6770

6871
@Bean
69-
@ConditionalOnMissingBean(JerseyTagsProvider.class)
72+
@SuppressWarnings("deprecation")
73+
@ConditionalOnMissingBean({ JerseyTagsProvider.class,
74+
io.micrometer.core.instrument.binder.jersey.server.JerseyTagsProvider.class })
7075
public DefaultJerseyTagsProvider jerseyTagsProvider() {
7176
return new DefaultJerseyTagsProvider();
7277
}
7378

7479
@Bean
80+
@SuppressWarnings("deprecation")
7581
public ResourceConfigCustomizer jerseyServerMetricsResourceConfigCustomizer(MeterRegistry meterRegistry,
76-
JerseyTagsProvider tagsProvider) {
82+
ObjectProvider<JerseyTagsProvider> tagsProvider,
83+
ObjectProvider<io.micrometer.core.instrument.binder.jersey.server.JerseyTagsProvider> micrometerTagsProvider) {
7784
String metricName = this.observationProperties.getHttp().getServer().getRequests().getName();
78-
return (config) -> config.register(new MetricsApplicationEventListener(meterRegistry, tagsProvider, metricName,
79-
true, new AnnotationUtilsAnnotationFinder()));
85+
return (config) -> config.register(new MetricsApplicationEventListener(meterRegistry,
86+
tagsProvider.getIfAvailable(() -> new JerseyTagsProviderAdapter(micrometerTagsProvider.getObject())),
87+
metricName, true, new AnnotationUtilsAnnotationFinder()));
8088
}
8189

8290
@Bean
@@ -101,4 +109,26 @@ public <A extends Annotation> A findAnnotation(AnnotatedElement annotatedElement
101109

102110
}
103111

112+
@SuppressWarnings("deprecation")
113+
static final class JerseyTagsProviderAdapter implements JerseyTagsProvider {
114+
115+
private final io.micrometer.core.instrument.binder.jersey.server.JerseyTagsProvider delegate;
116+
117+
private JerseyTagsProviderAdapter(
118+
io.micrometer.core.instrument.binder.jersey.server.JerseyTagsProvider delegate) {
119+
this.delegate = delegate;
120+
}
121+
122+
@Override
123+
public Iterable<Tag> httpRequestTags(RequestEvent event) {
124+
return this.delegate.httpRequestTags(event);
125+
}
126+
127+
@Override
128+
public Iterable<Tag> httpLongRequestTags(RequestEvent event) {
129+
return this.delegate.httpLongRequestTags(event);
130+
}
131+
132+
}
133+
104134
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/metrics/jersey/JerseyServerMetricsAutoConfigurationTests.java

+50-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2023 the original author or authors.
2+
* Copyright 2012-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -17,22 +17,25 @@
1717
package org.springframework.boot.actuate.autoconfigure.metrics.jersey;
1818

1919
import java.net.URI;
20+
import java.util.Set;
2021

2122
import io.micrometer.core.instrument.MeterRegistry;
2223
import io.micrometer.core.instrument.Tag;
2324
import io.micrometer.core.instrument.Timer;
24-
import io.micrometer.core.instrument.binder.jersey.server.DefaultJerseyTagsProvider;
25-
import io.micrometer.core.instrument.binder.jersey.server.JerseyTagsProvider;
26-
import io.micrometer.core.instrument.binder.jersey.server.MetricsApplicationEventListener;
2725
import jakarta.ws.rs.GET;
2826
import jakarta.ws.rs.Path;
2927
import jakarta.ws.rs.PathParam;
28+
import org.assertj.core.api.InstanceOfAssertFactories;
29+
import org.glassfish.jersey.micrometer.server.DefaultJerseyTagsProvider;
30+
import org.glassfish.jersey.micrometer.server.JerseyTagsProvider;
31+
import org.glassfish.jersey.micrometer.server.MetricsApplicationEventListener;
3032
import org.glassfish.jersey.server.ResourceConfig;
3133
import org.glassfish.jersey.server.monitoring.RequestEvent;
3234
import org.junit.jupiter.api.Test;
3335

3436
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
3537
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
38+
import org.springframework.boot.actuate.autoconfigure.metrics.jersey.JerseyServerMetricsAutoConfiguration.JerseyTagsProviderAdapter;
3639
import org.springframework.boot.actuate.autoconfigure.metrics.test.MetricsRun;
3740
import org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration;
3841
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -87,6 +90,22 @@ void shouldHonorExistingTagProvider() {
8790
.run((context) -> assertThat(context).hasSingleBean(CustomJerseyTagsProvider.class));
8891
}
8992

93+
@Test
94+
@Deprecated(since = "3.3.0", forRemoval = true)
95+
void shouldHonorExistingMicrometerTagProvider() {
96+
this.webContextRunner.withUserConfiguration(CustomMicrometerJerseyTagsProviderConfiguration.class)
97+
.run((context) -> {
98+
assertThat(context).hasSingleBean(CustomMicrometerJerseyTagsProvider.class);
99+
ResourceConfig config = new ResourceConfig();
100+
context.getBean(ResourceConfigCustomizer.class).customize(config);
101+
Set<Object> instances = config.getInstances();
102+
assertThat(instances).hasSize(1)
103+
.first(InstanceOfAssertFactories.type(MetricsApplicationEventListener.class))
104+
.satisfies((listener) -> assertThat(listener).extracting("tagsProvider")
105+
.isInstanceOf(JerseyTagsProviderAdapter.class));
106+
});
107+
}
108+
90109
@Test
91110
void httpRequestsAreTimed() {
92111
this.webContextRunner.run((context) -> {
@@ -161,4 +180,31 @@ public Iterable<Tag> httpLongRequestTags(RequestEvent event) {
161180

162181
}
163182

183+
@SuppressWarnings("deprecation")
184+
@Configuration(proxyBeanMethods = false)
185+
static class CustomMicrometerJerseyTagsProviderConfiguration {
186+
187+
@Bean
188+
io.micrometer.core.instrument.binder.jersey.server.JerseyTagsProvider customJerseyTagsProvider() {
189+
return new CustomMicrometerJerseyTagsProvider();
190+
}
191+
192+
}
193+
194+
@SuppressWarnings("deprecation")
195+
static class CustomMicrometerJerseyTagsProvider
196+
implements io.micrometer.core.instrument.binder.jersey.server.JerseyTagsProvider {
197+
198+
@Override
199+
public Iterable<Tag> httpRequestTags(RequestEvent event) {
200+
return null;
201+
}
202+
203+
@Override
204+
public Iterable<Tag> httpLongRequestTags(RequestEvent event) {
205+
return null;
206+
}
207+
208+
}
209+
164210
}

0 commit comments

Comments
 (0)