摘要:一个健壮的应用程序需要实时采集应用的性能指标,开发人员或运维人员关注这些指标可以掌握程序运行的情况,以便出现问题的时候及时报警。目前市场上出现了很多监控系统,这些监控系统由不同的语言开发,安装方式不同,使用起来也比较复杂。Micrometer工具提供了抽象接口
一个健壮的应用程序需要实时采集应用的性能指标,开发人员或运维人员关注这些指标可以掌握程序运行的情况,以便出现问题的时候及时报警。目前市场上出现了很多监控系统,这些监控系统由不同的语言开发,安装方式不同,使用起来也比较复杂。Micrometer工具提供了抽象接口和脱离底层的第三方监控依赖,类似于SLF4J在Java日志中的作用。
Micrometer是一个基于JVM的应用程序指标收集工具包,其为收集Java应用的性能指标提供了通用的API。Java应用只需要使用这些通用的API收集性能指标即可,Micrometer会适配各种不同的监控系统。
在Micrometer中有两个最基本的概念:Meter计量器和MeterRegistry计量器注册表。Meter计量器可以创建多种类型的数据指标,包括COUNTER、GAUGE、LONG_ TASK_TIMER、TIMER和DISTRIBUTION_SUMMARY等。MeterRegistry是计量器注册表,负责创建和维护Meter计量器。Micrometer中提供了核心包micrometer-core,对所使用的监控系统只需要添加对应的模块即可。如果使用Prometheus监控系统,则需要添加模块micrometer-registryprometheus。
Micrometer核心库中提供了两个类,其中SimpleMeterRegistry类是一个基于内存的计量器注册表,其不支持将数据导入监控系统中,CompositeMeterRegistry类是一个组合计量器注册表,其可以把多个计量器注册表组合起来,并允许同时在多个监控系统中发布数据。
不同的Meter命名规则建议以句号分隔,创建时需要指定标签(Tag),并且标签以键值对的形式出现,后续可以通过标签对数据进行过滤或者分维度统计。除了特有标签之外,还可以统一设置通用的标签。例如:
SimpleMeterRegistry registry = new SimpleMeterRegistry;
registry.config.commonTags("application", "micrometerApp");
Counter counter = registry.counter("biz.code.total", "code",
"C000");
counter.increment; //计数统计
下面主要讲解一些类型数据指标。
1. Counter
Counter(计数器)允许以固定的数值进行累加,该数值必须为正数。有两种创建方式,具体如下:
MeterRegistry registry = new SimpleMeterRegistry;
//写法一
Counter counter1 = registry.counter("counter");
counter1.increment(1.0);
//写法二
Counter counter2 = Counter
.builder("code.counter")
.description("a counter simple", "code",
"C000") //描述
.tags("code", "S000")
//状态码
.register(registry);
counter2.increment(5.0);
2. Timer
Timer(计时器)一般用来记录一段代码的执行时间,如一次请求接口的时间。Timer提供了record方法用来记录代码块的执行时间,并且还可以对执行时间进行统计分析,如最长时间、平均时间及百分比等。LongTaskTimer可以统计一个任务的执行时间。创建Timer的例子如下:
Timer timer = Timer
.builder("api.timer")
.description("a timer simple")
//描述
.tags("apiRequest", "userQuery")
//Tag定义
.register(registry);
3. Gauge
Gauge(测量器)用于测量一个指标的瞬时值,如CPU使用率和内存使用率等。示例如下:
AtomicInteger atomicInteger = new AtomicInteger(0);
Gauge passCaseGuage = Gauge
.builder("pass.guage", atomicInteger,
AtomicInteger::get)
.tag("pass", "demo")
//Tag定义
.description("a gauge simple")
//描述
.register(registry);
Spring Boot Actuator提供了对Micrometer的依赖管理和自动配置,同时支持多种类型的监控系统。Spring Boot Actuator会自动配置一个组合的MeterRegistry注册表,将所有支持的Meter都添加进去,这些Meter对象也会被自动添加到全局注册表对象中。可以通过MeterRegistryCustomizer对象来配置MeterRegistry。例如下面的例子中配置了通用的Tag,代码如下:
@Bean
MeterRegistryCustomizer METRICsCommonTags {
//通用的Tag定义
return registry ->
registry.config.commonTags("application",
"userApp");
}
还可以通过配置来指定开启某个MeterRegistry。例如下面的例子可以开启Prometheus并暴露prometheus端点,配置如下:
management:
server:
port: 8081
endpoint:
metrics:
enabled: true
prometheus:
enabled: true
endpoints:
web:
exposure:
include: metrics,Prometheus
base-path: /
metrics:
export:
prometheus:
enabled: true
Spring Boot Actuator还提供了一些核心指标,包括JVM指标信息、CPU指标信息、Tomcat指标信息和Kafka指标信息。
配置完成后,可以编写自己需要的Meter,然后统计相关的业务指标。下面的例子是按业务状态码统计数量,代码如下:
private void increment(String code, String operation) {
//定义Tag
Tags tags = Tags.of(
Tag.of("code", code),
Tag.of("handler", operation));
//定义Counter
Counter counter =
Search.in(this.meterRegistry).name(BUSINESS_
CODE_METRIC).tags(tags).counter;
if (counter == null) {
counter =
this.meterRegistry.counter(BUSINESS_CODE_METRIC,
tags);
}
//Counter计数加1
counter.increment;
}
来源:大数据架构师