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 ...
随机推荐
- Python基础入门知识点——深浅拷贝
深浅拷贝 对象引用.浅拷贝.深拷贝(拓展.难点.重点) Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果 其实这个是由于共享内存导致的结果 拷贝 ...
- 【接口自动化】Python+Requests接口自动化测试框架搭建【二】
接续前文,在上篇博客中我们编写了demo.py代码,里面代码过多冗余,更新代码: #!/usr/bin/env python # coding=utf-8 import requests class ...
- python读取数据文件:pandas包详解
本文转载自https://blog.csdn.net/brucewong0516/article/details/79092579 pandas包是一个高效的文件读取工具,适用于txt,excel,等 ...
- js实现将时分秒转化成毫秒,将秒转化成时分秒
// 时间转为毫秒 timeToSec(time) { var hour = time.split('[0] var min = time.split('[1] var sec = time.spli ...
- 【转】在Python的struct模块中进行数据格式转换的方法
这篇文章主要介绍了在Python的struct模块中进行数据格式转换的方法,文中还给出了C语言和Python语言的数据类型比较,需要的朋友可以参考下 Python是一门非常简洁的语言,对于数据类型的表 ...
- curl报错60的问题
使用curl发请post请求的时候,会遇到如下错误: curl: (60) SSL certificate problem: self signed certificate More details ...
- VS2015+opencv3.1.0 imshow()函数出现中文乱码----问题一
Visual Studio提供高级保存选项功能,它能指定特定代码文件的编码规范和行尾所使用的换行符.在Visual Studio 2015中,该命令没有默认显示在“文件”菜单中.用户需要手工设置,才能 ...
- 理解Django 中Call Stack 机制的小Demo
1.工作流程 request/response模式下,request并不是直接到达view方法,view方法也不是将返回的response直接发送给浏览器的,而是request由外到里的层层通过各种m ...
- 使用【QQ五笔的码表】转成【百度手机自定义码表】
使用[QQ五笔码表]转成[百度手机自定义码表] QQ五笔码表先转成多多格式. 这里选用极点>>多多. 然后去掉空格. 转成GB.去掉没的字. 百度要的是这种格式. 现再用点讯工具转成 de ...
- 使用script打开页面
<script src="x" onerror=javascript:window.open("http://192.168.38.1/csrf.html" ...