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. pytest封神之路第一步 tep介绍

    『 tep is a testing tool to help you write pytest more easily. Try Easy Pytest! 』 tep前身 tep的前身是接口自动化测 ...

  2. centos 安装ifconfig

    本文通过最简单方式yum

  3. hook框架-frida使用-APP在模拟器无法打开,用钩子去除限制

    app拿soul为例子 一.环境配置 #模拟器的frida服务为86 #frida-server-12.9.8-android-x86 adb push frida-server-12.9.8-and ...

  4. 4.设置静态IP

    由于Ubuntu重启之后,ip很容易改变,可以用以下方式固定ip地址 1.设置ip地址 vi /etc/network/interface # The loopback network interfa ...

  5. Redis 持久化 rdb、Aof对比

    一.Redis 简介: Redis是一个开源的.基于内存的数据结构存储器,可以用作数据库.缓存和消息中间件. Redis是一个key-value存储系统.和Memcached类似,它支持存储的valu ...

  6. call、apply、bind 的用法

    例1 obj.objAge; //17 obj.myFun() //小张年龄undefined 例2 shows() //盲僧 比较一下这两者this 的差别,第一个打印里面的this 指向obj,第 ...

  7. 方差分析、T检验、卡方分析如何区分?

    差异研究的目的在于比较两组数据或多组数据之间的差异,通常包括以下几类分析方法,分别是方差分析.T检验和卡方检验. 三个方法的区别 其实核心的区别在于:数据类型不一样.如果是定类和定类,此时应该使用卡方 ...

  8. Dubbo详解

    什么是DubboDubbo是一个分布式服务框架,致力于提供高性能和透明化的远程服务调用方案,这容易和负载均衡弄混,负载均衡是对外提供一个公共地址,请求过来时通过轮询.随机等,路由到不同server.目 ...

  9. 温故知新——Spring AOP

    Spring AOP 面向切面编程,相信大家都不陌生,它和Spring IOC是Spring赖以成名的两个最基础的功能.在咱们平时的工作中,使用IOC的场景比较多,像咱们平时使用的@Controlle ...

  10. webdriver实现简单的窗口切换

    webdriver实现简单的窗口切换,也只能是简单的,因为目前处于学习阶段,复杂的情况现在还没碰到过.之前写过关于一个小demo的总结,就有提到过在新开窗口进行操作的情况,用以下一句就可以搞定了,la ...