题前:做过虚拟化级别、系统级别、容器级别监控;应用级别监控有哪些方法可以做?
Metrics是个很好的选择。java、python、go均可支持。
Metrics可以为你的代码的运行提供无与伦比的洞察力。作为一款监控指标的度量类库,它提供了很多模块可以为第三方库或者应用提供辅助统计信息, 比如Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, Jersey, 它还可以将度量数据发送给Ganglia和Graphite以提供图形化的监控。
Metrics提供了Gauge、Counter、Meter、Histogram、Timer等度量工具类以及Health Check功能。
引用Metric库将metrics-core加入到maven pom.xml中:
将metrics.version 设置为metrics最新的版本。现在你可以在你的程序代码中加入一些度量了。
RegistryMetric的中心部件是MetricRegistry。 它是程序中所有度量metric的容器。让我们接着在代码中加入一行:
Gauge (仪表)Gauge代表一个度量的即时值。 当你开汽车的时候, 当前速度是Gauge值。 你测体温的时候, 体温计的刻度是一个Gauge值。 当你的程序运行的时候, 内存使用量和CPU占用率都可以通过Gauge值来度量。比如我们可以查看一个队列当前的size。
registry 中每一个metric都有唯一的名字。 它可以是以.连接的字符串。 如"things.count" 和 "com.colobu.Thing.latency"。 MetricRegistry 提供了一个静态的辅助方法用来生成这个名字:
生成的name为com.colobu.QueueManager.jobs.size。
实际编程中对于队列或者类似队列的数据结构,你不会简单的度量queue.size(), 因为在java.util和java.util.concurrent包中大部分的queue的#size是O(n),这意味的调用此方法会有性能的问题, 更深一步,可能会有lock的问题。
RatioGauge可以计算两个Gauge的比值。 Meter和Timer可以参考下面的代码创建。下面的代码用来计算计算命中率 (hit/call)。
CachedGauge可以缓存耗时的测量。DerivativeGauge可以引用另外一个Gauage。
Counter (计数器)Counter是一个AtomicLong实例, 可以增加或者减少值。 例如,可以用它来计数队列中加入的Job的总数。
和上面Gauage不同,这里我们使用的是metrics.counter方法而不是metrics.register方法。 使用metrics.counter更简单。
Meter ()Meter用来计算事件的速率。 例如 request per second。 还可以提供1分钟,5分钟,15分钟不断更新的平均速率。
Histogram (直方图)Histogram可以为数据流提供统计数据。 除了最大值,最小值,平均值外,它还可以测量 中值(median),百分比比如XX%这样的Quantile数据 。
private final Histogram responseSizes = metrics.histogram(name(RequestHandler.class, "response-sizes"); public void handleRequest(Request request, Response response) { // etc responseSizes.update(response.getContent().length); }这个例子用来统计response的字节数。Metrics提供了一批的Reservoir实现,非常有用。例如SlidingTimeWindowReservoir 用来统计最新N个秒(或其它时间单元)的数据。
Timer (计时器)Timer用来测量一段代码被调用的速率和用时。
这段代码用来计算中间的代码用时以及request的速率。
Health Check (健康检查)Metric还提供了服务健康检查能力, 由metrics-healthchecks模块提供。先创建一个HealthCheckRegistry实例。
再实现一个HealthCheck子类, 用来检查数据库的状态。
注册一下。
最后运行健康检查并查看检查结果。
Metric内置一个ThreadDeadlockHealthCheck, 它使用java内置的线程死锁检查方法来检查程序中是否有死锁。
JMX报表通过JMX报告Metric。
一旦启动, 所有registry中注册的metric都可以通过JConsole或者VisualVM查看 (通过MBean插件)。
HTTP报表Metric也提供了一个servlet (AdminServlet)提供JSON风格的报表。它还提供了单一功能的servlet (MetricsServlet, HealthCheckServlet, ThreadDumpServlet, PingServlet)。你需要在pom.xml加入metrics-servlets。
其它报表除了JMX和HTTP, metric还提供其它报表。
STDOUT, using ConsoleReporter from metrics-core
CSV files, using CsvReporter from metrics-core
SLF4J loggers, using Slf4jReporter from metrics-core
Ganglia, using GangliaReporter from metrics-ganglia
Graphite, using GraphiteReporter from metrics-graphite
MetricSet可以将一组Metric组织成一组便于重用。
一些模块 metrics-json提供了json格式的序列化。以及为其它库提供度量的能力metrics-ehcachemetrics-httpclientmetrics-jdbimetrics-jerseymetrics-jettymetrics-log4jmetrics-logbackmetrics-jvmmetrics-servlet 注意不是metrics-servlets
第三方库 metrics-librato 提供Librato Metrics报表Metrics Spring Integration 提供了Spring的集成sematext-metrics-reporter 提供了SPM报表.wicket-metrics提供Wicket应用.metrics-guice 提供Guice集成.metrics-scala 提供了为Scala优化的API.这里重点介绍一下Metrics for Spring
Metrics for Spring这个库为Spring增加了Metric库, 提供基于XML或者注解方式。
可以使用注解创建metric和代理类。 @Timed, @Metered, @ExceptionMetered, @Counted为注解了 @Gauge 和 @CachedGauge的bean注册Gauge为@Metric注解的字段自动装配注册HealthCheck通过XML配置产生报表通过XML注册metric和metric组你需要在pom.xml加入
基本用法 XML风格的配置 java注解的方式注: go Metrics使用: Go语言metrics应用监控指标基本使用说明
以上就是详解Metrics应用监控指标的使用说明的详细内容,更多关于Metrics应用监控指标使用的资料请关注七叶笔记其它相关文章!