Terminus Actuator:分布式监控(一)

简介

监控工具内置了 Servlets、Jetty、mybatis、redis 和基于 AOP 的 Spring component 监控,并定时将数据写入 InfluxDB。

监控工具基于 Dropwizard 进行了再封装,加入了额外的模块名、机器信息和 TerminuKey 等,以适应端点的分布式电商体系。


接入方式

为了使用监控,联系管理员获取 TerminusKey,TerminusKey 可以通过环境变量注入用用,也可以直接写入 application.yml,并在项目的 application.yml 中加入参数:

terminus.actuator.enable=${TERMINUS_ACTUATOR_ENABLE:true}

引入相应的依赖:

<!-- 如果是普通 Springboot 项目,引用此依赖 -->  
<dependency>  
    <groupId>io.terminus.actuator</groupId>
    <artifactId>terminus-actuator-starter-service</artifactId>
    <version>1.1.6.RELEASE</version>
</dependency>

<!-- 如果是 Springboot-MVC 项目,引用此依赖 -->  
<dependency>  
    <groupId>io.terminus.actuator</groupId>
    <artifactId>terminus-actuator-starter-web</artifactId>
    <version>1.1.6.RELEASE</version>
</dependency>  

这样就完成不对代码造成侵入的基础组件监控。

如需要进行业务功能的监控,此时会在 Spring 中注册一个名为 metricsRegistry 的 bean,可以根据功能和业务需要手动引用。

注意:application.yml 中的其他可选配置参考 配置详解


监控工具 & 使用示例

MetricsRegistry 提供了多种监控工具以应对多种功能、业务需要,Gauges, Counters, Meters,Histograms 和 Timers。

1. Gauge

Gauge是最简单的测度工具,只有一个简单的返回值,他用来记录一些对象或者事物的瞬时值,例如消息队列的大小,内存、线程池大小,当前营销活动的剩余时间等等。

例如,获取当前在线用户数量:

metricRegistry.register("current-online-user", new Gauge<Integer>() {  
    @Override
    public Integer getValue() {
        return adminUserReadService.countCurrentOnlineUser();
    }
});

register() 成功后,名为 "current-online-user"Guage 就会缓存在 metricRegistry 中,会定时(在 application.yml 中设置,默认10s,下同)获取当前的在线用户;开发人员也可以对返回的 Guage 对象进一步处理。

其他监控工具也是类似的缓存、收集的流程,在下文中不再展开。

2. Counter

Counter 是一个 Long 类型的计数器,他可以增加和减少。例如某个 api 的请求次数、用户下单数等等。

// 一个用户下了一单
metricRegistry.counter("user-orders").inc();  
// 这一单购买了10个商品
metricRegistry.counter("order-items").inc(10);  
// 待支付订单减少了一单
metricRegistry.counter("order-items").dec(1);  

3. Meter

Meter 是一种只能自增的计数器,监控事件发生速率。他提供了一分钟内发生的次数、平均速率、指数平滑速率,以及5分钟、15分钟速率。你可以用它来监控错误发生的频度,甚至每分钟下单的指数频度。

// 一个用户下了一单
metricRegistry.meter("user.orders").mark();  
// 这一单购买了10个商品
metricRegistry.meter("order.items").mark(10l);  

metricsRegistry 收集并计算后会产生类似于以下的数据:

Type Meter
time 1484099089671
count 1
fifteen-minute 0.2
five-minute 0.2
one-minute 0.2
mean-minute 0.11221616902484063

4. Histogram

Histogram 是一个基于 Counter 的只增计数器,同事可以度量流数据中的分布情况, Histogram 可以计算最大/小值、平均值,方差,分位数:如50%,75%,95%,99%,99.9% 的数据在哪个范围内(即小于多少)。

在监控领域,业界多采用分位数。至于为何采用分位数而不是平均数,大家可以参考文章 Averages Can Be Misleading: Try a Percentile

TL;DR; 如果文章太长,总结起来就是一句话:如果9个贫困户和盖茨做邻居,则平均后每人都是亿万富翁。

运用 Histogram 我们可以计算一分钟内请求的次数、最长相应时间、最短相应时间、平均响应时间、75% 的数据响应时间范围等等。

long payStart = System.currentTimeMillis();  
/// 订单支付
...
/// 支付结束
long payFinish = System.currentTimeMillis();

// 记录支付花费时间
metricRegistry.histogram("order-pay-request").update(payFinish- payStart);  
Type Meter
time 1484099089671
count 5
run-count 5
std-dev 7.614173918509521
max 30
min 1
mean 8.128943547667932
50-percentile 4
75-percentile 6
95-percentile 18
99-percentile 18
999-percentile 144

5. Timer

Timer 是 HistogramMeter 的一个组合,比如要统计当前请求的速率和处理时间。也是监控系统中运用最多的一个工具。它的用法和 Histogram 一样,并且产生的数据是 Timer 和 Histogram 的集合。

张成栋

Read more posts by this author.

中国浙江省杭州市

Subscribe to The Terminus Blog

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!