详解Metrics应⽤监控指标的使⽤说明
⽬录
引⽤Metric库
Registry
Gauge(仪表)
Counter(计数器)
Meter()
Histogram(直⽅图)
Timer(计时器)
HealthCheck(健康检查)
JMX报表
HTTP报表
其它报表
MetricSet
第三⽅库
MetricsforSpring
基本⽤法
XML风格的配置
msconfigjava注解的⽅式
题前:做过虚拟化级别、系统级别、容器级别监控;应⽤级别监控有哪些⽅法可以做?
Metrics是个很好的选择。java、python、go均可⽀持。
Metrics可以为你的代码的运⾏提供⽆与伦⽐的洞察⼒。作为⼀款监控指标的度量类库,它提供了很多
模块可以为第三⽅库或者应⽤提供辅助统计信息,⽐如Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, Jery, 它还可以将度量数据发送给Ganglia和Graphite以提供图形化的监控。
Metrics提供了Gauge、Counter、Meter、Histogram、Timer等度量⼯具类以及Health Check功能。
引⽤Metric库
将metrics-core加⼊到l中:
<dependencies>
<dependency>
<groupId&ics</groupId>
<artifactId>metrics-core</artifactId>
<version>${metrics.version}</version>
</dependency>
</dependencies>
将metrics.version设置为metrics最新的版本。
现在你可以在你的程序代码中加⼊⼀些度量了。
Registry
Metric的中⼼部件是MetricRegistry。它是程序中所有度量metric的容器。让我们接着在代码中加⼊⼀⾏:
final MetricRegistry metrics = new MetricRegistry();
Gauge (仪表)
Gauge代表⼀个度量的即时值。当你开汽车的时候,当前速度是Gauge值。你测体温的时候,体温计的刻度是⼀个Gauge值。当你的程序运⾏的时候,内存使⽤量和CPU占⽤率都可以通过Gauge值来度量。
⽐如我们可以查看⼀个队列当前的size。
public class QueueManager {
private final Queue queue;
public QueueManager(MetricRegistry metrics, String name) {
滴滴涕
this.queue = new Queue();
new Gauge<Integer>() {
@Override
public Integer getValue() {
return queue.size();
}
}
);
}
}
registry中每⼀个metric都有唯⼀的名字。它可以是以.连接的字符串。如"unt" 和 "lobu.Thing.latency"。MetricRegistry提供了⼀个静态的辅助⽅法⽤来⽣成这个名字:
MetricRegistry.name(QueueManager.class, "jobs", "size")
⽣成的name为lobu.QueueManager.jobs.size。
实际编程中对于队列或者类似队列的数据结构,你不会简单的度量queue.size(),因为在java.util和urrent包中⼤部分的queue的#size是O(n),这意味的调⽤此⽅法会有性能的问题,更深⼀步,可能会有lock的问题。
RatioGauge可以计算两个Gauge的⽐值。 Meter和Timer可以参考下⾯的代码创建。下⾯的代码⽤来计算计算命中率 (hit/call)。
public class CacheHitRatio extends RatioGauge {
private final Meter hits;
private final Timer calls;
public CacheHitRatio(Meter hits, Timer calls) {
this.hits = hits; this.calls = calls;
}
@Override
red fox
public Ratio getValue() {
return Ratio.MinuteRate(), MinuteRate());
}
}
CachedGauge可以缓存耗时的测量。DerivativeGauge可以引⽤另外⼀个Gauage。
Counter (计数器)
Counter是⼀个AtomicLong实例,可以增加或者减少值。例如,可以⽤它来计数队列中加⼊的Job的总数。
private final Counter pendingJobs
= unter(name(QueueManager.class, "pending-jobs"));
public void addJob(Job job) {
pendingJobs.inc();
queue.offer(job);
}
public Job takeJob() {
pendingJobs.dec();
return queue.take();
}
和上⾯Gauage不同,这⾥我们使⽤的是unter⽅法⽽不是ister⽅法。使⽤unter更简单。
Meter ()
Meter⽤来计算事件的速率。例如 request per cond。还可以提供1分钟,5分钟,15分钟不断更新的平均速率。
private final Histogram responSizes
= metrics.histogram(name(RequestHandler.class, "respon-sizes");
public void handleRequest(Request request, Respon respon) {
// etc
responSizes.Content().length);
}
Histogram (直⽅图)
Histogram可以为数据流提供统计数据。除了最⼤值,最⼩值,平均值外,它还可以测量中值(median),百分⽐⽐如XX%这样的Quantile数据。
private final Histogram responSizes = metrics.histogram(name(RequestHandler.class, "respon-sizes"); public void handleRequest(Request request, Respon respon) { // etc responSizes.Content().length); }这个例⼦⽤来统计respon的字节数。
Metrics提供了⼀批的Rervoir实现,⾮常有⽤。例如SlidingTimeWindowRervoir ⽤来统计最新N个秒(或其它时间单元)的数据。
Timer (计时器)
Timer⽤来测量⼀段代码被调⽤的速率和⽤时。
marauderprivate final Timer respons = metrics.timer(name(RequestHandler.class, "respons"));
public String handleRequest(Request request, Respon respon) {
final Timer.Context context = respons.time();
try {
// etc;
return "OK";
} finally {
context.stop();
}
}
这段代码⽤来计算中间的代码⽤时以及request的速率。
Health Check (健康检查)
Metric还提供了服务健康检查能⼒,由metrics-healthchecks模块提供。
先创建⼀个HealthCheckRegistry实例。
成长的烦恼下载
final HealthCheckRegistry healthChecks = new HealthCheckRegistry();
再实现⼀个HealthCheck⼦类,⽤来检查数据库的状态。
public class DatabaHealthCheck extends HealthCheck {
private final Databa databa;
public DatabaHealthCheck(Databa databa) {
this.databa = databa;
}
@Override
public HealthCheck.Result check() throws Exception {
if (databa.isConnected()) {
return HealthCheck.Result.healthy();
} el {
return HealthCheck.Result.unhealthy("Cannot connect to " +
}
}
}
注册⼀下。
最后运⾏健康检查并查看检查结果。
final Map<String, HealthCheck.Result> results = healthChecks.runHealthChecks();
for (Entry<String, HealthCheck.Result> entry : Set()) {
人际沟通能力
if (Value().isHealthy()) {bimmer
System.out.Key() + " is healthy");
} el {
final Throwable e = Value().getError();
if (e != null) {
e.printStackTrace();
}
}
}
Metric内置⼀个ThreadDeadlockHealthCheck,它使⽤java内置的线程死锁检查⽅法来检查程序中是否有死锁。
通过JMX报告Metric。
final JmxReporter reporter = JmxReporter.forRegistry(registry).build();
reporter.start();
⼀旦启动,所有registry中注册的metric都可以通过JConsole或者VisualVM查看 (通过MBean插件)。
HTTP报表
Metric也提供了⼀个rvlet (AdminServlet)提供JSON风格的报表。它还提供了单⼀功能的rvlet (MetricsServlet, HealthCheckServlet, ThreadDumpServlet, PingServlet)。
你需要在l加⼊metrics-rvlets。
<dependency>
<groupId&ics</groupId>feet是什么意思
<artifactId>metrics-rvlets</artifactId>
<version>${metrics.version}</version>
</dependency>
其它报表
除了JMX和HTTP, metric还提供其它报表。
STDOUT, using ConsoleReporter from metrics-core
final ConsoleReporter reporter = ConsoleReporter.forRegistry(registry)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.MINUTES);
CSV files, using CsvReporter from metrics-core
final CsvReporter reporter = CsvReporter.forRegistry(registry)
.formatFor(Locale.US)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build(new File("~/projects/data/"));
reporter.start(1, TimeUnit.SECONDS);
SLF4J loggers, using Slf4jReporter from metrics-core
final Slf4jReporter reporter = Slf4jReporter.forRegistry(registry)
.Logger("ics"))
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.MINUTES);
Ganglia, using GangliaReporter from metrics-ganglia
final GMetric ganglia = new GMetric("", 8649, UDPAddressingMode.MULTICAST, 1);
final GangliaReporter reporter = GangliaReporter.forRegistry(registry)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build(ganglia);
reporter.start(1, TimeUnit.MINUTES);
Graphite, using GraphiteReporter from metrics-graphite
MetricSet
可以将⼀组Metric组织成⼀组便于重⽤。
final Graphite graphite = new Graphite(new InetSocketAddress("", 2003));
final GraphiteReporter reporter = GraphiteReporter.forRegistry(registry)
.prefixedWith("")
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.
filter(MetricFilter.ALL)
.build(graphite);
reporter.start(1, TimeUnit.MINUTES);
⼀些模块 metrics-json提供了json格式的序列化。
以及为其它库提供度量的能⼒metrics-ehcachemetrics-httpclientmetrics-jdbimetrics-jerymetrics-jettymetrics-log4jmetrics-logbackmetrics-jvmmetrics-rvlet 注意不是metrics-rvlets 第三⽅库
metrics-librato提供Librato Metrics报表
Metrics Spring Integration提供了Spring的集成
matext-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组
你需要在l加⼊
<dependency>
<groupId&ics</groupId>
<artifactId>metrics-spring</artifactId>
<version>3.0.1</version>
</dependency>
XML风格的配置
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:metrics="/schema/metrics"
xsi:schemaLocation="
true是什么意思/schema/beans
/schema/beans/spring-beans-3.2.xsd
/schema/metrics /schema/metrics/metrics-3.0.xsd">
<!-- Registry should be defined in only one context XML file -->
<metrics:metric-registry id="metrics" />
<!-- annotation-driven must be included in all context files -->
<metrics:annotation-driven metric-registry="metrics" />
<!-- (Optional) Registry should be defined in only one context XML file -->
照会
<metrics:reporter type="console" metric-registry="metrics" period="1m" />
<!-- (Optional) The metrics in this example require the metrics-jvm jar-->
<metrics:register metric-registry="metrics">
<bean metrics:name="" class="ics.jvm.GarbageCollectorMetricSet" />
<bean metrics:name="" class="ics.jvm.MemoryUsageGaugeSet" />
<bean metrics:name="jvm.thread-states" class="ics.jvm.ThreadStatesGaugeSet" />
<bean metrics:name="jvm.fd.usage" class="ics.jvm.FileDescriptorRatioGauge" />
</metrics:register>
<!-- Beans and other Spring config -->
</beans>
java注解的⽅式
import urrent.TimeUnit;
import t.annotation.Configuration;
ics.ConsoleReporter;
ics.MetricRegistry;
ics.SharedMetricRegistries;
fig.annotation.EnableMetrics;
fig.annotation.MetricsConfigurerAdapter;
@Configuration
@EnableMetrics
public class SpringConfiguringClass extends MetricsConfigurerAdapter {
@Override
public void configureReporters(MetricRegistry metricRegistry) {
ConsoleReporter.forRegistry(metricRegistry).build().start(1, TimeUnit.MINUTES);
}
}
注: go Metrics使⽤:
以上就是详解Metrics应⽤监控指标的使⽤说明的详细内容,更多关于Metrics应⽤监控指标使⽤的资料请关注其它相关⽂章!