|
19 | 19 | import io.micrometer.core.instrument.config.MeterFilter;
|
20 | 20 | import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
|
21 | 21 | import io.micronaut.configuration.metrics.annotation.RequiresMetrics;
|
| 22 | +import io.micronaut.configuration.metrics.binder.web.config.HttpClientMeterConfig; |
| 23 | +import io.micronaut.configuration.metrics.binder.web.config.HttpMeterConfig; |
| 24 | +import io.micronaut.configuration.metrics.binder.web.config.HttpServerMeterConfig; |
22 | 25 | import io.micronaut.context.annotation.Bean;
|
23 | 26 | import io.micronaut.context.annotation.Factory;
|
24 | 27 | import io.micronaut.context.annotation.Requires;
|
25 |
| -import io.micronaut.context.annotation.Value; |
26 |
| -import io.micronaut.core.util.ArrayUtils; |
27 | 28 | import jakarta.inject.Singleton;
|
28 | 29 |
|
29 |
| -import static io.micronaut.configuration.metrics.binder.web.WebMetricsPublisher.METRIC_HTTP_CLIENT_REQUESTS; |
30 |
| -import static io.micronaut.configuration.metrics.binder.web.WebMetricsPublisher.METRIC_HTTP_SERVER_REQUESTS; |
| 30 | +import java.util.Arrays; |
| 31 | + |
31 | 32 | import static io.micronaut.configuration.metrics.micrometer.MeterRegistryFactory.MICRONAUT_METRICS_BINDERS;
|
32 | 33 | import static io.micronaut.core.util.StringUtils.FALSE;
|
33 | 34 |
|
|
41 | 42 | @Requires(property = WebMetricsPublisher.ENABLED, notEquals = FALSE)
|
42 | 43 | public class HttpMeterFilterFactory {
|
43 | 44 |
|
| 45 | + public static final double SECONDS_TO_NANOS = 1_000_000_000d; |
| 46 | + |
44 | 47 | /**
|
45 | 48 | * Configure new MeterFilter for http.server.requests metrics.
|
46 | 49 | *
|
47 |
| - * @param percentiles The percentiles |
| 50 | + * @param serverMeterConfig The HttpMeter configuration |
48 | 51 | * @return A MeterFilter
|
49 | 52 | */
|
50 | 53 | @Bean
|
51 | 54 | @Singleton
|
52 |
| - @Requires(property = MICRONAUT_METRICS_BINDERS + ".web.server.percentiles") |
53 |
| - MeterFilter addServerPercentileMeterFilter(@Value("${" + MICRONAUT_METRICS_BINDERS + ".web.server.percentiles}") Double[] percentiles) { |
54 |
| - return getMeterFilter(percentiles, METRIC_HTTP_SERVER_REQUESTS); |
| 55 | + @Requires(property = MICRONAUT_METRICS_BINDERS + ".web.server") |
| 56 | + MeterFilter addServerPercentileMeterFilter(HttpServerMeterConfig serverMeterConfig) { |
| 57 | + return getMeterFilter(serverMeterConfig, WebMetricsPublisher.METRIC_HTTP_SERVER_REQUESTS); |
55 | 58 | }
|
56 | 59 |
|
57 | 60 | /**
|
58 | 61 | * Configure new MeterFilter for http.client.requests metrics.
|
59 | 62 | *
|
60 |
| - * @param percentiles The percentiles |
| 63 | + * @param clientMeterConfig The HttpMeter configuration |
61 | 64 | * @return A MeterFilter
|
62 | 65 | */
|
63 | 66 | @Bean
|
64 | 67 | @Singleton
|
65 |
| - @Requires(property = MICRONAUT_METRICS_BINDERS + ".web.client.percentiles") |
66 |
| - MeterFilter addClientPercentileMeterFilter(@Value("${" + MICRONAUT_METRICS_BINDERS + ".web.client.percentiles}") Double[] percentiles) { |
67 |
| - return getMeterFilter(percentiles, METRIC_HTTP_CLIENT_REQUESTS); |
| 68 | + @Requires(property = MICRONAUT_METRICS_BINDERS + ".web.client") |
| 69 | + MeterFilter addClientPercentileMeterFilter(HttpClientMeterConfig clientMeterConfig) { |
| 70 | + return getMeterFilter(clientMeterConfig, WebMetricsPublisher.METRIC_HTTP_CLIENT_REQUESTS); |
68 | 71 | }
|
69 | 72 |
|
70 |
| - private MeterFilter getMeterFilter(Double[] percentiles, String metricNamePrefix) { |
| 73 | + private MeterFilter getMeterFilter(HttpMeterConfig meterConfig, String metricNamePrefix) { |
71 | 74 | return new MeterFilter() {
|
72 | 75 | @Override
|
73 | 76 | public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {
|
74 | 77 | if (id.getName().startsWith(metricNamePrefix)) {
|
75 |
| - return DistributionStatisticConfig.builder() |
76 |
| - .percentiles((double[]) ArrayUtils.toPrimitiveArray(percentiles)) |
77 |
| - .build() |
78 |
| - .merge(config); |
| 78 | + var builder = DistributionStatisticConfig.builder() |
| 79 | + .percentiles() |
| 80 | + .percentiles(Arrays.stream(meterConfig.getPercentiles()).mapToDouble(Double::doubleValue).toArray()) |
| 81 | + .serviceLevelObjectives(Arrays.stream(meterConfig.getSlos()).mapToDouble(d -> d * SECONDS_TO_NANOS).toArray()) |
| 82 | + .percentilesHistogram(meterConfig.getHistogram()); |
| 83 | + |
| 84 | + if (meterConfig.getMin() != null) { |
| 85 | + builder.minimumExpectedValue(meterConfig.getMin() * SECONDS_TO_NANOS); |
| 86 | + } |
| 87 | + |
| 88 | + if (meterConfig.getMax() != null) { |
| 89 | + builder.maximumExpectedValue(meterConfig.getMax() * SECONDS_TO_NANOS); |
| 90 | + } |
| 91 | + |
| 92 | + return builder.build().merge(config); |
79 | 93 | }
|
80 | 94 | return config;
|
81 | 95 | }
|
|
0 commit comments