本文目录
1 Metric Registry
2 Reporter
3 Metric
4 Snapshot 数据快照
5 完整示例代码
1 Metric Registry
存放所有Metrics的容器,以Name-Metric(Key-Value)形式维护其中的Metric对象。
2 Reporter
定期将Metric Registry对象发送至监控服务器,即定期将其中存放的所有Metric对象发送给监控服务器。
3 Metric
3.1 Gauge/RatioGauge 数值/比率
gauge.getValue()
获取数值
gauge.getRatio()
获取比率
3.2 Counter 计数
counter.inc()
增加1次
counter.inc(long n)
增加n次
counter.dec()
减少1次
counter.dec(long n)
减少n次
counter.getCount()
获取当前次数
3.3 Meter 频率
meter.mark()
记录1次
meter.mark(long n)
记录n次
meter.getCount()
自创建Meter时起,一共mark多少次;
meter.getMeanRate()
自创建Meter时起,平均每秒mark多少次;
meter.getOne/Five/FifteenMinuteRate()
最近1/5/15分钟,每秒mark的指数加权移动平均值;
3.4 Histogram 统计数据
histogram.update(int/long n)
增加一个n值记录
histogram.getCount()
获取记录总个数
histogram.getSnapshot()
获取当前快照
3.5 Timer 计时(Meter+ Histogram)
Context ctx = timer.time()
开始计时
ctx.stop()
结束计时,记录1次,增加一个计时值记录;
内部:meter.mark() + histogram.update(time)
timer.update(long duration, TimeUnit unit)
记录1次,增加一个计时值duration记录,单位由unit指定;
timer.getCount/getMeanRate/getOne/Five/FifteenMinuteRate()
详见Meter对应方法
timer.getSnapshot()
获取当前快照
4 Snapshot 数据快照
snapshot.size()
获取记录总个数
snapshot.getValues()
获取记录数组
snapshot.getValue(double quantile)
获取指定百分位记录值
snapshot.getMin/Max/Median/Mean()
获取其中最小值/最大值/中位值/平均值
snapshot.get75/95/98/99/999thPercentile()
获取75/95/98/99/99.9百分位记录值
5 完整示例代码
public static void main(String[] args) {// 创建 Metric Registry 对象MetricRegistry registry = new MetricRegistry();// 创建 Reporter 并绑定 Metric Registry 对象(本示例:创建一个控制台Reporter)ConsoleReporter reporter = ConsoleReporter.forRegistry(registry).build();// 定期将 Metric Registry 对象内容发送至监控服务器(本示例:发送至控制台)reporter.start(5, TimeUnit.SECONDS);// 模拟一群玩家final Set<Object> players = new HashSet<>();// Gauge : 获取玩家数量// 每次Report时,当场计算(获取)当前玩家的数量。registry.register("gauge", new Gauge<Integer>() {@Overridepublic Integer getValue() {return players.size();}});// Counter : 计数玩家数量// 每次Report时,通过counter.getCount()方法,直接得到当前玩家的数量。Counter counter = registry.counter("counter");// 新加入1个玩家counter.inc();// 新加入10个玩家counter.inc(10);// 离开1个玩家counter.dec();// 离开5个玩家counter.dec(5);// Meter : 计算击杀频率// 每次Report时,会通过相应的方法,得到总击杀数/平均每秒击杀数/近1分钟内平均每秒击杀数等。Meter meter = registry.meter("meter");// 发生一次击杀meter.mark();// Histograms : 统计每场击杀数量// SlidingTimeWindowReservoir表示仅统计近期某一段时间的数据(示例中指定为近7天的数据)Histogram histogram = new Histogram(new SlidingTimeWindowReservoir(7, TimeUnit.DAYS));registry.register("histogram", histogram);// 完成一场比赛并击杀33次histogram.update(33);// 完成一场比赛并击杀17次histogram.update(17);// Timer : 统计每场游戏时间// SlidingTimeWindowReservoir表示仅统计近期某一段时间的数据(示例中指定为近7天的数据)Timer timer = new Timer(new SlidingTimeWindowReservoir(7, TimeUnit.DAYS));registry.register("timer", timer);// 新一场游戏开始Context ctx = timer.time();// 游戏结束:场次增加1次,记录本场游戏时间。ctx.stop();
}