当前位置: 首页 > 知识库问答 >
问题:

将应用程序迁移到Spring boot 2后,无法将hystrix度量向/acture/prometheus公开

洪增
2023-03-14

在将我的应用程序(堆栈spring boot、camel、hystrix)从spring Boot1.5迁移到spring Boot2之后。我无法让hystrix度量显示在/Acturet/Prometheus中。

正如许多解决方案和教程所建议的那样,我已经确定了以下依赖项

<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>

并添加了以下配置类,我确信它正在实例化,正如我在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();
   }
}

为了避免假设这样的教程/答案从定义上讲是正确的,我从头开始设置了一个简单的Spring Boot项目,其中包含一个简单的控制器、hystrix和上面的依赖项,并且度量确实出现在/acture/prometheus处,而不需要额外的步骤。

我的应用程序比简单的项目有更多的依赖关系,所以我认为可能是其他东西在重写/禁用度量绑定。

[...]
<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>
[...]

除了被告知实际问题是什么之外,我还在努力理解如何解决这些问题。是否有任何千分尺/Spring引导日志(除了自动配置报告)可以被激活以了解发生了什么?

共有1个答案

诸葛苏燕
2023-03-14

在完成了整个定制hystrix度量绑定过程之后,我最终发现所有的东西都被正确绑定了,至少在原则上是这样。

然后,我尝试在第一次执行hystrix命令时触发一个断点,以检查注册表和发布服务器发生了什么。在方法中放置断点

HystrixMetricsPublisherThreadPool getPublisherForThreadPool(HystrixThreadPoolKey threadPoolKey, HystrixThreadPoolMetrics metrics, HystrixThreadPoolProperties properties)

HystrixMetricSpublisherFactory类中,我发现HystrixPlugins实例与设置发布服务器的时刻不同。在检查了应用程序的所有代码后,我发现,为了设置自定义事件通知程序,实例正在被重置。

@EventListener(ApplicationReadyEvent.class)
    public void doAfterStartup() {
        Hystrix.reset();
        registerCustomHystrixEventNotifier(circuitBreakerHystrixEventNotifier);
        logger.info("hello world, application started up");
    }
 类似资料:
  • 我的Spring Boot应用程序只是有一个计数器指标。我只是不知道如何将这些信息发送给普罗米修斯。我正在使用Maven(构建工具)和Spring Boot(Java)。

  • 我在Kubernetes服务的默认命名空间上安装了一个python应用程序。它使用starlette\u exporter,并向Prometheus公开endpoint。当我访问endpoint时,我看到: 我还在库伯内特斯服务的命名空间上安装了。它没有自定义,我使用此命令进行安装: 要将我的应用程序指标添加到Prometheus堆栈中,我可以在Grafana仪表板上跟踪它们,有哪些必要步骤?据我

  • 我正在探索将java web应用程序移动到Azure应用程序服务的可能性。应用程序on prem在启动时读取属性文件。 是否有可能将属性文件传递或放置到应用服务?如果没有,建议将此类遗留应用程序移动到Azure应用服务?

  • 我有一个Web项目,我很容易在tomcat上对其进行depoly。事实上,我有一个实现的类(这个类真的很胖),因为你知道每个支持servlet 3.0的应用程序服务器,它可以很容易地检测到它并尝试启动它。现在我想知道是否可以使用Spring启动启动器,并且无需任何进一步的配置,我将我的传递给它,并根据我的启动我的项目进行Spring启动? 我只想使用spring boot的方法在Tomcat上部署

  • 我用xcode11运行我的应用程序,并且可以发布它。但是,我看到了苹果发布的下面这则公告; “从2021年4月开始,所有提交到应用商店的iOS和iPadOS应用都必须使用Xcode 12和iOS 14 SDK构建。” 我到底该怎么做?如果我下载Xcode12并运行我的应用程序,SDK会自动更新吗?安装iOS 14 SDK该怎么做? 或者我需要为我现有的豆荚“豆荚更新”吗?在我的项目“iOS部署目标

  • 我有一个简单的Maven Spring-Boot应用程序(Java),并使用Prometheus从其中收集度量信息。我在pom文件中有所有必要的Prometheus依赖项,并且我在@SpringBootApplication类中包含了@EnablePrometheusEndpoint注释,但是当我运行应用程序并尝试访问localhost:8080/Prometheus(我认为这是Prometheu