Я пытаюсь добавить метрики StatsD в загрузочное приложение Spring с помощью Micrometer.
Он работает локально, но не работает в рабочей среде, регистрируя ошибки, в которых говорится, что он не может подключиться к localhost:8125
, несмотря на то, что management.metrics.export.statsd.host
настроен правильно.
Я добавил в сервис конечную точку, которая возвращает значение свойства приложения management.metrics.export.statsd.host
, и она возвращает значение, которое я настроил, так что эта часть кажется хорошей, но по какой-то причине свойство приложения management.metrics.export.statsd.host
игнорируется микрометром.
Я добавил отчеты по метрикам StatsD в свое приложение, добавив это в файл pom.xml
:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-statsd</artifactId>
<version>1.13.1</version>
</dependency>
И добавляем это в файл application.properties
:
management.metrics.export.statsd.enabled=true
management.metrics.export.statsd.host=deliberately_broken
management.metrics.export.statsd.port=8125
На моей локальной машине он успешно выводит метрики на localhost
, несмотря на то, что deliberately_broken
является настроенным именем хоста, а на производстве он также пытается отправить метрики на localhost
, даже если это свойство приложения установлено правильно.
После многих утомительных часов поиска в Интернете и различных экспериментов я наконец нашел способ заставить это работать. Очень грустно, что ни одна документация по Spring, Micrometer или StatsD на самом деле не говорит вам, как заставить его работать даже в самом простом случае использования. Также довольно грустно, что необходимо написать кучу кода только для того, чтобы Spring/Micrometer/StatsD вел себя в соответствии с документацией.
Решение, которое я нашел, возможно, не является идеальным ответом, но оно сработало для меня. Это класс, который я добавил в свое приложение:
@Configuration
public class MicrometerConfig {
@Value("${management.metrics.export.statsd.host}")
private String host;
@Value("${management.metrics.export.statsd.port}")
private Integer port;
@Value("${management.metrics.export.statsd.enabled}")
private boolean enabled;
@Bean
@Scope("singleton")
public StatsdConfig buildStatsdConfig() {
return new StatsdConfig() {
@Override
public String get(String s) {
return s;
}
@Override
public String prefix() {
return "";
}
@Override
public boolean enabled() {
return enabled;
}
@Override
public String host() {
return host == null ? "localhost" : host;
}
@Override
public int port() {
return port == null ? 8125 : port;
}
@Override
public StatsdFlavor flavor() {
return StatsdFlavor.DATADOG;
}
@Override
public StatsdProtocol protocol() {
return StatsdProtocol.UDP;
}
@Override
public Duration pollingFrequency() {
return Duration.ofSeconds(5);
}
@Override
public Duration step() {
return Duration.ofMinutes(1);
}
};
}
@Bean
@Scope("singleton")
public StatsdMeterRegistry buildStatsdMeterRegistry(StatsdConfig statsdConfig) {
StatsdMeterRegistry registry =
StatsdMeterRegistry.builder(statsdConfig).clock(Clock.SYSTEM).build();
return registry;
}
}
После этого изменение application.properties
в соответствии с документацией Spring/Micrometer/StatsD теперь работает так, как ожидалось.
Согласно официальной документации, для Spring Boot 3.x следует использовать свойство management.statsd.metrics.export.host
.
Свойство management.metrics.export.statsd.host
ранее было в Spring Boot 2.x, которое больше не поддерживается.
Поскольку это свойство Boot, его следует найти в официальной документации Boot, см.: management.statsd.metrics.export.host
Возможно, есть место, где это задокументировано правильно, но есть сотни мест, где это неверно, поэтому найти правильный конфиг — все равно, что найти иголку в стоге сена.
Имя свойства было изменено в Boot 3.x, поэтому оно отличается для Boot 2.x и 3.x. Это сделало ссылки на старые свойства устаревшими для Boot 3.x. Единственным источником правды является официальная документация Spring Boot для той версии, которую вы используете.
Я обновил ваш ответ этой информацией.
Все места, которые я нашел, укажите
management.metrics.export.statsd.*
например docs.micrometer.io/micrometer/reference/implementations/… и многие-многие другие. Есть также много статей SO, в которых другие люди подхватили эти настройки конфигурации, например stackoverflow.com/questions/56735269/…