Metrics核心

翻译自Metrics官方文档: http://metrics.codahale.com/manual/core/

JAVA Metrics是一个用于度量的一个JAVA的类库,使用请參见  <

Java Metric使用介绍1

http://blog.csdn.net/scutshuxue/article/details/8350135

或者官方的高速入门:http://metrics.codahale.com/getting-started/

在Metrics中最重要的包就是metrics-core,它提供下面几个主要的功能:

l 5种度量的类型:GaugesCountersHistogramsMeters,Timers.

l  健康检查(Health Checks)

l  能够通过JMX,终端,CSV文件来报告Metrics指标

全部的度量类型都是在Metrics或者MetricsRegistry类中,假设你的应用执行在另外一个独立的JVM应用中的话(如多个WARS部署在同一个应用服务上),你应该使用MetricsRegistry这个实例。假设你的应用是单独一个JVM进程的话,你能够使用Metrics中的静态工厂方法。

本文档如果你在使用Metrics,而且全部的接口都是一致的。

Metric Names-度量名

每个度量(Metric)都有自己的名字,它包含下面几个内容

l  Group

Metric最上层的分类,假设Metric是一个类的话,那么默认值是这个类所在包的名称(比如:com.example.proj.auth)

l  Type

Metric第二层的名字,假设Metric是一个类的话,那么默认值就是这个类的名字(如SessionStore)

l  Name

描写叙述Metric信息的一个简短的描写叙述

l  Scope

可选的,表示Metric范围的描写叙述信息,当你在一个类中有多个实例的时候会实用

Metrics跟MetricsRegistry中的工厂方法,接受class/name,class/name/scope作为參数调用,或者是使用MetricName这个类进行封装。

Gauges

Gauge是最简单的度量类型,仅仅有一个简单的返回值,比如,你的应用中有一个由第三方类库中保持的一个度量值,你能够非常easy的通过Gauge来度量他,代码例如以下:

  1. Metrics.newGauge(SessionStore.class,"cache-evictions", new Gauge<Integer>() {
  2. @Override
  3. publicInteger value() {
  4. return cache.getEvictionsCount();
  5. }
  6. });

那么Metrics会创建一个叫做com.example.proj.auth.SessionStore.cache-evictions的Gauge,返回缓存中Eviction的个数。

JMX Gauges

Metrics提供一个JmxGauge类,能够供非常多第三方的类库通过JMX来展示度量值,通过Metric的newGauge方法能够初始化他,參数为JMX MBean的Object名和属性名,另一个继承了Gauge的类,返回值为那个属性的值。

  1. Metrics.newGauge(SessionStore.class,"cache-evictions",
  2. new JmxGauge("net.sf.ehcache:type=Cache,scope=sessions,name=eviction-count","Value"));

Ratio Gauges

Ratio(比率) Gauge是一种计算两个数字之间比例的度量方法

  1. public class CacheHitRatio extends RatioGauge {
  2. privatefinal Meter hits;
  3. privatefinal Timer calls;
  4.  
  5. publicCacheHitRatio(Meter hits, Timer calls) {
  6. this.hits = hits;
  7. this.calls = calls;
  8. }
  9.  
  10. publicdouble getNumerator() {
  11. return hits.oneMinuteRate();
  12. }
  13.  
  14. publicdouble getDenominator() {
  15. return calls.oneMinuteRate();
  16. }
  17. }

这个定制的Gauge返回一个通过Meter跟Timer计算实现的缓存命中率

Percent Gauges

跟Ratio Gauge相同的接口,仅仅是将Ratio Gauge以百分比的方式展现。

Counters

Counter是一个简单64位的计数器:

  1. final Counter evictions =Metrics.newCounter(SessionStore.class, "cache-evictions");
  2. evictions.inc();
  3. evictions.inc(3);
  4. evictions.dec();
  5. evictions.dec(2);

全部的Counter都是从0開始

Histograms-直方图

