java技术指标_使用Micrometer记录Java应用性能指标

更新时间:2023-05-31 11:53:27 阅读: 评论:0

java技术指标_使⽤Micrometer记录Java应⽤性能指标
使⽤ Micrometer 记录 Java 应⽤性能指标
成 富
后退英文2019 年 2 ⽉ 13 ⽇发布
运⾏良好的应⽤离不开对性能指标的收集。这些性能指标可以有效地对⽣产系统的各⽅⾯⾏为进⾏监控,帮助运维⼈员掌握系统运⾏状态和查找问题原因。性能指标监控通常由两个部分组成:第⼀个部分是性能指标数据的收集,需要在应⽤程序代码中添加相应的代码来完成;另⼀个部分是后台监控系统,负责对数据进⾏聚合计算和提供
API 接⼝。在应⽤中使⽤计数器、计量仪和计时器来记录关键的性能指标。在专⽤的监控系统中对性能指标进⾏汇总,并⽣成相应的图表来进⾏可视化分析。
⽬前已经有⾮常多的监控系统,常⽤的如 Prometheus、New Relic、Influx、Graphite 和
Datadog,每个系统都有⾃⼰独特的数据收集⽅式。这些监控系统有的是需要⾃主安装的软件,有的则是云服务。它们的后台实现千差万别,数据接⼝也是各有不同。在指标数据收集⽅⾯,⼤多数时候都是使⽤与后台监控系统对应的客户端程序。此外,这些监控系统⼀般都会提供不同语⾔和平台使⽤的第三⽅库,这不可避免的会带来供应商锁定的问题。⼀旦针对某监控系统的数据收集代码添加到应⽤程序中,当需要切换监控系统时,也要对应⽤程序进⾏⼤量的修改。Micrometer
的出现恰好解决了这个问题,其作⽤可以类⽐于 SLF4J 在 Java ⽇志记录中的作⽤。
Micrometer 简介
Micrometer 为 Java 平台上的性能数据收集提供了⼀个通⽤的 API,应⽤程序只需要使⽤ Micrometer 的通⽤ API 来收集性能指标即可。Micrometer
会负责完成与不同监控系统的适配⼯作。这就使得切换监控系统变得很容易。Micrometer 还⽀持推送数据到多个不同的监控系统。
在 Java 应⽤中使⽤ Micrometer ⾮常的简单。只需要在 Maven 或 Gradle 项⽬中添加相应的依赖即可。Micrometer 包含如下三种模块,分组名称都是
io.micrometer:包含数据收集 SPI 和基于内存的实现的核⼼模块 micrometer-core。
针对不同监控系统的实现模块,如针对 Prometheus 的 micrometer-registry-prometheus。
与测试相关的模块 micrometer-test。
在 Java 应⽤中,只需要根据所使⽤的监控系统,添加所对应的模块即可。⽐如,使⽤ Prometheus 的应⽤只需要添加
micrometer-registry-prometheus 模块即可。模块 micrometer-core 会作为传递依赖⾃动添加。本⽂使⽤的 Micrometer 版本是
1.1.1。清单 1 给出了使⽤ Micrometer 的 Maven 项⽬的⽰例:
清单 1. 使⽤ Micrometer 的 Maven
项⽬
io.micrometer
micrometer-registry-prometheus
1.1.1
计量器注册表
Micrometer
中有两个最核⼼的概念,分别是计量器(Meter)和计量器注册表(MeterRegistry)。计量器表⽰的是需要收集的性能指标数据,⽽计量器注册表负责创建和维护计量器。每个监控系统有⾃⼰独有的计量器注册表实现。模块
micrometer-core 中提供的类 SimpleMeterRegistry 是⼀个基于内存的计量器注册表实现。SimpleMeterRegistry
不⽀持导出数据到监控系统,主要⽤来进⾏本地开发和测试。
Micrometer ⽀持多个不同的监控系统。通过计量器注册表实现类 CompositeMeterRegistry
可以把多个计量器注册表组合起来,从⽽允许同时发布数据到多个监控系统。对于由这个类创建的计量器,它们所产⽣的数据会对CompositeMeterRegistry
中包含的所有计量器注册表都产⽣影响。在清单 2 中,我创建了⼀个 CompositeMeterRegistry 对象,并在其中添加了两个SimpleMeterRegistry
对象。⼀个 SimpleMeterRegistry 对象在创建时通过实现 SimpleConfig 接⼝提供了不同的名称前缀。
清单 2. CompositeMeterRegistry
使⽤⽰例public class CompositeMeterRegistryExample {
public static void main(String[] args) {
CompositeMeterRegistry registry = new CompositeMeterRegistry();
registry.add(new SimpleMeterRegistry());
registry.add(new SimpleMeterRegistry(new MyConfig(), Clock.SYSTEM));
Counter counter = unter("simple");
counter.increment();
}
private static class MyConfig implements SimpleConfig {
public String get(final String key) {
return null;
}
public String prefix() {
return "my";
}
}
}
Micrometer 本⾝提供了⼀个静态的全局计量器注册表对象 Metrics.globalRegistry。该注册表是⼀个组合注册表。使⽤ Metrics
类中的静态⽅法创建的计量器,都会被添加到该全局注册表中。对于⼤多数应⽤来说,这个全局注册表对象就可以满⾜需求,不需要额外创建新的注册表对象。不过由于该对象是静态的,在某些场合,
尤其是进⾏单元测试时,会产⽣⼀些问题。在
清单 3 中,Metrics.addRegistry() ⽅法直接在全局注册表对象中添加新的注册表对象,⽽ unter()
⽅法创建的计数器⾃动添加到全局注册表中。
清单 3.
使⽤全局计量器注册表对象public class GlobalRegistryExample {
public static void main(String[] args) {
Metrics.addRegistry(new SimpleMeterRegistry());轻灵
Counter counter = unter("simple");
counter.increment();
}
}
使⽤计量器
计量器⽤来收集不同类型的性能指标信息。Micrometer 提供了不同类型的计量器实现。计量器对象由计量器注册表创建并管理。
计量器名称和标签
每个计量器都有⾃⼰的名称。由于不同的监控系统有⾃⼰独有的推荐命名规则,Micrometer 使⽤句点 . 分隔计量器名称中的不同部分,如a.b.c。Micrometer
会负责完成所需的转换,以满⾜不同监控系统的需求。
每个计量器在创建时都可以指定⼀系列标签。标签以名值对的形式出现。监控系统使⽤标签对数据进⾏过滤。除了每个计量器独有的标签之外,每个计量器注册表还可以添加通⽤标签。所有该注册表导出的数据都会带上这些通⽤标签。
在清单 4 中,使⽤ MeterRegistry 的 config() ⽅法可以得到该注册表对象的 MeterRegistry.Config 对象,再使⽤ commonTags()
⽅法来设置通⽤标签。多个标签按照名称和值依次排列的⽅式来指定。在创建计量器时,在提供了名称之后,以同样的⽅式指定该计量器的标签。
清单 4.
计量器注册表的通⽤标签SimpleMeterRegistry registry = new SimpleMeterRegistry();
lunar eclipCounter counter = unter("simple", "tag3", "c");
counter.increment();
计数器
计数器(Counter)表⽰的是单个的只允许增加的值。通过 MeterRegistry 的 counter() ⽅法来创建表⽰计数器的 Counter 对象。还可以使⽤
Counter.builder() ⽅法来创建 Counter 对象的构建器。Counter 所表⽰的计数值是 double 类型,其 increment()
⽅法可以指定增加的值。默认情况下增加的值是 1.0。
如果已经有⼀个⽅法返回计数值,可以直接从该⽅法中创建类型为 FunctionCounter 的计数器。在清
单 5 中,⽅法 counter() 使⽤了两种不同的⽅法来创建
Counter 对象。⽅法 functionCounter() 同样使⽤了两种不同的⽅法来创建 FunctionCounter 对象。
风中奇缘片尾曲清单 5.
计数器使⽤⽰例public class Counters {
private SimpleMeterRegistry registry = new SimpleMeterRegistry();
private double value = 0.0;
public void counter() {
Counter counter1 = unter("simple1");
counter1.increment(2.0);
Counter counter2 = Counter.builder("simple2")
四级计算器
.description("A simple counter")
.
tag("tag1", "a")
.register(registry);
counter2.increment();
}
public void functionCounter() {
List tags = new ArrayList<>();
<().counter("function1", tags, this, Counters::getValue);宝宝玩英语
FunctionCounter functionCounter = FunctionCounter.builder("function2", this, Counters::getValue)
.description("A function counter")
.tags(tags)
.register(registry);
一建准考证打印
}
private double getValue() {
return value++;
}
}
计量仪
计量仪(Gauge)表⽰的是单个的变化的值。与计数器的不同之处在于,计量仪的值并不总是增加的。与创建 Counter 对象类似,Gauge 对象可以从计量器注册表中创建,也可以使⽤
Gauge.builder() ⽅法返回的构造器来创建。清单 6 中给出了计量仪的使⽤⽰例,其中 gauge() ⽅法创建的是记录任意 Number
mage
对象的值,gaugeCollectionSize() ⽅法记录集合的⼤⼩,gaugeMapSize() ⽅法记录 Map 的⼤⼩。需
要注意的是,这 3 个⽅法返回的并不是 Gauge
对象,⽽是被记录的对象。这是由于 Gauge 对象⼀旦被创建,就不能⼿动对其中的值进⾏修改。在每次取样时,Gauge 会返回当前值。正因为如此,得到⼀个 Gauge
对象,除了进⾏测试之外,没有其他的意义。
rome清单 6.
计量仪使⽤⽰例public class Gauges {
private SimpleMeterRegistry registry = new SimpleMeterRegistry();
public void gauge() {
AtomicInteger value = registry.gauge("gauge1", new AtomicInteger(0));
value.t(1);
List list = registry.gaugeCollectionSize("list.size", ptyList(), new ArrayList<>());
list.add("a");
Map map = registry.gaugeMapSize("map.size", ptyList(), new HashMap<>());
map.put("a", "b");
Gauge.builder("value", this, Gauges::getValue)
.description("a simple gauge")
.tag("tag1", "a")
.register(registry);
}
private double getValue() {
return ThreadLocalRandom.current().nextDouble();
}
}
计时器
计时器(Timer)通常⽤来记录事件的持续时间。计时器会记录两类数据:事件的数量和总的持续时间。在使⽤计时器之后,就不再需要单独创建⼀个计数器。计时器可以从注册表中创建,或者使⽤
Timer.builder() ⽅法返回的构建器来创建。Timer 提供了不同的⽅式来记录持续时间。第⼀种⽅式是使⽤ record() ⽅法来记录 Runnable 和
Callable 对象的运⾏时间;第⼆种⽅式是使⽤ Timer.Sample 来保存计时状态。
在清单 7 中,⽅法 record() 使⽤ Timer 对象的 record() ⽅法来记录⼀个 Runnable 对象的运⾏时间。⽅法 sample() 中⾸先使⽤
Timer.start() 来创建⼀个新的 Timer.Sample 对象并启动计时。调⽤ Timer.Sample 的 stop() ⽅法把记录的时间保存到 Timer
对象中。
清单 7.
计时器使⽤⽰例public class Timers {
private SimpleMeterRegistry registry = new SimpleMeterRegistry();
public void record() {教师节祝福诗歌
Timer timer = registry.timer("simple");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}

本文发布于:2023-05-31 11:53:27,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/78/820051.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:计量器   注册表   监控   系统   数据   创建
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图