Я провел несколько дней и не смог заставить его работать, новичок в инструментах весной.
У меня есть приложение Spring Boot 2. В pom.xml
я определил:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-statsd</artifactId>
<version>1.1.5</version>
</dependency>
В application.conf
:
management.metrics.export.statsd.host=localhost
management.metrics.export.statsd.port=8125
management.metrics.export.statsd.flavor=etsy
management.metrics.export.statsd.step=2m
management.metrics.export.statsd.enabled=true
management.endpoints.web.exposure.include=health,metrics
В приложении при его запуске я хочу экспортировать новую метрику (счетчик):
@SpringBootApplication
public class MyApplication {
private static final Logger LOG = LoggerFactory.getLogger(MyApplication.class);
private static final StatsdConfig config = new StatsdConfig() {
@Override
public String get(String k) { return null; }
@Override
public StatsdFlavor flavor() { return StatsdFlavor.ETSY; }
};
private static final MeterRegistry registry = new StatsdMeterRegistry(config, Clock.SYSTEM);
public static void main(String[] args) {
// globalRegistry is composite hence was hoping they will unite into one
Metrics.globalRegistry.add(registry);
Counter myCounter = Counter
.builder("myCounter")
.description("indicates instance count of the object")
.tags("dev", "performance")
.register(registry);
// .register(Metrics.globalRegistry);
myCounter.increment(2.0);
LOG.info("Counter: " + myCounter.count());
SpringApplication.run(MyApplication.class, args);
}
}
Если он закодирован, как указано выше, он недоступен в http://localhost:8081/actuator/metrics/myCounter. Но если я раскомментирую .register(Metrics.globalRegistry);
и прокомментирую предыдущую строку, то http://localhost:8081/actuator/metrics/myCounter будет содержать метрику, но ее значение будет 0.0
вместо 2.0
.
Я хочу, чтобы мой настраиваемый реестр содержал настраиваемые метрики, определенные в приложении, и чтобы он был правильно зарегистрирован и доступен в конечной точке метрик, после чего его можно будет экспортировать в StatsD. Знаете ли вы, что мне не хватает в приведенном выше?
Я следил за этими документами https://www.baeldung.com/микрометр и https://micrometer.io/docs/registry/statsD. Как создать bean-компонент для моего кода или, альтернативно, как использовать автоматически настраиваемый реестр с помощью Spring Boot?
Автоконфигурация Spring Boot Micrometer автоматически вызывает любые MeterBinder
bean-компоненты, чтобы привязать их счетчики к автоматически настроенным MeterRegistry
. С необходимыми зависимостями StatsD от пути к классам, которые у вас уже есть, это будет реестр на основе StatsD. Я бы рекомендовал использовать эту автоматическую настройку, а не настраивать все самостоятельно. В настоящее время у вас будет как автоматически настроенный реестр, так и ваш собственный. Автоматически настроенный реестр будет отключен и не будет создан, если вы выставите свой реестр как компонент Spring.
Я бы рекомендовал удалить ваши StatsdConfig
и StatsdMeterRegistry
и вместо этого использовать автонастройку. Затем вы можете использовать боб MeterBinder
, чтобы связать свой счетчик. В результате основной класс вашего приложения будет выглядеть примерно так:
@SpringBootApplication
public class MyApplication {
@Bean
public MeterBinder exampleMeterBinder() {
return (meterRegistry) -> Counter.builder("myCounter")
.description("indicates instance count of the object")
.tags("dev", "performance")
.register(meterRegistry);
}
public static void main(String[] args) {
SpringApplication.run(MyApplication, args);
}
}
Обычно вы храните его в bean-компоненте, из которого вы можете получить счетчик или вызвать, чтобы он увеличил его. Вы бы определили этот bean-компонент с помощью другого метода @Bean
и получили бы к нему доступ в своем методе main
, вызвав getBean
в контексте приложения, возвращенном из run
.
Мне нравится ваше решение, как я могу получить доступ к счетчику, чтобы увеличить его внутри основного метода? Пытаюсь что-то вроде
Metrics.globalRegistry.get('myCounter')
в данный момент...