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的更多相关文章

  1. hystrix熔断器之metrics

    Metric概述 HystrixCommands和HystrixObservableCommands执行过程中,会产生执行的数据,这些数据对于观察调用的性能表现非常有用. 命令产生数据后,Metric ...

  2. hystrix文档翻译之Dashboard

    Dashboard Hystrix Dashboard可以让你实时监控hystrix的metrics信息. 当netflix开始使用dashboard后,运维效率得到了极大的提升,并且极大降低了大多数 ...

  3. hystrix文档翻译之插件

    插件 可以通过实现插件来改变Hystrix的行为.可以通过HystrixPlugins来注册自定义插件,这些插件会被应用到HystrixCommand,HystrixObservableCommand ...

  4. hystrix文档翻译之配置

    Hystrix使用Archaius作为配置的默认实现,下面介绍的是HystrixPropertiesStrategy的默认实现,你也可以通过插件方式重新实现. 每一个配置有四个级别: 全局默认 当下面 ...

  5. hystrix文档翻译之如何使用

    Hello World! 使用HystrixCommand实现“Hello World”. public class CommandHelloWorld extends HystrixCommand& ...

  6. hystrix文档翻译之工作原理

    流程图 下面的图片显示了一个请求在hystrix中的流程图. 1.构造一个HystrixCommand或者HystrixObservableCommand对象 第一步是创建一个HystrixComma ...

  7. hystrix文档翻译之概述

    Hystrix是什么 在一个大型的分布式系统中,难免有些依赖服务会失败.hystrix通过容错逻辑来控制不同服务间的交互.hystrix通过隔离各服务交互节点来防止连级错误,并且提供降级功能,最终保证 ...

  8. hystrix文档翻译之运维

    hystrix不仅用作工程可靠性还可以用来运维. 这里将会分享一个拥有100+Hystrix命令,40+线程池,每天有100亿次线程请求,2000亿次信号量请求的系统是如何使用hystrix运维的.这 ...

  9. hystrix文档翻译之开始使用

    获取包 使用maven获取包. <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId ...

随机推荐

  1. Jmeter逻辑控制器之If Controller的使用解析

    一.If Controller概述 类似于编程语言中if语句,根据给定表达式的值决定是否执行该节点下的子节点,表达式的值 为true则执行,为false则不执行,默认使用javascript语法进行判 ...

  2. C++ Templates (1.7 总结 Summary)

    返回完整目录 目录 1.7 总结 Summary 1.7 总结 Summary 函数模板定义了一系列不同模板实参的函数 当传递实参给依赖于模板参数的函数参数,函数模板推断模板参数并实例化相应的参数类型 ...

  3. 第四篇Scrum冲刺博客--Interesting-Corps

    第四篇Scrum冲刺博客 站立式会议 1.会议照片 2.队友完成情况 团队成员 昨日完成 今日计划 鲍鱼铭 搜索页面跳转.设计及布局实现 音乐详情页面跳转.设计及布局实现设计 叶学涛 编写设置页面 编 ...

  4. python元组的概念与基本操作

    元组与列表类似,关于元组同样需要做如下三点: A.概念 1.元组通过英文状态下的圆括号构成“()”.其存放元素与列表一样,可以是不通的数值类型,也可以是不通的数据结构. 2.元组仍然是一种序列,所以几 ...

  5. shell 三剑客之 awk

    awk 是shell 里的常用命令,非常强大!

  6. 史上!最最最简洁明了的 Java JDK 安装目录及其子目录含义 10分钟详解 - 精简归纳

    Java JDK 安装目录及其子目录含义 10分钟详解 - 精简归纳 JERRY_Z. ~ 2020 / 8 / 30 转载请注明出处!️ 目录 Java JDK 安装目录及其子目录含义 10分钟详解 ...

  7. 数字电路基础(三)TTL与非门输入端接电压表的示数

    如下图所示,当ui输入低电平,电压表示数为0.3v,当ui输入高电平时,电压表示数为1.4v,分析如下 当ui=0.3 此时VT1导通,电流都从输入端流出,VT1的基极电位被钳位在1.0v(Ub1=0 ...

  8. 遍历查找集合或者数组中的某个元素的值 java代码 详解 Android开发

    import java.util.Scanner; public class Test21 { public static void main(String[] args) { //定义并初始化数组 ...

  9. Android开发之ListView详解 以及简单的listView优化

    ListView列表视图 最常用的控件之一,使用场景例如:微信,手机QQ等等. android:divider:每个item之间的分割线,可以使用图片或者色值. android:dividerHeig ...

  10. MinGW-w64安装过程中出现ERROR res错误的问题

    使用 mingw-get-setup.exe 安装.在官网http://www.mingw.org/上搜索download/installer,点击下载. 如果使用 mingw-w64-install ...