hystrix文档翻译之metrics
metrics和监控
动机
HystrixCommands和HystrixObservableCommands执行过程中会产生相关运行情况的metrics。这些metrics对于监控系统表现有很大的帮助。 hystrix为每个命令提供了metrics。
单独的hystrix metrics信息可以用来帮助debugging,聚合的metrcis信息可以帮助理解系统的表现。下面是命令执行和写metrics的流程图。

Hystrix事件类型
下表列出了Hystrix执行过程中所有的事件类型。这些事件类型定义在枚举类com.netflix.hystrix.HystrixEventType中。HystrixCommand和HystrixObservableCommand都会使用到整个枚举。
HystrixCommand只返回一个数据,当返回值时发生SUCCESS事件,执行失败时,发生FAILURE事件。。
HystrixObservableCommand可以返回多个值,当返回值时发生EMIT事件,当命令完成时,发生SUCCESS事件,执行失败时,发生FAILURE事件。
| 名称 | 描述 | 是否fallback |
| EMIT | value返回,只在HystrixObservableCommand | NO |
| SUCCESS | 执行成功 | NO |
| FAILURE | 执行抛出异常 | YES |
| TIMEOUT | 超时 | YES |
| BAD_REQUEST | 抛出HystrixBadRequestException | NO |
| SHORT_CIRCUITED | 熔断 | YES |
| THREAD_POOL_REJECTED | 线程池拒绝 | YES |
| SEMAPHORE_REJECTED | 信号量拒绝 | YES |
Fallback事件类型
| 名称 | 描述 | 是否抛出异常 |
| FALLBACK_EMIT | fallback 返回值,只在HystrixObservableCommand | NO |
| FALLBACK_SUCCESS | fallback 执行完成 | NO |
| FALLBACK_FAILURE | fallback执行失败 | YES |
| FALLBACK_REJECTION | fallback拒绝执行 | YES |
| FALLBACK_MISSING | 没有fallback实现 | YES |
其他命令类型
| 名称 | 描述 |
| EXCEPTION_THROWN | 执行命令值抛出异常 |
| RESPONSE_FROM_CACHE | 从缓存中获取值 |
| CALLAPSED | 命令聚合执行 |
线程池类型
| 名称 | 描述 |
| EXECUTED | 线程池执行一个命令 |
| REJECTED | 线程池拒绝执行命令 |
聚合事件类型
| 名称 | 描述 |
| BATCH_EXECUTED | 执行一个batch批量执行 |
| ADDED_TO_BATCH | 参数添加到batch中 |
| RESPONSE_FROM_CACHE | 从缓存中获取值 |
Metrics存储
我们选择便于聚合的数据结构来存储metrics,你可能会使用HystrixRollingNumber来存储滚动计数;可能会使用HystrixRollingPercentile来存储百分比计数。例如,hystrix熔断器根据滚动的失败率来判断是否需要熔断;hystrix-contrib中的publisher和stream会读取滚动数据然后聚合并发送。但实际情况比这个更加复杂,单单根据聚合值,我们还不能满足所有需求。例如,我们知道FooCommand的失败率是50%,但是我们依然想知道在墨西哥和巴西失败率为0%,在美国的失败率为98%,在聚合过程中很多细节会被丢失掉。netflix通过HystrixRequestLog来跟踪所有的请求,这不是最好的方式但可以让我们以请求路径的维度来统计hystrix执行的情况,在实际应用中会非常有价值。
1.5.x(及以上)
因为这些原因,我们使用更加灵活的方式来重新设计了metrics架构。如果将metrics设计成一个数据流,那么它可以以各种方式被消费。我们为HystrixCommandKey,HystrixThreadPoolKey,HystrixCollapserKey的metrics设计了一个流。每个HystrixCommandKey和HystrixThreadPoolKey对应的流会接收开始事件,结束事件。每个HystrixCollapserKey对应的流会接收聚合相关的事件。为了保持向后兼容,hystrix-core实现了所有HystrixRollingNumber/HystrixRollingPercentile的统计计算。并且hystrix-core使用了rxjava来实现这些聚合操作。例如,使用Observable.window来实现一段时间内的聚合数据,它自己会在后台实现,不需要我们自己实现它。
通过这种实现,每一个命令不再需要维护一个HystrixRollingNumber,而是针对每个命令,每个线程池,每个聚合命令,维护一个rx.Subject,通过异步方式写入metrics事件。这些Subject通过一下hystrix api 暴露给调用方使用。
| 类 | 方法 | 返回类型 |
| HystrixCommandStartStream | observe() | Observable<HystrixCommandExecutionStarted> |
| HystrixCommandCompletionStream | observe() | Observable<HystrixCommandCompletion> |
| HystrixThreadPoolStartStream | observe() | Observable<HystrixCommandExecutionStarted> |
| HystrixThreadPoolCompletionStream | observe() | Observable<HystrixCommandCompletion> |
| HystrixCollapserEventStream | observe() | Observable<HystrixCollapserEvent> |
| HystrixRequestEventsStream | observe() | Observable<HystrixRequestEvents> |
我们可以自定义metrics的消费策略,hystrix也提供了一些默认的实现。例如RollingCommandEventCounterStream,任何线程通过这个流可以读取到窗口期内某一command 事件的聚合值。以下是hystrix提供的metrics消费统计流:
Metrics事件流
可以使用hystrix-metrics-event-stream来实现实时监控,报警,报表等。通过实现HystrixMetricsPublisher可以自定义发布Metrics。使用HystrixPlugins.registerMetricsPublisher(HystrixMetricsPublisher impl)来注册自定义HystrixMetricsPublisher。
Hystrix的hystrix-contrib模块有下面的默认实现:
- Netflix Servo: hystrix-servo-metrics-publisher
- Yammer Metrics: hystrix-yammer-metrics-publisher
上面的两个publisher具体发布以下信息:
命令Metrics
每一个命令以下面的格式发布metrics:
- servo tag:instance 值:HystrixCommandKey.name()
- servo tag:type 值:HystrixCommand
状态
- Boolean isCircuitBreakerOpen 熔断器是否开启
- Number errorPercentage 异常比率
- Number executionSemaphorePermitsInUse
- String commandGroup 命令组
- Number currentTime 当前时间
窗口期和持续值
| 事件 | 持续值 | 窗口值 | 说明 |
| BAD_REQUEST | countBadRequests | rollingCountBadRequests | bad request个数 |
| COLLAPSED | countCollapsedRequests | rollingCountCollapsedRequests | |
| EMIT | countEmit | rollingCountEmit | |
| EXCEPTION_THROWN | countExceptionsThrown | rollingCountExceptionsThrown | |
线程池Metrics
每一个线程池以下面的格式发布metrics:
- servo tag:instance 值:HystrixThreadPoolKey.name()
- servo tag:type 值:HystrixThreadPool
状态
- string name
- Number currentTime
窗口值(Gauge)
- Number rollingMaxActiveThreads
- Number rollingCountThreadsExecuted
持续值
- countThreadsExecuted
线程池状态
- Number threadActiveCount
- Number completedTaskCount
- Number largestPoolSize
- Number totalTaskCount
- Number queueSize
属性值
- Number propertyValue_corePoolSize
- Number propertyValue_keepAliveTimeInMinutes
- Number propertyValue_queueSizeRejectionThreshold
- Number propertyValue_maxQueueSize
hystrix文档翻译之metrics的更多相关文章
- hystrix熔断器之metrics
Metric概述 HystrixCommands和HystrixObservableCommands执行过程中,会产生执行的数据,这些数据对于观察调用的性能表现非常有用. 命令产生数据后,Metric ...
- hystrix文档翻译之Dashboard
Dashboard Hystrix Dashboard可以让你实时监控hystrix的metrics信息. 当netflix开始使用dashboard后,运维效率得到了极大的提升,并且极大降低了大多数 ...
- hystrix文档翻译之插件
插件 可以通过实现插件来改变Hystrix的行为.可以通过HystrixPlugins来注册自定义插件,这些插件会被应用到HystrixCommand,HystrixObservableCommand ...
- hystrix文档翻译之配置
Hystrix使用Archaius作为配置的默认实现,下面介绍的是HystrixPropertiesStrategy的默认实现,你也可以通过插件方式重新实现. 每一个配置有四个级别: 全局默认 当下面 ...
- hystrix文档翻译之如何使用
Hello World! 使用HystrixCommand实现“Hello World”. public class CommandHelloWorld extends HystrixCommand& ...
- hystrix文档翻译之工作原理
流程图 下面的图片显示了一个请求在hystrix中的流程图. 1.构造一个HystrixCommand或者HystrixObservableCommand对象 第一步是创建一个HystrixComma ...
- hystrix文档翻译之概述
Hystrix是什么 在一个大型的分布式系统中,难免有些依赖服务会失败.hystrix通过容错逻辑来控制不同服务间的交互.hystrix通过隔离各服务交互节点来防止连级错误,并且提供降级功能,最终保证 ...
- hystrix文档翻译之运维
hystrix不仅用作工程可靠性还可以用来运维. 这里将会分享一个拥有100+Hystrix命令,40+线程池,每天有100亿次线程请求,2000亿次信号量请求的系统是如何使用hystrix运维的.这 ...
- hystrix文档翻译之开始使用
获取包 使用maven获取包. <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId ...
随机推荐
- 【故障公告】阿里云 RDS 数据库突发 CPU 近 100% 引发全站故障
今天晚上9点我们收到阿里云的告警通知: [阿里云监控]华东1(杭州)-云数据库RDS版<cnblogsdb> [instanceId=xxx] 于21:00 发生告警, 前往诊断 CPU使 ...
- 【踩坑笔记】layui之单选和复选框不显示
直接上代码,下面前端页面代码,使用layui框架: <div class="layui-form-item"> <div class="lay ...
- Nginx进阶使用-负载均衡原理及配置实例
介绍 跨多个应用程序实例的负载平衡是一种用于优化资源利用率,最大化吞吐量,减少延迟和确保容错配置的常用技术.可以将Nginx用作非常有效的HTTP负载平衡器,以将流量分配到多个应用程序服务器,并使用N ...
- 第六篇 Scrum冲刺博客
一.会议图片 二.项目进展 成员 已完成情况 今日任务 冯荣新 购物车列表,购物车工具栏 博客撰写 陈泽佳 静态结构 自定义图片组件,提交功能 徐伟浩 协助前端获取数据 协助前端获取数据 谢佳余 未完 ...
- Kafka入门(3):Sarama生产者是如何工作的
摘要 在这一篇的文章中,我将从Sarama的同步生产者和异步生产者怎么创建开始讲起,然后我将向你介绍生产者中的各个参数是什么,怎么使用. 然后我将从创建生产者的代码开始,按照代码的调用流程慢慢深入,直 ...
- xml selectnodes
[xML ]SelectNodes的用法 之前简单找个SelectNodes的例子看了看,写了读取XML文件节点的程序,但是节点数目有限制,后来仔细看看,是自己没完全弄清SelectNodes的用法, ...
- C++模板函数只能全特化不能偏特化
C++模板函数只能全特化不能偏特化
- <init>与<clinit>,static与final与static final
<init>和<clinit> init是对象构造器方法,初始化对象的时候执行 clinit是类构造器方法,类加载的初始化阶段执行 final常量赋值(必须是一下其中一种) 显 ...
- Mybatis联合查询(一)
Mybatis的简单联合查询操作: 实体类: Employee: package com.test.mybatis; public class Employee { private Integer i ...
- 阿里面试:dubbo的服务引用过程
点赞再看,养成习惯,微信搜一搜[三太子敖丙]关注这个喜欢写情怀的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系 ...