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 ...
随机推荐
- Wireshark中的Checksum: 0x90c5 [validation disabled]问题
Wireshark中的Checksum: 0x90c5 [validation disabled]问题 废话不多说先上问题图: 这是我在做关于DNS协议PPT的时候出现的协议树第五项展开结果,可以发现 ...
- 转圈游戏C++
转圈游戏 问题描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置, ...
- SpringSecurity权限管理系统实战—八、AOP 记录用户、异常日志
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...
- python中a, b = a, a + b这条语句是如何执行的?
a,b=b,a+b,这条语句在"理解"上还是与C语言有些差别的.在Python中,可以做下面的方式理解:首先,把等号右边的算式分别算完再说,然后按照一一对应的关系把值赋给等号左边的 ...
- Soft-to-Hard Vector Quantization for End-to-End Learning Compressible Representations
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract: 我们提出了一种新的方法,通过端到端的训练策略来学习深度架构中的可压缩表征.我们的方法是基于量化和熵的软(连续)松弛,我 ...
- SLS案例中心
今日PV nginx日志查看今日的PV和昨日的对比,先通过count函数计算总的pv,再用compare函数得出今日的pv和昨日的同比. 通过单值图进行展示,显示值为20.381Mil,对比值为-2% ...
- Kubernetes入门(二)——Dashboard 安装
Kubernetes集群搭建完成后,可以通过命令行方式可以了解集群资源的使用情况,但是这种方式比较笨拙且不直观,因此考虑给集群安装Dashboard,这样能更直观了解集群状态.本文Dashboard的 ...
- .net core 3.0 web api 重点设置,主要为了解决axios post不到参数问题
这两天研究.net core 3.0升级,前端vue+axios 后端web api.测试过程中发现post的时候,由于提交的是json对象,后端web api获取不到数据. 今天贴了下解决过程.主要 ...
- 夜息seo培训内部教程
http://www.wocaoseo.com/thread-268-1-1.html 随着SEO日益正规化,在企业中推行SEO变得越来越重要,在上一文<将SEO整合入整个网站项目>中也有 ...
- .NET Core3.1 Dotnetty实战第一章
一.概要 本系列文章主要讲述由微软Azure团队研发的.net的版本的netty,Dotnetty.所有的开发都将基于.net core 3.1版本进行开发. Dotnetty是什么,原本Netty是 ...