Spring Boot集成Micrometer
一个健壮的应用程序需要实时采集应用的性能指标,开发人员或运维人员关注这些指标可以掌握程序运行的情况,以便出现问题的时候及时报警。目前市场上出现了很多监控系统,这些监控系统由不同的语言开发,安装方式不同,使用起来也比较复杂。Micrometer 工具提供了抽象接口和脱离底层的第三方监控依赖,类似于 SLF4J 在 Java 日志中的作用。
在 Micrometer 中有两个最基本的概念:Meter 计量器和 MeterRegistry 计量器注册表。
Meter 计量器可以创建多种类型的数据指标,包括 COUNTER、GAUGE、LONG_ TASK_TIMER、TIMER 和 DISTRIBUTION_SUMMARY 等。
MeterRegistry 是计量器注册表,负责创建和维护 Meter 计量器。Micrometer 中提供了核心包 micrometer-core,对所使用的监控系统只需要添加对应的模块即可。如果使用Prometheus 监控系统,则需要添加模块 micrometer-registry-prometheus。
Micrometer 核心库中提供了两个类,其中 SimpleMeterRegistry 类是一个基于内存的计量器注册表,其不支持将数据导入监控系统中,CompositeMeterRegistry 类是一个组合计量器注册表,其可以把多个计量器注册表组合起来,并允许同时在多个监控系统中发布数据。
不同的 Meter 命名规则建议以句号分隔,创建时需要指定标签(Tag),并且标签以键值对的形式出现,后续可以通过标签对数据进行过滤或者分维度统计。除了特有标签之外,还可以统一设置通用的标签。例如:
下面主要讲解一些类型数据指标。
还可以通过配置来指定开启某个 MeterRegistry。例如下面的例子可以开启 Prometheus 并暴露 prometheus 端点,配置如下:
配置完成后,可以编写自己需要的 Meter,然后统计相关的业务指标。下面的例子是按业务状态码统计数量,代码如下:
声明:《Java系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
Micrometer 简介
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-registry-prometheus。
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 集成
Spring Boot Actuator 提供了对 Micrometer 的依赖管理和自动配置,同时支持多种类型的监控系统。 Spring Boot Actuator 会自动配置一个组合的 MeterRegistry 注册表,将所有支持的 Meter 都添加进去,这些 Meter 对象也会被自动添加到全局注册表对象中。可以通过MeterRegistryCustomizer 对象来配置 MeterRegistry。例如下面的例子中配置了通用的 Tag,代码如下:@Bean MeterRegistryCustomizer<MeterRegistry> 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
- 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(); }配置好之后,访问 http://localhost:8081/prometheus 即可看到采集数据。
声明:《Java系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。