`
weitao1026
  • 浏览: 1053585 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Metrics介绍和Spring的集成

 
阅读更多

 

 

Metrics可以为你的代码的运行提供无与伦比的洞察力。作为一款监控指标的度量类库,它提供了很多模块可以为第三方库或者应用提供辅助统计信息, 比如Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, Jersey, 它还可以将度量数据发送给Ganglia和Graphite以提供图形化的监控。

Metrics提供了Gauge、Counter、Meter、Histogram、Timer等度量工具类以及Health Check功能。

Metrics Graphite dashboardMetrics Graphite dashboard

引用Metric库

将metrics-core加入到maven pom.xml中:

1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>com.codahale.metrics</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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class QueueManager {
private final Queue queue;
public QueueManager(MetricRegistry metrics, String name) {
this.queue = new Queue();
metrics.register(MetricRegistry.name(QueueManager.class, name, "size"),
new Gauge<Integer>() {
@Override
public Integer getValue() {
return queue.size();
}
});
}
}

registry 中每一个metric都有唯一的名字。 它可以是以.连接的字符串。 如”things.count” 和 “com.colobu.Thing.latency”。 MetricRegistry 提供了一个静态的辅助方法用来生成这个名字:

1
MetricRegistry.name(QueueManager.class, "jobs", "size")

生成的name为com.colobu.QueueManager.jobs.size

实际编程中对于队列或者类似队列的数据结构,你不会简单的度量queue.size(), 因为在java.util和java.util.concurrent包中大部分的queue的#size是O(n),这意味的调用此方法会有性能的问题, 更深一步,可能会有lock的问题。

RatioGauge可以计算两个Gauge的比值。 Meter和Timer可以参考下面的代码创建。下面的代码用来计算计算命中率 (hit/call)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
public Ratio getValue() {
return Ratio.of(hits.oneMinuteRate(),
calls.oneMinuteRate());
}
}

CachedGauge可以缓存耗时的测量。DerivativeGauge可以引用另外一个Gauage。

Counter (计数器)

Counter是一个AtomicLong实例, 可以增加或者减少值。 例如,可以用它来计数队列中加入的Job的总数。

1
2
3
4
5
6
7
8
9
10
11
private final Counter pendingJobs = metrics.counter(name(QueueManager.class, "pending-jobs"));
public void addJob(Job job) {
pendingJobs.inc();
queue.offer(job);
}
public Job takeJob() {
pendingJobs.dec();
return queue.take();
}

和上面Gauage不同,这里我们使用的是metrics.counter方法而不是metrics.register方法。 使用metrics.counter更简单。

Meter ()

Meter用来计算事件的速率。 例如 request per second。 还可以提供1分钟,5分钟,15分钟不断更新的平均速率。

1
2
3
4
5
6
private final Meter requests = metrics.meter(name(RequestHandler.class, "requests"));
public void handleRequest(Request request, Response response) {
requests.mark();
// etc
}

Histogram (直方图)

Histogram可以为数据流提供统计数据。 除了最大值,最小值,平均值外,它还可以测量 中值(median),百分比比如XX%这样的Quantile数据

1
2
3
4
5
6
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用来测量一段代码被调用的速率和用时。

1
2
3
4
5
6
7
8
9
10
11
private final Timer responses = metrics.timer(name(RequestHandler.class, "responses"));
public String handleRequest(Request request, Response response) {
final Timer.Context context = responses.time();
try {
// etc;
return "OK";
} finally {
context.stop();
}
}

这段代码用来计算中间的代码用时以及request的速率。

Health Check (健康检查)

Metric还提供了服务健康检查能力, 由metrics-healthchecks模块提供。
先创建一个HealthCheckRegistry实例。

1
final HealthCheckRegistry healthChecks = new HealthCheckRegistry();

再实现一个HealthCheck子类, 用来检查数据库的状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class DatabaseHealthCheck extends HealthCheck {
private final Database database;
public DatabaseHealthCheck(Database database) {
this.database = database;
}
@Override
public HealthCheck.Result check() throws Exception {
if (database.isConnected()) {
return HealthCheck.Result.healthy();
} else {
return HealthCheck.Result.unhealthy("Cannot connect to " + database.getUrl());
}
}
}

注册一下。

1
healthChecks.register("mysql", new DatabaseHealthCheck(database));

最后运行健康检查并查看检查结果。

1
2
3
4
5
6
7
8
9
10
11
12
final Map<String, HealthCheck.Result> results = healthChecks.runHealthChecks();
for (Entry<String, HealthCheck.Result> entry : results.entrySet()) {
if (entry.getValue().isHealthy()) {
System.out.println(entry.getKey() + " is healthy");
} else {
System.err.println(entry.getKey() + " is UNHEALTHY: " + entry.getValue().getMessage());
final Throwable e = entry.getValue().getError();
if (e != null) {
e.printStackTrace();
}
}
}

Metric内置一个ThreadDeadlockHealthCheck, 它使用java内置的线程死锁检查方法来检查程序中是否有死锁。

JMX报表

通过JMX报告Metric。

1
2
final JmxReporter reporter = JmxReporter.forRegistry(registry).build();
reporter.start();

一旦启动, 所有registry中注册的metric都可以通过JConsole或者VisualVM查看 (通过MBean插件)。
通过JMX查看通过JMX查看

HTTP报表

Metric也提供了一个servlet (AdminServlet)提供JSON风格的报表。它还提供了单一功能的servlet (MetricsServlet, HealthCheckServlet, ThreadDumpServlet, PingServlet)。
你需要在pom.xml加入metrics-servlets。

1
2
3
4
5
<dependency>
<groupId>com.codahale.metrics</groupId>
<artifactId>metrics-servlets</artifactId>
<version>${metrics.version}</version>
</dependency>

其它报表

除了JMX和HTTP, metric还提供其它报表。

  • STDOUT, using ConsoleReporter from metrics-core
1
2
3
4
5
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
1
2
3
4
5
6
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
1
2
3
4
5
6
final Slf4jReporter reporter = Slf4jReporter.forRegistry(registry)
.outputTo(LoggerFactory.getLogger("com.example.metrics"))
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.MINUTES);
  • Ganglia, using GangliaReporter from metrics-ganglia
1
2
3
4
5
6
final GMetric ganglia = new GMetric("ganglia.example.com", 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组织成一组便于重用。

1
2
3
4
5
6
7
8
final Graphite graphite = new Graphite(new InetSocketAddress("graphite.example.com", 2003));
final GraphiteReporter reporter = GraphiteReporter.forRegistry(registry)
.prefixedWith("web1.example.com")
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.filter(MetricFilter.ALL)
.build(graphite);
reporter.start(1, TimeUnit.MINUTES);

一些模块

  • metrics-json提供了json格式的序列化。
    以及为其它库提供度量的能力
  • metrics-ehcache
  • metrics-httpclient
  • metrics-jdbi
  • metrics-jersey
  • metrics-jetty
  • metrics-log4j
  • metrics-logback
  • metrics-jvm
  • metrics-servlet 注意不是metrics-servlets

第三方库

这里重点介绍一下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加入

1
2
3
4
5
<dependency>
<groupId>com.ryantenney.metrics</groupId>
<artifactId>metrics-spring</artifactId>
<version>3.0.1</version>
</dependency>

基本用法

  1. XML风格的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:metrics="http://www.ryantenney.com/schema/metrics"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.ryantenney.com/schema/metrics
http://www.ryantenney.com/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="jvm.gc" class="com.codahale.metrics.jvm.GarbageCollectorMetricSet" />
<bean metrics:name="jvm.memory" class="com.codahale.metrics.jvm.MemoryUsageGaugeSet" />
<bean metrics:name="jvm.thread-states" class="com.codahale.metrics.jvm.ThreadStatesGaugeSet" />
<bean metrics:name="jvm.fd.usage" class="com.codahale.metrics.jvm.FileDescriptorRatioGauge" />
</metrics:register>
<!-- Beans and other Spring config -->
</beans>
  1. java注解的方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.concurrent.TimeUnit;
import org.springframework.context.annotation.Configuration;
import com.codahale.metrics.ConsoleReporter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.SharedMetricRegistries;
import com.ryantenney.metrics.spring.config.annotation.EnableMetrics;
import com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerAdapter;
@Configuration
@EnableMetrics
public class SpringConfiguringClass extends MetricsConfigurerAdapter {
@Override
public void configureReporters(MetricRegistry metricRegistry) {
ConsoleReporter
.forRegistry(metricRegistry)
.build()
.start(1, TimeUnit.MINUTES);
}
}
分享到:
评论

相关推荐

    metrics-spring, 用于度量的Spring Integration.zip

    metrics-spring, 用于度量的Spring Integration spring的#Metrics ##Aboutmetrics-spring 模块集成了 Dropwizard度量库和 spring,并提供了XML和Java配置。这里模块执行以下操作:创建包含使用 @Timed 。@

    Dropwizard Metrics库与Spring集成,含XML和Java配置,功能丰富.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,...

    Metrics3.0集成SpringMVC

    集成Metrics3.0到SpringMVC项目中,首先需要在项目的pom.xml文件中引入Metrics3.0的Spring支持依赖,例如`metrics-spring`库: ```xml &lt;groupId&gt;io.dropwizard.metrics &lt;artifactId&gt;metrics-spring &lt;version&gt;3....

    piggymetrics:Spring Cloud 2020示例

    8. **监控与日志**:“piggymetrics”可能集成了Spring Boot Actuator和Spring Cloud Bus,用于监控服务的状态和性能,并通过消息总线实现配置的实时刷新。同时,日志收集和分析系统(如ELK Stack或Prometheus+...

    piggymetrics-master_DEMO_PiggyMetrics微服务_

    通过研究和实践PiggyMetrics这个项目,开发者不仅可以掌握Spring Cloud的核心组件和使用方法,还能了解到微服务架构的设计原则和最佳实践,对构建自己的微服务系统大有裨益。同时,这也是一个很好的学习平台,可以...

    spring-kafka

    - **Metrics**: 可以集成 Micrometer 或其他监控工具来收集和展示 Kafka 操作的指标。 在 "kafka-0.10-demo" 文件中,我们可以预期找到一个使用 Spring Kafka 与 Kafka 0.10 版本集成的示例项目。这个示例可能包含...

    metrics-3.1.3-release

    5. **集成**:Dropwizard Metrics可以轻松地与其他框架和库集成,如Spring、Jetty、Cassandra等。这使得在实际项目中应用Metrics变得非常简单。 6. **时态指标**:Metrics支持时态指标,可以跟踪数据随时间的变化,...

    spring-boot-metrics:一个简单的Spring Boot执行器

    Spring Boot Metrics 还支持与其他监控系统集成,例如Prometheus和Grafana,这样我们可以在这些平台上可视化和分析收集到的指标。要启用Prometheus支持,只需要在`application.properties`中添加`management.metrics...

    spring-boot-中文参考手册

    Actuator提供了丰富的端点,允许开发者监控和管理应用,如/env、/metrics、/health等,它们分别展示环境信息、应用指标和健康检查结果。 ### 八、Spring Boot与Spring Cloud集成 Spring Boot可以轻松地与Spring ...

    spring-boot-reference2018最新版

    Spring Boot对各种数据访问技术如JDBC、JPA(Hibernate)、MyBatis等提供了集成和支持,使得数据库操作更为便捷。 12. **安全** Spring Boot通过`spring-boot-starter-security`起步依赖提供了Spring Security的...

    Alibaba SpringCloud集成Nacos、openFeign实现负载均衡-源码

    服务限流降级:默认支持 WebServlet、WebFlux、OpenFeign、RestTemplate、Spring Cloud Gateway、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics ...

    Spring Boot参考指南

    以上只是《Spring Boot参考指南》中部分内容的概述,实际指南会包含更多关于如何使用Spring Boot创建、配置和管理应用的详细指导,包括Spring Boot与其他技术(如Spring Cloud、MyBatis、MongoDB等)的集成,以及...

    Spring Boot 教程、技术栈示例代码,快速简单上手教程。

    - `spring-boot-security-example`:介绍如何集成 Spring Security 进行权限控制。 - `spring-boot-mongodb-example`:使用 Spring Data MongoDB 操作 NoSQL 数据库。 - `spring-boot-email-example`:展示如何通过 ...

    JDK 8 + Spring Boot 2.7.18

    4. **健康检查和Actuator**:提供监控和管理应用的端点,如`/health`、`/metrics`等。 5. **YAML支持**:除了传统的XML配置,Spring Boot还支持使用YAML(一种更易读的配置格式)进行配置。 【ruoyi-vue-pro-master...

    Spring Boot 2.1.3 官方文档

    1. Spring Security:Spring Boot默认集成了Spring Security,提供身份验证和授权功能。 2. OAuth2支持:可以轻松地接入OAuth2认证服务,如Google、Facebook等。 六、测试 1. 测试支持:Spring Boot提供`@...

    spring kafka 整合

    - **工具使用**:可能会介绍一些辅助工具,如Kafka的命令行工具、监控工具(如Kafka Connect、Kafka Metrics)以及Spring Boot Admin等,用于管理和调试Kafka集群。 由于提供的文件名称是"spring-kafka-consumer....

    Spring Boot源码(spring-boot-2.6.2.tar.gz)

    对于测试,Spring Boot提供了`spring-boot-starter-test`模块,包含JUnit、Mockito等测试工具,使得单元测试和集成测试更加方便。源码中的测试相关组件在`org.springframework.boot.test`包下。 Spring Boot还支持...

    spring boot admin server

    8. **度量集成**:"spring-boot-metrics" 文件可能包含如何配置和使用Spring Boot的度量系统,以及如何在Admin Server中展示这些度量信息。 9. **API使用**:了解Admin Server提供的REST API,以便自动化监控和报警...

    prometheus+springboot监控集成.docx

    Prometheus是一款流行的开源监控和报警工具,它与SpringBoot的集成可以帮助开发者实时监控应用程序的性能和健康状况。本文将详细介绍如何从零开始部署Prometheus服务器,监控SpringBoot工程,并利用Grafana展示监控...

    JavaEE颠覆者spring-boot实战源码.zip

    Actuator是Spring Boot的监控和管理工具,它可以提供应用的健康检查、metrics、审计、日志等信息,帮助企业级应用更好地进行运维。 6. **Spring Boot与Spring Cloud结合**: Spring Boot可以与Spring Cloud无缝...

Global site tag (gtag.js) - Google Analytics