Skip to content

Commit 00d421f

Browse files
authored
Add armeria-prometheus1 module for Prometheus version 1 and deprecate older classes. (#5698)
Motivation: Micrometer 1.13.0 updates its Prometheus dependency from 0.x to 1.x. In Prometheus 1.x, the package of `PrometheusMeterRegistry` has changed and `CollectorRegistry` is no longer used. More details can be found in the [migration guide](https://github.com/micrometer-metrics/micrometer/wiki/1.13-Migration-Guide). Modifications: - Updated Micrometer from 1.12.4 to 1.13.0. - Removed the Micrometer 1.3 integration test module. - We dropped supporting Micrometer <= 1.5 already: #5661 - Updated Prometheus from 0.16.0 to 1.3.0. - Added `armeria-prometheus1` module. - `PrometheusMeterRegistries`, `PrometheusVersion1ExpositionService`, and its builder classes are added. - Deprecated `PrometheusMeterRegistries`, `PrometheusExpositionService`, and its builder classes. Result: - The older `PrometheusMeterRegistries`, `PrometheusExpositionService`, and its builders are deprecated. - Use the same classes in the `armeria-prometheus1`.
1 parent 7f2aa00 commit 00d421f

File tree

62 files changed

+725
-190
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+725
-190
lines changed

core/build.gradle

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ dependencies {
105105

106106
// Micrometer and other metric-related stuff
107107
api libs.micrometer.core
108-
optionalApi libs.micrometer.prometheus
108+
optionalApi libs.micrometer.prometheus.legacy
109109
optionalApi libs.dropwizard.metrics.core
110-
optionalApi libs.prometheus
110+
optionalApi libs.prometheus.legacy
111111

112112
// Netty
113113
api libs.netty.transport
@@ -154,6 +154,8 @@ dependencies {
154154
// Jetty, for testing interoperability with other servers.
155155
testImplementation libs.jetty94.webapp
156156

157+
testImplementation project(':prometheus1')
158+
157159
// Brotli
158160
implementation libs.brotli4j
159161
optionalImplementation libs.brotli4j.linux

core/src/main/java/com/linecorp/armeria/common/metric/PrometheusMeterRegistries.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@
2727
/**
2828
* Provides the convenient factory methods for {@link PrometheusMeterRegistry} with more sensible defaults for
2929
* {@link NamingConvention}.
30+
*
31+
* @deprecated Use {@code PrometheusMeterRegistries} in {@code armeria-prometheus1} module instead.
3032
*/
33+
@Deprecated
3134
public final class PrometheusMeterRegistries {
3235

3336
private static final PrometheusMeterRegistry defaultRegistry =

core/src/main/java/com/linecorp/armeria/server/metric/PrometheusExpositionService.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@
4242
/**
4343
* Exposes Prometheus metrics in <a href="https://prometheus.io/docs/instrumenting/exposition_formats/">text
4444
* format 0.0.4 or OpenMetrics format</a>.
45+
*
46+
* @deprecated Use {@code PrometheusExpositionService} in {@code armeria-prometheus1} module instead.
4547
*/
48+
@Deprecated
4649
public final class PrometheusExpositionService extends AbstractHttpService implements TransientHttpService {
4750

4851
/**
@@ -106,7 +109,7 @@ protected HttpResponse doGet(ServiceRequestContext ctx, HttpRequest req) throws
106109
final ByteBuf buffer = ctx.alloc().buffer();
107110
boolean success = false;
108111
try (ByteBufOutputStream byteBufOutputStream = new ByteBufOutputStream(buffer);
109-
OutputStreamWriter writer = new OutputStreamWriter(byteBufOutputStream)) {
112+
OutputStreamWriter writer = new OutputStreamWriter(byteBufOutputStream)) {
110113
TextFormat.writeFormat(format, writer, collectorRegistry.metricFamilySamples());
111114
success = true;
112115
} finally {

core/src/main/java/com/linecorp/armeria/server/metric/PrometheusExpositionServiceBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@
2525

2626
/**
2727
* Builds a {@link PrometheusExpositionService}.
28+
*
29+
* @deprecated Use {@code PrometheusExpositionServiceBuilder} in {@code armeria-prometheus1} module instead.
2830
*/
31+
@Deprecated
2932
public final class PrometheusExpositionServiceBuilder implements TransientServiceBuilder {
3033

3134
private final CollectorRegistry collectorRegistry;

core/src/test/java/com/linecorp/armeria/client/ConnectionPoolCollectingMetricTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
import com.linecorp.armeria.common.SessionProtocol;
2626
import com.linecorp.armeria.common.metric.MoreMeters;
27-
import com.linecorp.armeria.common.metric.PrometheusMeterRegistries;
27+
import com.linecorp.armeria.common.prometheus.PrometheusMeterRegistries;
2828

2929
import io.micrometer.core.instrument.MeterRegistry;
3030
import io.netty.util.AttributeMap;

core/src/test/java/com/linecorp/armeria/client/RefreshingAddressResolverTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
import com.linecorp.armeria.client.endpoint.dns.TestDnsServer;
5353
import com.linecorp.armeria.client.retry.Backoff;
5454
import com.linecorp.armeria.common.annotation.Nullable;
55-
import com.linecorp.armeria.common.metric.PrometheusMeterRegistries;
55+
import com.linecorp.armeria.common.prometheus.PrometheusMeterRegistries;
5656
import com.linecorp.armeria.internal.client.dns.ByteArrayDnsRecord;
5757
import com.linecorp.armeria.internal.client.dns.DnsQuestionWithoutTrailingDot;
5858
import com.linecorp.armeria.testing.junit5.common.EventLoopExtension;

core/src/test/java/com/linecorp/armeria/client/circuitbreaker/MetricCollectingCircuitBreakerListenerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import org.junit.jupiter.api.Test;
2222

2323
import com.linecorp.armeria.common.metric.MoreMeters;
24-
import com.linecorp.armeria.common.metric.PrometheusMeterRegistries;
24+
import com.linecorp.armeria.common.prometheus.PrometheusMeterRegistries;
2525

2626
import io.micrometer.core.instrument.MeterRegistry;
2727

core/src/test/java/com/linecorp/armeria/client/endpoint/healthcheck/HealthCheckedEndpointGroupIntegrationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
import com.linecorp.armeria.client.logging.LoggingClient;
3737
import com.linecorp.armeria.common.SessionProtocol;
3838
import com.linecorp.armeria.common.metric.MoreMeters;
39-
import com.linecorp.armeria.common.metric.PrometheusMeterRegistries;
39+
import com.linecorp.armeria.common.prometheus.PrometheusMeterRegistries;
4040
import com.linecorp.armeria.server.ServerBuilder;
4141
import com.linecorp.armeria.server.healthcheck.HealthCheckService;
4242
import com.linecorp.armeria.testing.junit5.server.ServerExtension;

core/src/test/java/com/linecorp/armeria/common/metric/DropwizardMeterRegistriesTest.java

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,26 @@
2121
import static org.assertj.core.api.Assertions.fail;
2222

2323
import java.time.Duration;
24-
import java.util.Enumeration;
24+
import java.util.List;
2525
import java.util.Map;
2626
import java.util.concurrent.TimeUnit;
2727

2828
import org.junit.jupiter.api.Test;
2929

3030
import com.codahale.metrics.MetricRegistry;
31-
import com.google.common.collect.ImmutableList;
31+
32+
import com.linecorp.armeria.common.prometheus.PrometheusMeterRegistries;
3233

3334
import io.micrometer.core.instrument.Clock;
3435
import io.micrometer.core.instrument.DistributionSummary;
3536
import io.micrometer.core.instrument.Timer;
3637
import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
3738
import io.micrometer.core.instrument.dropwizard.DropwizardMeterRegistry;
38-
import io.micrometer.prometheus.PrometheusMeterRegistry;
39-
import io.prometheus.client.Collector.MetricFamilySamples;
40-
import io.prometheus.client.Collector.MetricFamilySamples.Sample;
39+
import io.micrometer.prometheusmetrics.PrometheusMeterRegistry;
40+
import io.prometheus.metrics.model.snapshots.DataPointSnapshot;
41+
import io.prometheus.metrics.model.snapshots.MetricMetadata;
42+
import io.prometheus.metrics.model.snapshots.MetricSnapshot;
43+
import io.prometheus.metrics.model.snapshots.SummarySnapshot.SummaryDataPointSnapshot;
4144

4245
class DropwizardMeterRegistriesTest {
4346
@Test
@@ -131,24 +134,33 @@ void filteredGaugesDoNotAffectOthers() {
131134
assertThat(dropwizard.getDropwizardRegistry().getMetrics()).containsOnlyKeys("summary");
132135

133136
// Make sure Prometheus registry collects all samples.
134-
final MetricFamilySamples prometheusSamples = findPrometheusSample(prometheus, "summary");
135-
assertThat(prometheusSamples.samples).containsExactly(
136-
new Sample("summary", ImmutableList.of("quantile"), ImmutableList.of("0.5"), 42),
137-
new Sample("summary", ImmutableList.of("quantile"), ImmutableList.of("0.99"), 42),
138-
new Sample("summary_count", ImmutableList.of(), ImmutableList.of(), 1),
139-
new Sample("summary_sum", ImmutableList.of(), ImmutableList.of(), 42));
137+
final List<? extends DataPointSnapshot> dataPointSnapshots =
138+
findPrometheusDataPointSnapshot(prometheus, "summary");
139+
assertThat(dataPointSnapshots.size()).isOne();
140+
final DataPointSnapshot snapshot = dataPointSnapshots.get(0);
141+
assertThat(snapshot).isInstanceOf(SummaryDataPointSnapshot.class);
142+
// SummaryDataPointSnapshot and its values do not override equals().
143+
final SummaryDataPointSnapshot summarySnapshot = (SummaryDataPointSnapshot) snapshot;
144+
assertThat(summarySnapshot.getCount()).isOne();
145+
assertThat(summarySnapshot.getSum()).isEqualTo(42.0);
146+
assertThat(summarySnapshot.getQuantiles().size()).isEqualTo(2);
147+
assertThat(summarySnapshot.getQuantiles().get(0).getQuantile()).isEqualTo(0.5);
148+
assertThat(summarySnapshot.getQuantiles().get(0).getValue()).isEqualTo(42.0);
149+
assertThat(summarySnapshot.getQuantiles().get(1).getQuantile()).isEqualTo(0.99);
150+
assertThat(summarySnapshot.getQuantiles().get(1).getValue()).isEqualTo(42.0);
140151
}
141152

142-
private static MetricFamilySamples findPrometheusSample(PrometheusMeterRegistry registry, String name) {
143-
for (final Enumeration<MetricFamilySamples> e = registry.getPrometheusRegistry().metricFamilySamples();
144-
e.hasMoreElements();) {
145-
final MetricFamilySamples samples = e.nextElement();
146-
if (name.equals(samples.name)) {
147-
return samples;
153+
private static List<? extends DataPointSnapshot> findPrometheusDataPointSnapshot(
154+
PrometheusMeterRegistry registry, String name) {
155+
for (final MetricSnapshot snapshot : registry.getPrometheusRegistry().scrape()) {
156+
final MetricMetadata metadata = snapshot.getMetadata();
157+
if (name.equals(metadata.getName())) {
158+
return snapshot.getDataPoints();
148159
}
149160
}
150161

151162
fail("Could not find a Prometheus sample: " + name);
152163
throw new Error(); // Never reaches here.
153164
}
154165
}
166+

core/src/test/java/com/linecorp/armeria/common/metric/MeterIdPrefixFunctionTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.linecorp.armeria.common.annotation.Nullable;
3232
import com.linecorp.armeria.common.logging.RequestLog;
3333
import com.linecorp.armeria.common.logging.RequestOnlyLog;
34+
import com.linecorp.armeria.common.prometheus.PrometheusMeterRegistries;
3435
import com.linecorp.armeria.server.ServiceRequestContext;
3536

3637
import io.micrometer.core.instrument.MeterRegistry;

0 commit comments

Comments
 (0)