Hystrix 使用指南(3):监控报警

一、前言

看过了上一篇文章之后,我们应该掌握了 Hystrix 基本的使用方法。我们应该可以通过应用 Hystrix,保护我们的应用免受延迟故障的危害。但我们只是大致配置了 HystrixCommand,设置了相对宽松的线程池和超时时间等参数。这样虽然可以快速应用 Hystrix,但系统的可用性还是可以通过配置调优进一步的提高。那对 Hystrix 配置的第一步就是获取 Hystrix 的运行数据,这就用到了 Hystrix 的监控功能。所以,本文将向大家介绍一下 Hystrix 自带的 Dashboard 功能的使用和扩展。

二、内置的监控:Hystrix Dashboard

如上所述,Hystrix 提供了一个 Dashboard 功能,用于提供对 Hystrix 相关运行数据的监控和展示。

▼ 正常的 HystrixCommand 的监控图

▼ 发生熔断时 HystrixCommand 的监控图

每个 Command 的监控图中都有 Host 和 Cluster 两个 TPS 数据。如果是单机的 Dashboard,那这两个数值是相同的,集群 Dashboard 则会有不同的显示。

集群的 Dashboard 可以自己实现,也可以利用 Netflix Turbine 快速搭建。原理是聚合收集 Hystrix Metrics Stream 的数据实现的。所以,实现监控的基础是开启 Hystrix Metrics Stream 功能。

监控信息详解

▼ 一个 HystrixCommand 完整的监控信息

image
  • 绿色计数: 表示成功的请求数
  • 蓝色计数: 表示断路器打开后,直接被短路的请求数
  • 黄色计数: 表示请求超时数
  • 紫色计数: 表示因为线程池满而被拒绝的请求数
  • 红色计数: 表示因为异常而导致失败的请求数
  • 灰色百分比: 表示的是10秒内的错误率统计
  • Hosts: 应用个数
  • Median: Command 的中位数时间
  • Mean: Command 的平均时间
  • 90th/99th/99.5th: P90、P99、P99.5 时间
  • Rolling 10 second counters: 说明一下计数都是在一个10秒的滚动窗口内统计的
  • with 1 second granularity: 这个滚动窗口是以1秒为粒度进行统计的

所有技术和百分比的统计窗口都是10秒(默认值)

配置 Hystrix Metrics Stream

上一节展示的各种监控数据均来自被监控服务上 Hystrix Metrics Stream 的输出,接下来介绍如何开启 Hystrix Metrics Stream。

原生方式

要开启 Hystrix Metrics Stream,我们需要做如下工作:

配置 Maven

<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-metrics-event-stream</artifactId>
    <version>${hystrix.version}</version>
</dependency>

配置 Servlet

<servlet>
    <description></description>
    <display-name>HystrixMetricsStreamServlet</display-name>
    <servlet-name>HystrixMetricsStreamServlet</servlet-name>
    <servlet-class>
        com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet
    </servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>HystrixMetricsStreamServlet</servlet-name>
    <url-pattern>/hystrix.stream</url-pattern>
</servlet-mapping>

在配置完成之后,通过浏览器打开 http://server:port/hystrix.stream 就能看到如下的数据:

ping: 

data: {"type":"HystrixCommand","name":"AuthenticationCommand","group":"AuthenticationCommandGroup","currentTime":1503645428876,"isCircuitBreakerOpen":false,"errorPercentage":0,"errorCount":0,"requestCount":25,"rollingCountBadRequests":0,"rollingCountCollapsedRequests":0,"rollingCountEmit":0,"rollingCountExceptionsThrown":0,"rollingCountFailure":0,"rollingCountFallbackEmit":0,"rollingCountFallbackFailure":0,"rollingCountFallbackMissing":0,"rollingCountFallbackRejection":0,"rollingCountFallbackSuccess":0,"rollingCountResponsesFromCache":0,"rollingCountSemaphoreRejected":0,"rollingCountShortCircuited":0,"rollingCountSuccess":27,"rollingCountThreadPoolRejected":0,"rollingCountTimeout":0,"currentConcurrentExecutionCount":0,"rollingMaxConcurrentExecutionCount":1,"latencyExecute_mean":6,"latencyExecute":{"0":4,"25":5,"50":6,"75":7,"90":8,"95":9,"99":26,"99.5":26,"100":26},"latencyTotal_mean":6,"latencyTotal":{"0":4,"25":5,"50":6,"75":7,"90":8,"95":9,"99":26,"99.5":26,"100":26},"propertyValue_circuitBreakerRequestVolumeThreshold":20,"propertyValue_circuitBreakerSleepWindowInMilliseconds":5000,"propertyValue_circuitBreakerErrorThresholdPercentage":20,"propertyValue_circuitBreakerForceOpen":false,"propertyValue_circuitBreakerForceClosed":false,"propertyValue_circuitBreakerEnabled":true,"propertyValue_executionIsolationStrategy":"THREAD","propertyValue_executionIsolationThreadTimeoutInMilliseconds":200,"propertyValue_executionTimeoutInMilliseconds":200,"propertyValue_executionIsolationThreadInterruptOnTimeout":true,"propertyValue_executionIsolationThreadPoolKeyOverride":null,"propertyValue_executionIsolationSemaphoreMaxConcurrentRequests":10,"propertyValue_fallbackIsolationSemaphoreMaxConcurrentRequests":10,"propertyValue_metricsRollingStatisticalWindowInMilliseconds":10000,"propertyValue_requestCacheEnabled":false,"propertyValue_requestLogEnabled":false,"reportingHosts":1,"threadPool":"PassportCommandThreadPool"}

