在 PCF 上部署 Spring Boot 的 Hystrix 仪表板不显示指标

Posted

技术标签:

【中文标题】在 PCF 上部署 Spring Boot 的 Hystrix 仪表板不显示指标【英文标题】:Hystrix Dashboard with Spring Boot Deployed On PCF not showing Metrics 【发布时间】:2015-04-13 07:06:57 【问题描述】:

我使用 Spring boot 和 spring cloud starter hystrix 库创建了一个简单的应用程序。

在我的 build.gradle 中:

dependencies 
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.cloud:spring-cloud-starter-hystrix-dashboard:1.0.0.RC2")
compile("org.springframework.cloud:spring-cloud-starter-hystrix:1.0.0.RC2")

我使用上述库和@EnableHystrixDashboard 将一个应用程序部署为 hystrix 仪表板

然后我部署了另一个应用 @EnableHystrix 注释

我添加了一个组件,该组件具有我通过控制器调用的命令,只是为了测试一下:

@HystrixCommand(fallbackMethod = "onFailedToSayHello")
public String sayHello(Map<String, String> parameters) 
    if (parameters.get("fail") != null && parameters.get("fail").equals("yes")) 
        throw new RuntimeException("I failed because you told me to");
    
    return "Hello";


private String onFailedToSayHello(Map<String, String> parameters) 
    return "Bye";

hystrix 应用程序运行良好。当我点击 URL 时,我看到了流,我输入了一个要点 here 的输出。

我只是看到一遍又一遍地重复。

我的仪表板已启动并正在运行,当我输入正在运行的 hystrix 示例应用程序的 URL 时,我会看到一个加载屏幕:

然后,当我再次检查我的 hystrix 应用程序时,我看到了这个:

λ curl http://myappurl/hystrix.stream
"timestamp":1423748238280,"status":503,"error":"Service      Unavailable","message":"MaxConcurrentConnections reached: 5","path":"/hystrix.stream"

我不知道从这里去哪里。我尝试部署 hystrix 仪表板战争而不是自己构建它,我从here 下载但得到了相同的结果。

我还注意到浏览器控制台中有一些 javascript 错误输出,我将它们放在 here 以防万一。

在服务器日志中,我看到这一点一遍又一遍地重复:

2015-02-15 20:03:55.324 信息 9360 --- [nio-8080-exec-9] ashboardConfiguration$ProxyStreamServlet:

代理打开连接到:http://myappurl/hystrix.stream

我现在将尝试让turbine 运行,看看使用它是否能神奇地修复问题。以为我也会在这里发帖,但如果有人可以根据我到目前为止所做的事情发现我的错误。

编辑: 我没有提到的重要一点是,我在 PCF 上部署了应用程序和仪表板。这似乎很重要,因为当我在本地部署时不会发生此问题。不过还是不知道是什么原因造成的。

【问题讨论】:

默认情况下,只允许 5 个连接到 hystrix 流。设置hystrix.stream.maxConcurrentConnections: 20。您可以尝试使用刚刚发布的 1.0.0.RC3 吗?有一些针对 hystrix 仪表板的修复。 感谢您的评论@spencergibb。我尝试将应用程序和仪表板更新到 1.0.0.RC3,但遇到了同样的错误。我将最大并发连接数更改为 20 并得到了类似的错误: "timestamp":1424029687607,"status":503,"error":"Service Unavailable","message":"MaxConcurrentConnections reached: 20","path ":"/hystrix.stream"。看起来与github.com/Netflix/Hystrix/issues/85 类似,但我在那里没有发现任何有用的东西,因为这似乎是 hystrix 的一个老问题,不久前已修复。 你有什么连接它占用 20 个连接? 据我所知,它是仪表板。当我将仪表板指向我的应用程序时,会发生错误,并且我在仪表板应用程序日志中看到此重复:“代理打开连接到:myappurl/hystrix.stream”。然后我无法再访问流并收到 503 错误。当我关闭仪表板时,503 停止,我可以再次看到流。流看起来不错。我看到了正确的内容类型 - Content-Type:text/event-stream;charset=UTF-8。这真的有点奇怪。我很困惑。我希望在接下来的几天里有时间查看它,如果我发现任何东西,我会在这里更新。 当没有数据存在时,servlet 中的一个错误是锁定访问尝试升级到 1.4.0-rc.9 github.com/Netflix/Hystrix/commit/… 【参考方案1】:

如果您从最新的 source 构建 hystrix-dashboard,或者使用最新发布的 war(撰写本文时 3 月 27 日版本 1.4.3),问题就会消失。

【讨论】:

【参考方案2】:

有几件事可能会导致 MaxConcurrentConnections,其中之一是应用程序没有生成任何指标数据。 servlet (Hystrix.stream servlets) 将继续循环等待数据,然后它将消耗所有连接。 Hystrix github wiki 上有很好的讨论。例如: hystrix.stream holds connection open if no metrics #85

【讨论】:

以上是关于在 PCF 上部署 Spring Boot 的 Hystrix 仪表板不显示指标的主要内容,如果未能解决你的问题,请参考以下文章

访问PCF Spring Boot应用程序上的VCAP属性

有没有办法从 PCF 外部的客户端使用 PCF spring 云配置服务器?

如何在运行时更改日志级别而不重新启动 Spring Boot 应用程序

带有 Maven 应用程序的 Spring Boot 的 Heroku jar 部署,代码 = H10

无法构建 Spring-boot-sample-gae(在 GAE 上部署 Spring Boot)

如何在嵌入式 tomcat 服务器上部署 Spring Boot Web 应用程序,来自 Spring Boot 本身