Migrate to updated micrometer Tags class
See gh-11575
This commit is contained in:
@@ -20,7 +20,6 @@ import java.util.Map;
|
||||
|
||||
import com.rabbitmq.client.ConnectionFactory;
|
||||
import io.micrometer.core.instrument.MeterRegistry;
|
||||
import io.micrometer.core.instrument.Tag;
|
||||
import io.micrometer.core.instrument.Tags;
|
||||
|
||||
import org.springframework.amqp.rabbit.connection.AbstractConnectionFactory;
|
||||
@@ -66,9 +65,11 @@ public class RabbitMetricsConfiguration {
|
||||
|
||||
private void bindConnectionFactoryToRegistry(String beanName,
|
||||
AbstractConnectionFactory connectionFactory) {
|
||||
Iterable<Tag> tags = Tags.zip("name", getConnectionFactoryName(beanName));
|
||||
new RabbitMetrics(connectionFactory.getRabbitConnectionFactory(), this.metricName,
|
||||
tags).bindTo(this.registry);
|
||||
ConnectionFactory rabbitConnectionFactory = connectionFactory
|
||||
.getRabbitConnectionFactory();
|
||||
String connectionFactoryName = getConnectionFactoryName(beanName);
|
||||
new RabbitMetrics(rabbitConnectionFactory, this.metricName,
|
||||
Tags.of("name", connectionFactoryName)).bindTo(this.registry);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -22,7 +22,6 @@ import java.util.Map;
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import io.micrometer.core.instrument.MeterRegistry;
|
||||
import io.micrometer.core.instrument.Tag;
|
||||
import io.micrometer.core.instrument.Tags;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -68,9 +67,9 @@ public class DataSourcePoolMetricsConfiguration {
|
||||
}
|
||||
|
||||
private void bindDataSourceToRegistry(String beanName, DataSource dataSource) {
|
||||
Iterable<Tag> tags = Tags.zip("name", getDataSourceName(beanName));
|
||||
String dataSourceName = getDataSourceName(beanName);
|
||||
new DataSourcePoolMetrics(dataSource, this.metadataProviders, this.metricName,
|
||||
tags).bindTo(this.registry);
|
||||
Tags.of("name", dataSourceName)).bindTo(this.registry);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -16,10 +16,7 @@
|
||||
|
||||
package org.springframework.boot.actuate.metrics.cache;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import io.micrometer.core.instrument.MeterRegistry;
|
||||
import io.micrometer.core.instrument.Tag;
|
||||
@@ -69,8 +66,7 @@ public class CacheMetricsRegistrar {
|
||||
* @return {@code true} if the {@code cache} is supported and was registered
|
||||
*/
|
||||
public boolean bindCacheToRegistry(Cache cache, Tag... tags) {
|
||||
List<Tag> allTags = new ArrayList<>(Arrays.asList(tags));
|
||||
MeterBinder meterBinder = getMeterBinder(cache, allTags);
|
||||
MeterBinder meterBinder = getMeterBinder(cache, Tags.of(tags));
|
||||
if (meterBinder != null) {
|
||||
meterBinder.bindTo(this.registry);
|
||||
return true;
|
||||
@@ -79,8 +75,8 @@ public class CacheMetricsRegistrar {
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
private MeterBinder getMeterBinder(Cache cache, Iterable<Tag> tags) {
|
||||
Iterable<Tag> withAdditionalTags = Tags.concat(tags, getAdditionalTags(cache));
|
||||
private MeterBinder getMeterBinder(Cache cache, Tags tags) {
|
||||
tags = tags.and(getAdditionalTags(cache));
|
||||
for (CacheMeterBinderProvider<?> binderProvider : this.binderProviders) {
|
||||
Class<?> cacheType = ResolvableType
|
||||
.forClass(CacheMeterBinderProvider.class, binderProvider.getClass())
|
||||
@@ -88,7 +84,7 @@ public class CacheMetricsRegistrar {
|
||||
if (cacheType.isInstance(cache)) {
|
||||
try {
|
||||
MeterBinder meterBinder = ((CacheMeterBinderProvider) binderProvider)
|
||||
.getMeterBinder(cache, this.metricName, withAdditionalTags);
|
||||
.getMeterBinder(cache, this.metricName, tags);
|
||||
if (meterBinder != null) {
|
||||
return meterBinder;
|
||||
}
|
||||
@@ -121,7 +117,7 @@ public class CacheMetricsRegistrar {
|
||||
* @return a list of additional tags to associate to that {@code cache}.
|
||||
*/
|
||||
protected Iterable<Tag> getAdditionalTags(Cache cache) {
|
||||
return Tags.zip("name", cache.getName());
|
||||
return Tags.of("name", cache.getName());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -45,7 +45,7 @@ import org.springframework.integration.support.management.PollableChannelManagem
|
||||
*/
|
||||
public class SpringIntegrationMetrics implements MeterBinder, SmartInitializingSingleton {
|
||||
|
||||
private final Iterable<Tag> tags;
|
||||
private final Tags tags;
|
||||
|
||||
private Collection<MeterRegistry> registries = new ArrayList<>();
|
||||
|
||||
@@ -56,9 +56,9 @@ public class SpringIntegrationMetrics implements MeterBinder, SmartInitializingS
|
||||
}
|
||||
|
||||
public SpringIntegrationMetrics(IntegrationManagementConfigurer configurer,
|
||||
Iterable<Tag> tags) {
|
||||
Iterable<? extends Tag> tags) {
|
||||
this.configurer = configurer;
|
||||
this.tags = tags;
|
||||
this.tags = Tags.of(tags);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -81,7 +81,7 @@ public class SpringIntegrationMetrics implements MeterBinder, SmartInitializingS
|
||||
private void addSourceMetrics(MeterRegistry registry) {
|
||||
for (String source : this.configurer.getSourceNames()) {
|
||||
MessageSourceMetrics sourceMetrics = this.configurer.getSourceMetrics(source);
|
||||
Iterable<Tag> tagsWithSource = Tags.concat(this.tags, "source", source);
|
||||
Iterable<Tag> tagsWithSource = this.tags.and("source", source);
|
||||
registerFunctionCounter(registry, sourceMetrics, tagsWithSource,
|
||||
"spring.integration.source.messages",
|
||||
"The number of successful handler calls",
|
||||
@@ -93,7 +93,7 @@ public class SpringIntegrationMetrics implements MeterBinder, SmartInitializingS
|
||||
for (String handler : this.configurer.getHandlerNames()) {
|
||||
MessageHandlerMetrics handlerMetrics = this.configurer
|
||||
.getHandlerMetrics(handler);
|
||||
Iterable<Tag> tagsWithHandler = Tags.concat(this.tags, "handler", handler);
|
||||
Iterable<Tag> tagsWithHandler = this.tags.and("handler", handler);
|
||||
registerTimedGauge(registry, handlerMetrics, tagsWithHandler,
|
||||
"spring.integration.handler.duration.max",
|
||||
"The maximum handler duration",
|
||||
@@ -116,7 +116,7 @@ public class SpringIntegrationMetrics implements MeterBinder, SmartInitializingS
|
||||
for (String channel : this.configurer.getChannelNames()) {
|
||||
MessageChannelMetrics channelMetrics = this.configurer
|
||||
.getChannelMetrics(channel);
|
||||
Iterable<Tag> tagsWithChannel = Tags.concat(this.tags, "channel", channel);
|
||||
Iterable<Tag> tagsWithChannel = this.tags.and("channel", channel);
|
||||
registerFunctionCounter(registry, channelMetrics, tagsWithChannel,
|
||||
"spring.integration.channel.sendErrors",
|
||||
"The number of failed sends (either throwing an exception or rejected by the channel)",
|
||||
|
||||
@@ -16,17 +16,17 @@
|
||||
|
||||
package org.springframework.boot.actuate.metrics.web.reactive.server;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
import io.micrometer.core.instrument.MeterRegistry;
|
||||
import io.micrometer.core.instrument.Tag;
|
||||
import io.micrometer.core.instrument.Tags;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.web.reactive.function.server.HandlerFilterFunction;
|
||||
import org.springframework.web.reactive.function.server.HandlerFunction;
|
||||
import org.springframework.web.reactive.function.server.RouterFunction;
|
||||
import org.springframework.web.reactive.function.server.ServerRequest;
|
||||
import org.springframework.web.reactive.function.server.ServerResponse;
|
||||
@@ -41,53 +41,53 @@ public class RouterFunctionMetrics {
|
||||
|
||||
private final MeterRegistry registry;
|
||||
|
||||
private BiFunction<ServerRequest, ServerResponse, Collection<Tag>> defaultTags = (
|
||||
ServerRequest request, ServerResponse response) -> response != null
|
||||
? Arrays.asList(method(request), status(response))
|
||||
: Collections.singletonList(method(request));
|
||||
private final BiFunction<ServerRequest, ServerResponse, Iterable<Tag>> defaultTags;
|
||||
|
||||
public RouterFunctionMetrics(MeterRegistry registry) {
|
||||
Assert.notNull(registry, "Registry must not be null");
|
||||
this.registry = registry;
|
||||
this.defaultTags = this::defaultTags;
|
||||
}
|
||||
|
||||
private RouterFunctionMetrics(MeterRegistry registry,
|
||||
BiFunction<ServerRequest, ServerResponse, Iterable<Tag>> defaultTags) {
|
||||
Assert.notNull(registry, "Registry must not be null");
|
||||
Assert.notNull(defaultTags, "DefaultTags must not be null");
|
||||
this.registry = registry;
|
||||
this.defaultTags = defaultTags;
|
||||
}
|
||||
|
||||
private Iterable<Tag> defaultTags(ServerRequest request, ServerResponse response) {
|
||||
if (response == null) {
|
||||
return Tags.of(getMethodTag(request));
|
||||
}
|
||||
return Tags.of(getMethodTag(request), getStatusTag(response));
|
||||
}
|
||||
|
||||
/**
|
||||
* Configures the default tags.
|
||||
* Returns a new {@link RouterFunctionMetrics} instance with the specified default
|
||||
* tags.
|
||||
* @param defaultTags Generate a list of tags to apply to the timer.
|
||||
* {@code ServerResponse} may be null.
|
||||
* @return {@code this} for further configuration
|
||||
*/
|
||||
public RouterFunctionMetrics defaultTags(
|
||||
BiFunction<ServerRequest, ServerResponse, Collection<Tag>> defaultTags) {
|
||||
this.defaultTags = defaultTags;
|
||||
return this;
|
||||
BiFunction<ServerRequest, ServerResponse, Iterable<Tag>> defaultTags) {
|
||||
return new RouterFunctionMetrics(this.registry, defaultTags);
|
||||
}
|
||||
|
||||
public HandlerFilterFunction<ServerResponse, ServerResponse> timer(String name) {
|
||||
return timer(name, Collections.emptyList());
|
||||
return timer(name, Tags.empty());
|
||||
}
|
||||
|
||||
public HandlerFilterFunction<ServerResponse, ServerResponse> timer(String name,
|
||||
String... tags) {
|
||||
return timer(name, Tags.zip(tags));
|
||||
return timer(name, Tags.of(tags));
|
||||
}
|
||||
|
||||
public HandlerFilterFunction<ServerResponse, ServerResponse> timer(String name,
|
||||
Iterable<Tag> tags) {
|
||||
return (request, next) -> {
|
||||
final long start = System.nanoTime();
|
||||
return next.handle(request).doOnSuccess((response) -> {
|
||||
Iterable<Tag> allTags = Tags.concat(tags,
|
||||
this.defaultTags.apply(request, response));
|
||||
this.registry.timer(name, allTags).record(System.nanoTime() - start,
|
||||
TimeUnit.NANOSECONDS);
|
||||
}).doOnError((error) -> {
|
||||
// FIXME how do we get the response under an error condition?
|
||||
Iterable<Tag> allTags = Tags.concat(tags,
|
||||
this.defaultTags.apply(request, null));
|
||||
this.registry.timer(name, allTags).record(System.nanoTime() - start,
|
||||
TimeUnit.NANOSECONDS);
|
||||
});
|
||||
};
|
||||
return new MetricsFilter(name, Tags.of(tags));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -95,7 +95,7 @@ public class RouterFunctionMetrics {
|
||||
* @param request The HTTP request.
|
||||
* @return A "method" tag whose value is a capitalized method (e.g. GET).
|
||||
*/
|
||||
public static Tag method(ServerRequest request) {
|
||||
public static Tag getMethodTag(ServerRequest request) {
|
||||
return Tag.of("method", request.method().toString());
|
||||
}
|
||||
|
||||
@@ -104,8 +104,48 @@ public class RouterFunctionMetrics {
|
||||
* @param response The HTTP response.
|
||||
* @return A "status" tag whose value is the numeric status code.
|
||||
*/
|
||||
public static Tag status(ServerResponse response) {
|
||||
public static Tag getStatusTag(ServerResponse response) {
|
||||
return Tag.of("status", response.statusCode().toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link HandlerFilterFunction} to handle calling micrometer.
|
||||
*/
|
||||
private class MetricsFilter
|
||||
implements HandlerFilterFunction<ServerResponse, ServerResponse> {
|
||||
|
||||
private final String name;
|
||||
|
||||
private final Tags tags;
|
||||
|
||||
MetricsFilter(String name, Tags tags) {
|
||||
this.name = name;
|
||||
this.tags = tags;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<ServerResponse> filter(ServerRequest request,
|
||||
HandlerFunction<ServerResponse> next) {
|
||||
long start = System.nanoTime();
|
||||
return next.handle(request).doOnSuccess((response) -> {
|
||||
timer(start, request, response);
|
||||
}).doOnError((error) -> {
|
||||
// FIXME how do we get the response under an error condition?
|
||||
timer(start, request, null);
|
||||
});
|
||||
}
|
||||
|
||||
private Iterable<Tag> getDefaultTags(ServerRequest request,
|
||||
ServerResponse response) {
|
||||
return RouterFunctionMetrics.this.defaultTags.apply(request, response);
|
||||
}
|
||||
|
||||
private void timer(long start, ServerRequest request, ServerResponse response) {
|
||||
Tags allTags = this.tags.and(getDefaultTags(request, response));
|
||||
RouterFunctionMetrics.this.registry.timer(this.name, allTags)
|
||||
.record(System.nanoTime() - start, TimeUnit.NANOSECONDS);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -34,7 +34,6 @@ import io.micrometer.core.annotation.Timed;
|
||||
import io.micrometer.core.annotation.TimedSet;
|
||||
import io.micrometer.core.instrument.LongTaskTimer;
|
||||
import io.micrometer.core.instrument.MeterRegistry;
|
||||
import io.micrometer.core.instrument.Tag;
|
||||
import io.micrometer.core.instrument.Tags;
|
||||
import io.micrometer.core.instrument.Timer;
|
||||
import org.apache.commons.logging.Log;
|
||||
@@ -252,7 +251,7 @@ public class WebMvcMetrics {
|
||||
|
||||
private final String name;
|
||||
|
||||
private final Iterable<Tag> extraTags;
|
||||
private final Tags extraTags;
|
||||
|
||||
private final double[] percentiles;
|
||||
|
||||
@@ -260,14 +259,14 @@ public class WebMvcMetrics {
|
||||
|
||||
TimerConfig(String name, boolean histogram) {
|
||||
this.name = name;
|
||||
this.extraTags = Collections.emptyList();
|
||||
this.extraTags = Tags.empty();
|
||||
this.percentiles = new double[0];
|
||||
this.histogram = histogram;
|
||||
}
|
||||
|
||||
TimerConfig(Timed timed, Supplier<String> name) {
|
||||
this.name = buildName(timed, name);
|
||||
this.extraTags = Tags.zip(timed.extraTags());
|
||||
this.extraTags = Tags.of(timed.extraTags());
|
||||
this.percentiles = timed.percentiles();
|
||||
this.histogram = timed.histogram();
|
||||
}
|
||||
@@ -285,7 +284,7 @@ public class WebMvcMetrics {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
Iterable<Tag> getExtraTags() {
|
||||
Tags getExtraTags() {
|
||||
return this.extraTags;
|
||||
}
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ public class RabbitMetricsTests {
|
||||
public void connectionFactoryWithTagsIsInstrumented() {
|
||||
ConnectionFactory connectionFactory = mockConnectionFactory();
|
||||
SimpleMeterRegistry registry = new SimpleMeterRegistry();
|
||||
new RabbitMetrics(connectionFactory, "test", Tags.zip("env", "prod"))
|
||||
new RabbitMetrics(connectionFactory, "test", Tags.of("env", "prod"))
|
||||
.bindTo(registry);
|
||||
assertThat(registry.get("test.connections").tags("env", "prod").meter())
|
||||
.isNotNull();
|
||||
|
||||
Reference in New Issue
Block a user