这些就是 Hystrix 相关的监控数据流,包括了接口响应时间、TPS、熔断等相关的数据。

Spring Boot

如果使用了 Spring Boot,我们启用 Stream 的方法略有不同,但同样简单:

配置 Maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置 Spring Boot

@EnableHystrix
@SpringBootApplication
public class HystrixWorkshopApplication {
    public static void main(String[] args) {
      SpringApplication.run(HystrixWorkshopApplication.class, args);
    }
}

运行 Hystrix Dashboard 服务

但是,我们肯定不能直接通过这样的方式监控 Hystrix。所以,Hystrix 提供了一个 Dashboard 应用。Dashboard 是一个单独的应用,我们可以独立部署,另外 Spring Cloud 也提供了一个注解,开启 Dashboard 功能。Dashboard 的基本的安装配置功能不在这里描述了。

▼ Hystrix Dashboard 的界面如下图所示

在第一个文本框填入 Hystrix Stream 的地址即可看到本文开头的界面。

如果需要监控整个 Hystrix 集群,就需要使用 Turbine 应用。Turbine 也是 Netflix 开源的一个服务。

Hystrix Metrics 的优缺点

优点:

统计粒度小:时间粒度和监控单元粒度。可以帮助我们发现粗粒度监控时不容易发现的问题。

缺点:

数据没有持久化,无法查看历史数据

三、与自有监控和报警系统的集成

监控

对于多数公司来说,使用 Hystrix Stream 和 Turbine 存在一个明显的不足,那就是无法查看历史的监控数据。

这个功能还是很重要的,因为在使用 Hystrix,刚开始,超时时间、线程池等参数配置的都比较随意。后续我们需要进行配置调整,依据就来自 Hystrix Dashboard 上的数据。但如果无法看到历史的数据,那就很不方便了。

目前,Hystrix 并没有提供任何机制用于将运行数据上传至第三方监控系统的机制,但我们可以参考 HystrixMetricsStreamServlet 的实现方式。

HystrixMetricsStreamServlet 是通过轮询 HystrixCommandMetricsHystrixThreadPoolMetricsHystrixCollapserMetrics 中的数据实现监控的。因此,我们也可以采用类似的方式,轮询这三个类中的数据,然后将这些数据上传到第三方监控系统。上传之后,在通过相应监控系统的持久化功能,从而实现对监控数据的保存。

private HystrixDashboardStream(int delayInMs) {
    this.delayInMs = delayInMs;
    this.singleSource = Observable.interval(delayInMs, TimeUnit.MILLISECONDS)
            .map(new Func1<Long, DashboardData>() {
                @Override
                public DashboardData call(Long timestamp) {
                    return new DashboardData(
                            HystrixCommandMetrics.getInstances(),
                            HystrixThreadPoolMetrics.getInstances(),
                            HystrixCollapserMetrics.getInstances()
                    );
                }
            })
            .doOnSubscribe(new Action0() {
                @Override
                public void call() {
                    isSourceCurrentlySubscribed.set(true);
                }
            })
            .doOnUnsubscribe(new Action0() {
                @Override
                public void call() {
                    isSourceCurrentlySubscribed.set(false);
                }
            })
            .share()
            .onBackpressureDrop();
}

报警

注:这一段内容和 Hystrix 本身的使用没有直接关系,而是和 Hystrix 相关的微服务治理相关的内容。但建议负责技术、架构,以及负责基础组件和服务研发的同学阅读

在有了监控数据之后,报警功能也是水到渠成,所以这里不谈如何实现基于 Hystrix 监控数据的报警功能。这里我们讨论一下我们是否需要基于 Hystrix 监控数据的报警功能?如果需要,都需要针对哪些指标添加报警?

之所以讨论这个问题,是因为有很多全链路监控解决方案,例如 Spring Cloud Sleuth、Pinpoint 等,都支持对 Hystrix 的监控。所以,监控报警功能并不依赖于 Hystrix 自带的监控数据输出。所以,如果只需要基本的监控报警功能,完全是不需要 Hystrix Metrics 和 Dashboard 功能的。

但 Hystrix 相关的监控数据不同于其它技术,除了超时和错误的监控,还有其它很多细粒度的监控数据。例如,熔断次数、线程池拒绝次数等等。

对于这些细粒度的监控数据,我认为不应该将它们同超时和错误监控等同看待。前者更多的是用于配置调优,后者则主要是一种常规的监控方式。如果我们将 Hystrix Metrics 所提供的所有数据都纳入监控,不仅监控系统,而且,更重要的是,技术人员可能会不堪重sao负rao。过多的监控有时会起到相反的作用,即让技术人员忽视监控。

我认为 Hystrix 相关的报警的一个原则是,报警还应该局限于主要的指标(请求时间、异常)。对于 Hystrix 特有的、细粒度的运行数据,我们需要做到有据可查。以方便开发人员调优

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335