Histrogram是用来度量流数据中Value的分布情况,比如,每个搜索中返回的结果集的大小:

  1. final Histogram resultCounts =Metrics.newHistogram(ProductDAO.class, "result-counts");
  2. resultCounts.update(results.size());

Histrogram 的度量值不不过计算最大/小值、平均值,方差,他还展现了分位数(如中位数,或者95th分位数)

传统上,中位数(或者其它分位数)是在一个完整的数据集中进行计算的,通过对数据的排序,然后取出中间值(或者离结束1%的那个数字,来计算99th分位数)。这样的做法是在小数据集,或者是批量计算的系统中,可是在一个高吞吐、低延时的系统中是不合适的。

一个解决方式就是从数据中进行抽样,保存一个少量、易管理的数据集,而且可以反应整体数据流的统计信息。使我们可以简单高速的计算给定分位数的近似值。这样的技术称作reservoir sampling。

Metrics中提供两种类型的直方图:uniform跟biased。

Uniform Histograms

Uniform Histogram提供直方图完整的生命周期内的有效的中位数,它会返回一个中位值。比如:这个中位数是对全部值的直方图进行了更新(这句话翻译不通),它使用了一种叫做Vitter’s R的算法,随机选择了一些线性递增的样本。

当你须要长期的測量,请使用Uniform Histograms。在你想要知道流数据的分布中是否近期变化的话,那么不要使用这样的。

Biased Histograms

Biased Histogram提供代表近期5分钟数据的分位数,他使用了一种forward-decayingpriority sample的算法,这个算法通过对最新的数据进行指数加权,不同于Uniform算法,Biased
Histogram体现的是最新的数据,能够让你高速的指导最新的数据分布发生了什么变化。Timers中使用了Biased Histogram。

Meters

Meter度量一系列事件发生的比率:

  1. final Meter getRequests =Metrics.newMeter(WebProxy.class, "get-requests","requests", TimeUnit.SECONDS);
  2. getRequests.mark();
  3. getRequests.mark(requests.size());

Meter须要除了Name之外的两个额外的信息,事件类型(enent type)跟比率单位(rate unit)。事件类型简单的描写叙述Meter须要度量的事件类型,在上面的样例中,Meter是度量代理请求数,所以他的事件类型也叫做“requests”。比率单位是命名这个比率的单位时间,在上面的样例中,这个Meter是度量每秒钟的请求次数,所以他的单位就是秒。这两个參数加起来就是表述这个Meter,描写叙述每秒钟的请求数。

Meter从几个角度上度量事件的比率,平均值是时间的平均比率,它描写叙述的是整个应用完整的生命周期的情况(比如,全部的处理的请求数除以执行的秒数),它并不描写叙述最新的数据。幸好,Meters中还有其它3个不同的指数方式表现的平均值,1分钟,5分钟,15分钟内的滑动平均值

Hint:这个平均值跟Unix中的uptime跟top中秒数的Load的含义是一致的

Timers

Timer是Histogram跟Meter的一个组合:

  1. final Timer timer = Metrics.newTimer(WebProxy.class,"get-requests", TimeUnit.MILLISECONDS, TimeUnit.SECONDS);
  2.  
  3. final TimerContext context = timer.time();
  4. try {
  5. // handlerequest
  6. } finally {
  7. context.stop();
  8. }

Timer须要的參数处理Name之外还须要,持续时间单位跟比率时间单位,持续时间单位是要度量的时间的期间的一个单位,在上面的样例中,就是MILLISECONDS,表示这段周期内的数据会依照毫秒来进行度量。比率时间单位跟Meters的一致。

注:度量消耗的时间是通过java中高进度的System.nanoTime()方法,他提供的是一种纳秒级别的度量。

Health Checks(健康检查)

Meters提供一种一致的、统一的方法来相应用进行健康检查,健康检查是一个基础的相应用是否正常执行的自我检查。

