概念
目的
Micrometer 是一个用于基于 JVM 的应用程序的指标检测库。它为最流行的监控系统提供了一个简单的检测客户端门面,使您能够检测基于 JVM 的应用程序代码,而不会受到供应商锁定的限制。它的设计旨在为您的指标收集活动增加很少甚至没有开销,同时最大限度地提高指标工作的可移植性。
从 Micrometer 1.10 开始,Micrometer 提供了 Observation API 和一个插件机制,允许你添加功能,包括追踪特性。你可以在 Micrometer Tracing 文档 中了解更多关于追踪的内容。
为了更好地理解这些不同类型系统(指标、分布式追踪和日志)之间的差异,我们推荐 Adrian Cole 的演讲,标题为 Observability 3 Ways。要了解更多关于 Micrometer Observation API 的内容,我们推荐 Tommy Ludwig 和 Marcin Grzejszczak 的演讲,标题为 Observability of Your Application。
依赖关系
micrometer-core
模块旨在具有最少的依赖项。对于使用 Micrometer 的应用程序,它在编译时不需要任何第三方(非 Micrometer)依赖项在类路径上。
使用暂停检测功能需要在运行时 classpath 中包含 LatencyUtils 依赖项。如果你的应用程序不使用暂停检测功能,可以从运行时 classpath 中排除 LatencyUtils。
如果你使用客户端百分位数,你需要在运行时的类路径中包含 HdrHistogram。如果你不使用客户端百分位数,你可以从应用程序的运行时类路径中排除 HdrHistogram。
章节总结
📄️ 支持的监控系统
Micrometer 包含一个核心模块,其中包含一个检测 SPI,一组包含各种监控系统实现的模块(每个模块称为一个 registry),以及一个测试工具包。你需要了解监控系统的三个重要特性:
📄️ Meters
Meter 是用于收集一组关于应用程序的测量值(我们单独称之为指标)的接口。
📄️ 注册表
在 Micrometer 中,Meter 是从 MeterRegistry 创建并持有的。每个支持的监控系统都有其对应的 MeterRegistry 实现。如何创建注册表因实现而异。
📄️ 命名仪表
Micrometer 采用了一种命名约定,即使用 .(点)字符来分隔小写单词。不同的监控系统对命名约定有不同的建议,某些命名约定可能在一个系统和另一个系统之间不兼容。每个针对监控系统的 Micrometer 实现都附带了一个命名约定,该约定将小写点符号名称转换为监控系统推荐的命名约定。此外,此命名约定实现还会从指标名称和标签中移除监控系统不允许的特殊字符。你可以通过实现 NamingConvention 并在注册表上设置它来覆盖注册表的默认命名约定:
📄️ 仪表过滤器
你可以为每个注册表配置计量器过滤器,这让你能够更好地控制计量器的注册方式、注册时机以及它们发出的统计信息类型。计量器过滤器主要有三个基本功能:
📄️ 速率聚合
Micrometer 能够识别特定的监控系统是否期望在指标发布之前客户端进行速率聚合,还是作为服务器查询的一部分进行临时聚合。它会根据监控系统期望的样式来累积指标。
📄️ 计数器
计数器报告一个单一的指标:计数。Counter 接口允许你按固定数量递增,该数量必须为正数。
📄️ 仪表
仪表(gauge)是用于获取当前值的句柄。典型的仪表示例包括集合或映射的大小,或者处于运行状态的线程数量。
📄️ 计时器
计时器(Timers)旨在测量短时延和此类事件的频率。所有计时器的实现至少会报告总时间和事件计数作为独立的时间序列,但根据后端支持的情况,还可以报告其他时间序列(如最大值、百分位数、直方图等)。虽然您可以将计时器用于其他用例,但请注意不支持负值,并且记录大量较长的持续时间可能会导致总时间溢出,达到 Long.MAX\_VALUE 纳秒(即 292.3 年)。
📄️ 分布摘要
分布摘要(distribution summary)用于跟踪事件的分布情况。它在结构上与计时器(timer)类似,但记录的值并不代表时间单位。例如,您可以使用分布摘要来测量请求服务器的有效负载大小。
📄️ 长任务计时器
长任务计时器是一种特殊类型的计时器,它允许您在正在测量的事件仍在运行时测量时间。而普通的计时器仅在任务完成后记录持续时间。
📄️ 直方图和百分位数
计时器和分布摘要支持收集数据以观察其百分位数分布。查看百分位数主要有两种方法:
📄️ Meter Provider(计量器提供者)
这是一个常见的用例,即动态地将标签附加到 Meter 上。假设我们执行一个任务,并且我们希望使用一个 Timer 来监控它: