[英]Can't expose hystrix metrics to /actuator/prometheus after migrating application to Spring boot 2
After migrating my application (stack spring boot, camel, hystrix) to spring boot 2 from spring boot 1.5. 将我的应用程序(堆栈弹簧靴,骆驼,hystrix)从弹簧靴1.5迁移到弹簧靴2之后。 I can't get the hystrix metrics to show up in /actuator/prometheus. 我无法在/ actuator / prometheus中显示hystrix指标。
As many solutions and tutorials suggest, I've made sure I had the following dependencies 正如许多解决方案和教程所建议的那样,我确保我具有以下依赖性
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>${micrometer-version}</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<version>${micrometer-version}</version>
</dependency>
And added the following configuration class, which I'm sure it's being instantiated, as I've checked in spring boot autoconfiguration logs: 并添加了以下配置类,我已经确定它已被实例化,因为我已经在spring boot自动配置日志中进行了检查:
import io.micrometer.core.instrument.binder.hystrix.HystrixMetricsBinder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HystrixMetricsConfig {
@Bean
HystrixMetricsBinder registerHystrixMetricsBinder() {
return new HystrixMetricsBinder();
}
}
To avoid assuming such tutorials/answers were correct by definition, I've set up a simple spring boot project from scratch with a simple controller, hystrix and the above dependencies, and metrics do appear at /actuator/prometheus, without additional steps. 为了避免从定义上假设此类教程/答案是正确的,我从头开始设置了一个简单的spring boot项目,其中包含一个简单的控制器,hystrix和上述依赖项,并且指标确实出现在/ actuator / prometheus上,而没有其他步骤。
My application has more dependencies that the simple project, so I think something else might be overriding/disabling the metrics binding. 与简单项目相比,我的应用程序具有更多的依赖关系,因此我认为可能有其他事情要覆盖/禁用指标绑定。
[...]
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<exclusions>
<exclusion>
<groupId>om.netflix.archaius</groupId>
<artifactId>archaius-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
</dependency>
<!-- Camel -->
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring-security</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-swagger-java-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-servlet-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-http4</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-hystrix-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-metrics</artifactId>
</dependency>
<!-- Spring Framework Caching Support -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-spring</artifactId>
</dependency>
<!-- logging -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.ws.security</groupId>
<artifactId>wss4j</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<!-- Test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<!-- stream -->
<dependency>
<groupId>com.netflix.archaius</groupId>
<artifactId>archaius-core</artifactId>
<version>0.7.6</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>
<dependency>
<groupId>org.reactivestreams</groupId>
<artifactId>reactive-streams</artifactId>
<version>1.0.2</version>
</dependency>
</dependencies>
[...]
More than being told what the actual problem is, I'm struggling trying to understand how to troubleshoot such issues. 除了被告知实际问题是什么之外,我还在努力了解如何解决此类问题。 Is there any micrometer/Spring boot log (other than autoconfiguration report) that could be activated to understand what's going on ? 是否可以激活任何千分尺/弹簧启动日志(自动配置报告除外)以了解发生了什么?
After having followed the whole custom hystrix metrics binding procedure, I've ended up discovering everything was getting bound correctly, at least in principle. 遵循整个自定义hystrix度量标准绑定过程之后,我最终发现一切都正确地绑定了,至少在原则上如此。
I've then tried to trigger a breakpoint at the first execution of an hystrix command to check what was going on with the registry and the publisher. 然后,我尝试在首次执行hystrix命令时触发一个断点,以检查注册表和发布者的情况。 Placing a breakpoint in the method 在方法中放置断点
HystrixMetricsPublisherThreadPool getPublisherForThreadPool(HystrixThreadPoolKey threadPoolKey, HystrixThreadPoolMetrics metrics, HystrixThreadPoolProperties properties)
of HystrixMetricsPublisherFactory
class, I found out that the HystrixPlugins
instance was different with respect to the the moment in which the publisher was set. 在HystrixMetricsPublisherFactory
类的基础上,我发现HystrixPlugins
实例与设置发布者的时间有所不同。 After inspecting all the code of the application, I found out that, to set a custom event notifier, the instance was getting reset. 检查完应用程序的所有代码后,我发现,要设置自定义事件通知程序,实例将被重置。
@EventListener(ApplicationReadyEvent.class)
public void doAfterStartup() {
Hystrix.reset();
registerCustomHystrixEventNotifier(circuitBreakerHystrixEventNotifier);
logger.info("hello world, application started up");
}
I've then modified the method in order to register the event notifier, without resetting what the autoconfiguration configured before, and hystrix metrics are now showing up in the prometheus endpoint. 然后,我修改了该方法以注册事件通知程序,而无需重置之前配置的自动配置,并且hystrix指标现在显示在prometheus端点中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.