`

JAVA Metrics度量工具 - Metrics Core

 
阅读更多

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是最简单的度量类型,只有一个简单的返回值,例如,你的应用中有一个由第三方类库中保持的一个度量值,你可以很容易的通过Gauge来度量他,代码如下:

 

[java] view plaincopy
 
  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的类,返回值为那个属性的值。

 

[java] view plaincopy
 
  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是一种计算两个数字之间比例的度量方法

 

[java] view plaincopy
 
  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位的计数器:

 

[java] view plaincopy
 
  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的分布情况,例如,每一个搜索中返回的结果集的大小:

 

[java] view plaincopy
 
  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提供直方图完整的生命周期内的有效的中位数,它会返回一个中位值。例如:这个中位数是对所有值的直方图进行了更新(这句话翻译不通),它使用了一种叫做Vitters R的算法,随机选择了一些线性递增的样本。

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

Biased Histograms

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

Meters

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

 

[java] view plaincopy
 
  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的一个组合:

 

[java] view plaincopy
 
  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类:

 

[java] view plaincopy
 
  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实例:

 

[java] view plaincopy
 
  1. <pre name="code" class="java">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. }</pre>  
  10. <pre></pre>  
  11. <p></p>  
  12. <pre></pre>  
  13. <p></p>  
  14. <pre></pre>  
  15. <pre></pre>  
  16. <pre></pre>  

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到控制台上。命令如下:

 

[java] view plaincopy
 
  1. ConsoleReporter.enable(1,TimeUnit.SECONDS);  

 

CSV

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

 

[java] view plaincopy
 
  1. CsvReporter.enable(newFile("work/measurements"), 1, TimeUnit.SECONDS);  

 

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

OtherReporters

Metrics还有其他的Reporters:

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

l  GanliaReporter  将度量指标以流式的方式返回给Ganglia服务器

l  GraphiteReporter  将度量指标以流式的方式返回给Graphite服务器

分享到:
评论
1 楼 zhangjianxinjava 2016-10-29  
您好,大神本人小白一个最近在研究不知道可否 通过邮箱进行交流,或者您有Metrics demo 给我一个我去研究一下,感谢。 邮箱:zhang-rd-fe@s139.org

相关推荐

    metrics-core-3.1.0.jar_jar包_

    metrics-core-3.1.0.jar 是一个专注于此类任务的Java库,它提供了丰富的度量功能,帮助开发者深入理解应用程序的运行状态,从而优化性能、定位问题。本文将深入探讨metrics-core-3.1.0.jar的主要特性和使用场景。 ...

    Laravel开发-metrics-core-laravel

    在 Laravel 框架中,`metrics-core-laravel` 是一个用于实现度量管理和统计的扩展库。它为开发者提供了方便的方式来收集、存储和展示应用中的各种指标数据,如性能指标、用户行为统计、业务关键指标等。这个库通常...

    metrics-core-3.0.2.jar

    Metrics工具类用于检测系统的工具类的工具类的工具类的工具类的工具类,度量、调用次数、计量的工具类的工具类

    完整jar包资源,COULD NOT FIND metrics-core,包缺失使用

    在Java开发过程中,依赖管理是至关重要的,尤其是当我们使用Maven或Gradle这样的构建工具时。标题提到的问题“完整jar包资源,COULD NOT FIND metrics-core,包缺失使用”是典型的Maven构建失败的情况,通常发生在...

    metrics-reporter.zip

    "metrics-reporter.zip"是一个专注于度量组件的压缩包,其中包含了用于Java应用程序的metrics-core库以及一个Prometheus输出器,帮助开发者收集并报告关键的系统和应用程序指标。本文将深入探讨这个压缩包中的内容...

    Yammer metrics

    Yammer Metrics为Java应用程序提供了丰富的度量工具和灵活的报告机制,使得开发者能够更好地理解系统的运行状况。通过合理配置和使用这些工具,可以显著提高系统的可靠性和性能。无论是对于开发人员还是运维团队来说...

    metrics-scala_2.9.2-2.1.4.jar

    Scala 2.12 的度量标准 nl.grons/metrics-scala_2.9.2/2.1.4/metrics-scala_2.9.2-2.1.4.jar

    metrics-influxdb:指标报告者,它向InfluxDB服务器宣布测量结果

    该库提供: 比influxdb-java轻巧的客户端,仅将系列推送到服务器。 的报告程序,它宣布度量。 与influxdb-java相比,该库提供的客户端更轻巧,只能推送指标。依存关系: slf4j-api用于记录。 如果您使用...

    dotnet-AppMetrics用于记录程序性能指标的一个开源和跨平台NET库

    6. **跨平台支持**:AppMetrics 支持.NET Core,这意味着它可以运行在Windows、Linux和macOS等不同操作系统上,适应各种云环境和容器化部署。 7. **易于扩展**:由于其模块化的架构,开发者可以轻松扩展和定制App...

    metrics-clojure:围绕Coda Hale指标库的立面

    Coda Hale Metrics库是一个广泛使用的Java库,用于度量和监控应用程序的健康状况和性能。 ### 一、Coda Hale Metrics库基础 Coda Hale Metrics库提供了多种类型的指标,包括: 1. **计数器(Counters)**:用于...

    Metrics:捕获 JVM 和应用程序级指标-开源

    Metrics 是一个 Java 库,可让您深入了解代码在生产中的作用。 Metrics 提供了一个强大的工具包,用于衡量生产环境中关键组件的行为。 借助 Jetty、Logback、Log4j、Apache HttpClient、Ehcache、JDBI、Jersey 等...

    primeval-metrics:将Dropwizard Java指标库包装到OSGi服务中

    原始指标 原始度量标准将标准包装到OSGi服务中。...&lt; dependency&gt;&lt; groupId&gt;io.dropwizard.metrics&lt;/ groupId&gt;&lt; artifactId&gt;metrics-core&lt;/ artifactId&gt;&lt; version&gt;3.2.2&lt;/ version&gt;&lt;/ dependency

    datafx-featuretoggle-8.0b2.zip

    【描述】"salad-metrics-core.zip,色拉指标corepray指标,喷洒路线:整合coda-hale指标" 提到了 Salad Metrics Core,这可能是另一个开源项目,专注于提供度量和监控能力。"色拉指标"可能是该项目的中文译名,而 ...

    metrics-spark:Apache Spark Streaming 的 Dropwizard 指标示例

    Dropwizard 是一个用于构建生产级 Java 应用程序的工具集,它包含了一系列库,如 Metrics,用于收集和报告应用程序的运行时指标。这些指标可以帮助开发者了解系统的健康状况、资源利用率和潜在问题。 首先,要将 ...

    Netty4&5源码编译所需jar包

    8. **metrics-core-2.0.3.jar**:Metrics库提供了各种度量收集器,帮助监控和分析Netty应用的性能指标。 9. **jzlib-1.1.3.jar**:一个纯Java实现的ZLIB压缩库,用于数据压缩和解压缩,可能在Netty的压缩编码解码中...

    micrometer-jar.zip

    《Micrometer:Java 应用性能度量...Micrometer Core 提供了度量API,而 Prometheus Registry 则让这些指标能够被强大的 Prometheus 系统所利用,为开发者带来了宝贵的洞察力,有助于优化和维护高可用的 Java 应用。

    org.springframework.core_3.1.1.RELEASE.jar

    5. `org.springframework.core.metrics`: 引入了度量(Metrics)的概念,用于收集和报告应用程序的性能数据,如计时器、度量和标记。 6. `org.springframework.core.annotation`: 包含了对Java注解的处理,如`...

    telemetry_metrics_prometheus_core:用于Telemetry_metrics_prometheus的核心Prometheus Telemetry.Metrics报告程序包

    总结起来,`telemetry_metrics_prometheus_core`是Elixir生态系统中的一个重要工具,它使Prometheus监控变得更加便捷,增强了Elixir应用的可观察性和可维护性。通过利用这个库,开发者可以更好地理解和优化他们的...

    prometheu对java服务自定义指标的监控

    通过上述步骤,我们可以成功地将 Java 微服务与 Prometheus 集成,不仅能够获取到默认提供的健康检查和度量指标,还能自定义特定的业务指标,并通过 Prometheus 进行有效的监控。这种方式大大提高了系统的可观测性,...

Global site tag (gtag.js) - Google Analytics