概念
1。目的
Micrometer是基于JVM的应用程序的metrics 工具库。它为最流行的监控系统的仪器客户端提供了一个简单的外观,使您无需锁定供应商即可测试基于JVM的应用程序代码。它旨在为您的指标收集活动增加很少或没有开销,同时最大限度地提高指标工作的可移植性。
Micrometer不是分布式追踪系统或事件记录器。Adrian Cole关于Observationbility 3 Ways的演讲在突出这些不同类型系统之间的差异方面做得非常出色。
2.支持的监控系统
Micrometer包含一个带有仪器SPI的核心模块,一套包含各种监测系统(每个称为注册表)的模块和一套测试工具。监控系统有三个重要特征,重要的是要了解:
·
Dimensionality。系统是否支持使用标记键/值对丰富的metric 标准名称。如果一个系统不是三维的,它是分层的,这意味着它只支持一个统一的metric 名称。将Micrometer 标准发布到分层系统时,Micrometer会将这组标签/键值对变平并将其添加到名称中。
·
Dimensional |
Hierarchical |
Atlas, Datadog, Datadog StatsD, Influx, Prometheus, SignalFx, Telegraf StatsD, Wavefront |
Graphite, Ganglia, JMX, Etsy StatsD |
·
Rate aggregation 在这种情况下,我们是指在规定的时间间隔内聚集一组样本。一些监测系统希望某些类型的离散样本(如计数)在发布前由应用程序转换为费率。有些人希望始终发送累积值。还有一些人对此没有任何意见。
·
客户端(Client-side) |
服务器端(Server-side) |
Atlas, Datadog, Influx, Graphite, Ganglia, JMX, all StatsD flavors, SignalFx, Wavefront |
Prometheus |
·
Publishing 一些系统希望在应用程序中随时检查应用程序的指标,另一些系统则希望定期将指标推送给它们。
·
客户端推送(client pushes) |
服务器检查(Server polls) |
Atlas, Datadog, Graphite, Ganglia, Influx, JMX, all StatsD flavors, SignalFx, Wavefront |
Prometheus |
从一个监控系统到另一个监控系统的预期还有其他更小的变化,比如他们对基本计量单位(特别是时间)的概念和度量标准的规范命名惯例。Micrometer 自定义您的指标以满足这些需求,并在每个注册表的基础上。
3.注册表
一个Meter是用于收集关于您的应用程序的一组度量(我们个别称为度量(metrics))的接口。Micrometer 中的Meters 由一个创建并保存MeterRegistry。每个支持的监控系统都有一个实现MeterRegistry。注册表的创建方式因每个实现而异。
Micrometer 打包内含SimpleMeterRegistry每个meter 的最新值,不会将数据导出到任何地方。如果您还没有首选的监控系统,则可以使用简单的注册表开始玩指标:
MeterRegistry registry = new SimpleMeterRegistry();
注意 |
A SimpleMeterRegistry在基于Spring的应用程序中为你自动装配。 |
3.1。Composite 注册
Micrometer 提供了一个CompositeMeterRegistry可添加多个注册表的程序,允许您将metrics 标准同时发布到多个监视系统。
CompositeMeterRegistry composite = new CompositeMeterRegistry();
Counter compositeCounter = composite.counter("counter");
compositeCounter.increment(); (1) SimpleMeterRegistry simple = new SimpleMeterRegistry(); composite.add(simple); (2)
compositeCounter.increment(); (3)
1、直到组合中存在注册表为止,递增才是NOOPd。此时计数器的计数仍然为0。
2、名为“计数器”的计数器已注册到简单注册表。
3、简单的注册表计数器会与组合中的任何其他注册表的计数器一起递增。
3.2。全局注册表
Micrometer提供了一个静态全局注册表Metrics.globalRegistry和一组静态构建器,用于基于此注册表生成计量表。globalRegistry是一个组合注册表。
class MyComponent {
Counter featureCounter = Metrics.counter("feature", "region", "test"); (1)
void feature() {
featureCounter.increment();
}
void feature2(String type) {
Metrics.counter("feature.2", "type", type).increment(); (2)
}
}class MyApplication {
void start() {
// wire your monitoring system to global static state
Metrics.addRegistry(new SimpleMeterRegistry()); (3)
}
}
1、只要有可能(特别是仪器性能至关重要),请将Meter实例存储在字段中,以避免在每次使用时查看其名称/标签。
2、当标签需要从本地环境中确定时,您别无选择,只能在方法体内构建/查找仪表。查找代价只是单个哈希查找,所以对于大多数用途它都可以接受。
3、在米创建之后添加注册表是可以的Metrics.counter(…)。这些仪表将被添加到每个注册表中,因为它绑定到全局组合。
Meters
Micrometer 包与支持组Meter原语包括:Timer,Counter,Gauge,DistributionSummary,LongTaskTimer,FunctionCounter,FunctionTimer,和TimeGauge。不同的meter 类型会产生不同数量的时间序列metrics。例如,尽管只有一个metric 标准代表a Gauge,但a Timer度量了计时事件的计数和所有事件计时的总时间。
meter 由其名称和尺寸唯一标识。我们可以互换使用术语尺寸和标签,而Micrometer 接口Tag仅仅是因为它更短。作为一般规则,应该可以将名称用作枢轴。维度允许将特定的指定指标切片以深入挖掘并推理数据。这意味着如果只选择了名称,用户可以使用其他维度和关于所显示值的理由向下钻取。
5.命名meters
Micrometer 采用命名约定,用'.'分隔单词。(点).由于不同的监控系统对命名约定有不同的建议,某些命名约定可能实际上是针对一个系统而非另一个系统的,所以每个用于监控系统的Micrometer 实施都会包含一个命名约定,该约定将点符号名称转换为建议的命名约定。另外,这个命名约定实现清理了特定字符的名称和标签,这些特殊字符是为他们设计的监视系统所不允许的。如果您想通过NamingConvention在注册表中实现和设置注册表,您可以覆盖注册表的默认命名约定:
registry.config().namingConvention(myCustomNamingConvention);
使用命名约定后,在Micrometer 中注册的以下计时器在各种监控系统中本质上看起来不错:
registry.timer("http.server.requests");
1、Prometheus - http_server_requests_duration_seconds
2、Atlas - httpServerRequests
3、Graphite - http.server.requests
4、InfluxDB - http_server_requests
通过遵守Micrometer的点符号惯例,您可以保证监控系统中metric 标准名称的最大程度的可移植性。
5.1。标签命名
假设我们试图测量http请求的数量和数据库调用的数量。
推荐的方法
registry.counter("database.calls", "db", "users")
registry.counter("http.requests", "uri", "/api/users")
这个变体提供了足够的上下文,所以如果只选择了这个名字,这个值就可以被推理出来,并且至少具有潜在的意义。例如,如果我们选择,database.calls我们可以看到所有数据库调用的总数。然后我们可以进行分组或选择db进一步深入分析或对每个数据库调用的贡献进行比较分析。
糟糕的做法
registry.counter("calls",
"class", "database",
"db", "users");
registry.counter("calls",
"class", "http",
"uri", "/api/users");
在这种方法中,如果我们选择,calls我们将获得一个值,该值是对数据库和我们的API端点的调用次数的总和。如果没有进一步的维度挖掘,这个时间序列就没有用。
5.2。常见标签
通用标记可以在注册表级别定义,并添加到报告给监视系统的每个metric 标准中。这通常用于在主机,实例,区域,堆栈等操作环境上进行维度挖掘。
registry.config().commonTags("stack", "prod", "region", "us-east-1");
registry.config().commonTags(Arrays.asList(Tag.of("stack", "prod"), Tag.of("region", "us-east-1"))); // equivalently
调用commonTags附加其他通用标签。
重要 |