要创建一个Health Check,必须继承HealthChck类:

  1. public class DatabaseHealthCheck extends HealthCheck {
  2. private final Database database;
  3.  
  4. public DatabaseHealthCheck(Databasedatabase) {
  5. super("database");
  6. this.database = database;
  7. }
  8.  
  9. @Override
  10. protected Result check() throws Exception {
  11. if (database.ping()) {
  12. return Result.healthy();
  13. }
  14. return Result.unhealthy("Can'tping database");
  15. }
  16. }

在这个样例中,我们对Database类创建了一个健康检查,这个Database是应用中依赖的。我们虚构的Database类中有一个#ping()方法,这种方法运行了一个安全的检查语句(比如select 1)。#ping()假设语句结构正确则返回true,否则返回false,假设出现一个严重的错误则跑出异常。

DatabaseHealthCheck中有一个Database的实例,它有一个#check()方法尝试去连接数据库,假设连接成功,则返回health结果,假设不成功,则返回unhealthy结果。

在健康检查#check()中抛出的异常被捕获了,而且伴随着所有堆栈返回不健康结果。

注冊一个健康检查,能够是HealthCheck单例也能够是一个HealthCheckRegistry实例:

  1. HealthChecks.register(newDatabaseHealthCheck(database));
  2. 也能够注冊一串的健康检查:
  3. for(Entry<String, Result> entry : HealthChecks.run().entrySet()) {
  4.     if (entry.getValue().isHealthy()) {
  5.         System.out.println(entry.getKey() +": PASS");
  6.     } else {
  7.         System.out.println(entry.getKey() +": FAIL");
  8.     }
  9. }

Reporters报告

Reporters是将你的应用中全部的度量指标展现出来的一种方式,metrics-core中用了三种方法来导出你的度量指标,JMX,Console跟CSV文件

JMX

默认的,Metrics一直将你的全部指标注冊成JMX的MBeans,你能够通过安装了VisualVM-MBeans的VisualVM(大部分JDK自带的jvisualvm)或者Jconsole(大部分JDK自带的jconsole)

提示:你能够双击meteric属性,VisualVM会将数据以图形的方式展现出来。

这样的Report必须是JMX一直都是打开的,因为JMX的RPC API是不可靠的,我们不建议你在生产环境中通过JMX来手机度量指标。对于开发人员来说,最好是通过网页来浏览,这会很好用。

Console

对于一些简单的基准,Metrics提供了ConsoleReporter,这个周期性的打印出注冊的metric到控制台上。命令例如以下:

  1. ConsoleReporter.enable(1,TimeUnit.SECONDS);

CSV

对于比較复杂的基准,Metrics提供了CsvReporter,他周期性的提供了一连串的给定文件夹下.csv文件。

  1. CsvReporter.enable(newFile("work/measurements"), 1, TimeUnit.SECONDS);

上面语句的意思是,每个Metric指标,都会相应有一个.csv文件创建,每秒钟都会有一行记录被写入到.csv文件里。

OtherReporters

Metrics还有其它的Reporters:

l  MetricsServlet  将你的度量指标以JSon的格式展现的Servlet,他还能够进行检查检查,Dump线程,暴露出有价值的JVM层面跟OS层面的信息

l  GanliaReporter  将度量指标以流式的方式返回给Gangliaserver

l  GraphiteReporter  将度量指标以流式的方式返回给Graphiteserver

