io.dropwizard.metrics
来源:互联网 发布:澳门网络博客游戏 编辑:程序博客网 时间:2024/04/30 06:45
转载自:http://o-u-u.com/?p=1753
http://www.cnblogs.com/super-d2/p/5002061.html
Metrics是一个给JAVA服务的各项指标提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控。作为一款监控指标的度量类库,它提供了很多模块可以为第三方库或者应用提供辅助统计信息, 比如Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, Jersey, 它还可以将度量数据发送给Ganglia和Graphite以提供图形化的监控。
Metrics提供了Gauge、Counter、Meter、Histogram、Timer等度量工具类以及Health Check功能。
Gauge (仪表)
Gauge代表一个度量的即时值,一般用来统计瞬时状态的数据信息。程序运行时的内存使用量和CPU占用率都可以通过Gauge值来度量。比如可以查看一个队列当前的size。
package org.zero.metrics;import com.codahale.metrics.ConsoleReporter;import com.codahale.metrics.Gauge;import com.codahale.metrics.MetricRegistry;import java.util.Queue;import java.util.concurrent.LinkedBlockingDeque;import java.util.concurrent.TimeUnit;public class MetricsDemo { //实例化一个MetricRegistry,最核心的一个模块,相当于一个应用程序的metrics系统的容器,维护一个Map private static final MetricRegistry metrics = new MetricRegistry(); //在控制台上打印输出 private static ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build(); public static void main(String[] args) throws Exception { gaugeTest(); } static void gaugeTest() throws Exception { reporter.start(3, TimeUnit.SECONDS); //每3秒report一次 Queue<String> queue = new LinkedBlockingDeque<>(); //实例化一个Gauge Gauge<Integer> gauge = new Gauge<Integer>() { @Override public Integer getValue() { return queue.size(); } }; //注册到容器中 metrics.register(MetricRegistry.name(MetricsDemo.class, "queue", "size"), gauge); for (int i = 0; i < 20; i++) { queue.add("a"); Thread.sleep(1000); } }}registry中的每一个metric都有唯一的名字,可以通过MetricRegistry.name来生成,上述示例生成的name为org.zero.metrics.MetricsDemo.queue.size。运行结果:
17-4-09 21:30:06 ===============================================================-- Gauges ----------------------------------------------------------------------org.zero.metrics.MetricsDemo.queue.size value = 417-4-09 21:30:09 ===============================================================-- Gauges ----------------------------------------------------------------------org.zero.metrics.MetricsDemo.queue.size value = 617-4-09 21:30:12 ===============================================================-- Gauges ----------------------------------------------------------------------org.zero.metrics.MetricsDemo.queue.size value = 917-4-09 21:30:15 ===============================================================-- Gauges ----------------------------------------------------------------------org.zero.metrics.MetricsDemo.queue.size value = 1217-4-09 21:30:18 ===============================================================-- Gauges ----------------------------------------------------------------------org.zero.metrics.MetricsDemo.queue.size value = 1517-4-09 21:30:21 ===============================================================-- Gauges ----------------------------------------------------------------------org.zero.metrics.MetricsDemo.queue.size value = 18另外,Core包种还扩展了几种特定的Gauge:
JMX Gauges—提供给第三方库只通过JMX将指标暴露出来。
Ratio Gauges—简单地通过创建一个gauge计算两个数的比值。
Cached Gauges—对某些计量指标提供缓存。
Counter (计数器)
Counter是Gauge的一个特例,维护一个计数器,可以通过inc()和dec()方法对计数器做修改。使用步骤与Gauge基本类似,在MetricRegistry中提供了静态方法可以直接实例化一个Counter。static void counterTest() { /** * 实例化一个counter,同样可以通过如下方式进行实例化再注册进去 * Counter conunter = new Counter(); * metrics.register(MetricRegistry.name(MetricsDemo.class, "counter"), conunter); **/ Counter conunter = metrics.counter(name(MetricsDemo.class, "counter")); Queue<String> queue = new LinkedList<String>(); new Thread(() -> { for (int i = 0; i < 20; i++) { try { conunter.inc();//在具体业务代码中对conunter修改// conunter.dec(); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); reporter.start(1, TimeUnit.SECONDS); }运行结果:
-- Counters --------------------------------------------------------------------org.zero.metrics.MetricsDemo.counter count = 5
Meter
Meters用来度量某个时间段的平均处理次数(request per second),每1、5、15分钟的TPS。比如一个service的请求数,通过metrics.meter()实例化一个Meter之后,然后通过meter.mark()方法就能将本次请求记录下来。统计结果有总的请求数,平均每秒的请求数,以及最近的1、5、15分钟的平均QPS。static void metersTest() { /** * 实例化一个Meter */ Meter requests = metrics.meter(MetricRegistry.name(MetricsDemo.class, "request")); new Thread(() -> { for (int i = 0; i < 2000; i++) { try { requests.mark();// handleRequest Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); reporter.start(3, TimeUnit.SECONDS); }运行结果:
-- Meters ----------------------------------------------------------------------org.zero.metrics.MetricsDemo.request count = 820 mean rate = 89.09 events/second 1-minute rate = 84.60 events/second 5-minute rate = 84.60 events/second 15-minute rate = 84.60 events/second
Histogram (直方图)
Histograms主要使用来统计数据的分布情况,最大值、最小值、平均值、中位数,百分比(75%、90%、95%、98%、99%和99.9%)。例如,需要统计某个页面的请求响应时间分布情况,可以使用该种类型的Metrics进行统计。具体的样例代码如下:static void histogramsTest() { Histogram randomNums = metrics.histogram(MetricRegistry.name(MetricsDemo.class, "random")); new Thread(() -> { for (int i = 0; i < 2000; i++) { try { randomNums.update(i * 100); Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); reporter.start(3, TimeUnit.SECONDS); }运行结果:
-- Histograms ------------------------------------------------------------------org.zero.metrics.MetricsDemo.random count = 561 min = 0 max = 56000 mean = 28431.21 stddev = 16189.63 median = 28600.00 75% <= 42500.00 95% <= 53400.00 98% <= 55000.00 99% <= 55500.00 99.9% <= 56000.00
Timer (计时器)
Timers主要是用来统计某一块代码段的执行时间以及其分布情况,具体是基于Histograms和Meters来实现的。样例代码如下:static void timerTest(){ Timer requests = metrics.timer(MetricRegistry.name(MetricsDemo.class, "request")); new Thread(() -> { Random random = new Random(); for (int i = 0; i < 200; i++) { Timer.Context context = requests.time(); try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); }finally { context.stop(); } } }).start(); reporter.start(3, TimeUnit.SECONDS); }运行结果:
-- Timers ----------------------------------------------------------------------org.zero.metrics.MetricsDemo.request count = 13 mean rate = 2.11 calls/second 1-minute rate = 2.00 calls/second 5-minute rate = 2.00 calls/second 15-minute rate = 2.00 calls/second min = 95.38 milliseconds max = 791.00 milliseconds mean = 446.68 milliseconds stddev = 219.70 milliseconds median = 481.22 milliseconds 75% <= 577.06 milliseconds 95% <= 791.00 milliseconds 98% <= 791.00 milliseconds 99% <= 791.00 milliseconds 99.9% <= 791.00 milliseconds
Health Check (健康检查)
Metric还提供了服务健康检查能力, 由metrics-healthchecks模块提供。
更多内容参考官网:http://metrics.dropwizard.io/,如果想将metrics的数据发送到influxdb或则其它地方,可以借鉴下github上metrics-influxdb的实现。
0 0
- io.dropwizard.metrics
- dropwizard metrics - healthchecks
- dropwizard metrics - 基本使用介绍
- java操作Dropwizard Metrics简单篇
- 打造可监控的线上应用dropwizard-metrics
- 基于dropwizard/metrics ,kafka,zabbix构建应用统计数据收集展示系统
- 基于dropwizard/metrics ,kafka,zabbix构建应用统计数据收集展示系统
- metrics
- metrics
- Dropwizard 框架
- Dropwizard框架入门
- dropwizard 下载功能
- Dropwizard使用错误汇总
- dropwizard微服务实践
- dropwizard框架学习
- Eigrp metrics
- Fundmental Metrics
- Java Metrics
- 如何设置网页地址栏前面的标志favicon图标?
- innodb中幻读与mvcc和间隙锁分析
- 1.getting started Stanford CoreNLP
- 赶去公司(某客某易模拟题)
- MyBatis
- io.dropwizard.metrics
- 【Spring学习26】Aware相关接口
- Android编程权威指南-----(三)SharedPreferences、SQLite使用
- yuv、pcm数据的介绍和获取
- python进阶学习笔记(三)——实现python任意个数的关键字参数
- Docker搭建本地私有仓库
- 常用的安全算法
- KMP算法next数组详解
- UVA