zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    线性DP SGU167 I-country
    背包问题 POJ1742 Coins
    背包问题 codevs2210 数字组合
    dfs+贪心 BZOJ4027 [HEOI2015] 兔子与樱花
    spfa最短路+DP BZOJ1003 [ZJOI2006] 物流运输
    矩阵乘法 POJ3070 Fibonacci
    tarjan+spfa最短路 BZOJ1179 [Apio2009] Atm
    欧拉函数 BZOJ2190 [SDOI2008] 仪仗队
    矩阵乘法 洛谷 P3390【模板】矩阵快速幂
    裴蜀定理 BZOJ2299[HAOI2011] 向量
  • 原文地址:https://www.cnblogs.com/zhangwanhua/p/8117001.html
Copyright © 2011-2022 走看看