JAVA Metrics度量工具 - Metrics Core 翻译的更多相关文章

  1. JAVA Metrics 度量工具使用介绍1

    Java Metric使用介绍1 Metrics是一个给JAVA提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控,同一时候,Metrics可以非常好的跟 ...

  2. JAVA Metrics 度量工具使用介绍

    转载: http://blog.csdn.net/scutshuxue/article/details/8350135 http://koven2049.iteye.com/blog/968143 h ...

  3. Java实时监控类库Metrics

    随着系统越来越大,越来越复杂,我们需要在业务方面加上一些监控服务.Metrics作为一款监控指标的度量类库,提供了许多工具帮助开发者来完成自定义的监控工作. 使用Metrics 使用Metrics,只 ...

  4. Java代码质量度量工具大阅兵

    FindBugs FindBugs, a program which uses static analysis to look for bugs in Java code. It is free so ...

  5. Metrics-Java版的指标度量工具之一

    Metrics是一个给JAVA服务的各项指标提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控,同时,Metrics能够很好的跟Ganlia.Graphi ...

  6. Metrics-Java版的指标度量工具

    介绍 Metrics是一个给JAVA服务的各项指标提供度量工具的包,在JAVA代码中嵌入Metrics代码,可以方便的对业务代码的各个指标进行监控,同时,Metrics能够很好的跟Ganlia.Gra ...

  7. Java代码度量分析工具:Designite简介

    前言 在Java面向对象课程的学习过程中,我们需要使用度量工具来分析自己程序的代码结构.此类的度量工具有许多,或以插件形式存在于各个IDE中,或以.jar包的形式供用户使用.在这里,笔者向大家简单的介 ...

  8. Java代码度量分析工具:DesigniteJava简介

    前言 在Java面向对象课程的学习过程中,我们需要使用度量工具来分析自己程序的代码结构.受OO课程组以及前辈们博客提醒,笔者找到了DesigniteJava这款软件,现对此软件进行简单的说明. 一.D ...

  9. Metrics-Java版的指标度量工具之二

    接上<Metrics-Java版的指标度量工具之一> 4.       Histograms Histograms主要使用来统计数据的分布情况,最大值.最小值.平均值.中位数,百分比(75 ...

随机推荐

  1. 成为IT经理必备的十大软技能

    对于一个IT从业者,让你谋得工作的也许是技术能力,但有助于提升职业生涯的却是软技能.步步高升的人都是那些发表文章.在会议上积极发言以及关注客户的员工(程序员).与此同时,通常情况下,企业CIO或多或少 ...

  2. win7系统cocos2dx 3.4 绑定自定义类到Lua

    Cocos2d-x 3.0开始使用bindings-generator来生成c++类的lua绑定.bindings-generator基于tolua++,通过配置tools/tolua中的ini文件以 ...

  3. 支持HTML5 SqlLite的AndroidApp

    简介: 想要建立一个支持HTML5的Android App; 这个HTML5的程序需要使用本地存储,特别是sqllite; 用eclipse创建了一个app,这个app默认在res/layout建了两 ...

  4. jquery点击图片选中特效

    jquery点击图片选中特效 点击在线预览效果

  5. C语言程序设计做题笔记之C语言基础知识(上)

    C语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行事.并且C是相当灵活的,用于执行计算机程序能完成的几乎 ...

  6. 记录利用ettercap进行简单的arp欺骗和mitm攻击过程

    方法均来自网络,本人只是记录一下自己操作的过程,大神请无视之- 攻击主机平台:kali-linux        被攻击主机:安卓手机192.168.1.107    (在同一局域网内) 1.利用et ...

  7. 批量建立EXCHANGE邮件帐号建立三部曲

    第一步:从AD里导出用户名(可以基于OU),将输出的CSV的DN列删除,并去除可能的测试及其它用途用户名. csvde -f users-gz.csv -d "ou=MKT gz,dc=xm ...

  8. JQuery 去除字符串两边多余的空格

    var str = "  hello  "; str = $.trim(str);//去除多余空格 //变成了"hello"

  9. awsomeplayer结构认识

    把这个搞明白,算是顿悟的一个真实例子.怎么也搞不懂的架构,突然就想明白了.不过这其实是一个思维的过程. 当然如果你想明白这些东西,至少要非常清楚一个概念:接口. 我只是一个半路出家的开发者,我真正明白 ...

  10. Learing WCF Chapter1 Fundamental WCF Concepts

    At its core,WCF is a development platform for service-oriented applications. As I mentioned earlier, ...