Micrometer Graphite
Graphite 是目前最流行的分层度量系统之一,它由一个固定大小的数据库支持,其设计和目的与 RRDtool 类似。它起源于 2006 年的 Orbitz,并在 2008 年开源。
1. 安装 micrometer-registry-graphite
建议使用 Micrometer(或您的框架,如果有的话)提供的 BOM,您可以在此处查看如何配置它 here。以下示例假设您正在使用 BOM。
1.1. Gradle
在 配置 完 BOM 之后,添加以下依赖:
implementation 'io.micrometer:micrometer-registry-graphite'
由于该依赖项的版本由 BOM 定义,因此不需要指定版本。
1.2. Maven
在 配置 好 BOM 之后,添加以下依赖:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-graphite</artifactId>
</dependency>
此依赖项的版本不需要指定,因为它由 BOM 定义。
2. 配置
以下示例配置了一个 Graphite 实例:
GraphiteConfig graphiteConfig = new GraphiteConfig() {
@Override
public String host() {
return "mygraphitehost";
}
@Override
public String get(String k) {
return null; // accept the rest of the defaults
}
};
MeterRegistry registry = new GraphiteMeterRegistry(graphiteConfig, Clock.SYSTEM, HierarchicalNameMapper.DEFAULT);
Micrometer 在记录发送到 Graphite 的指标时,使用 Dropwizard Metrics 作为底层检测库。GraphiteConfig
是一个带有一组默认方法的接口。如果在 get(String k)
的实现中,你将其绑定到一个属性源,而不是返回 null
,那么你可以覆盖默认配置。例如,Spring Boot 的 Micrometer 支持将其应用程序属性直接绑定到 GraphiteConfig
。有关详细信息,请参阅 Spring Boot 参考文档。
3. Graphite 标签支持
自 Micrometer 1.4.0 版本起,Micrometer 支持通过使用标签(tags)而非传统的层次结构格式来导出 Graphite 指标。默认情况下,除非配置了任何 tagsAsPrefix
值,否则指标会使用标签格式导出。标签支持 是在 Graphite 1.1.0 版本中添加的。如果您希望恢复到传统的层次结构格式,请确保将 graphiteTagsEnabled
配置值设置为 false
。以下关于层次结构名称映射和指标前缀的文档部分仅在禁用标签支持时适用。
4. 层次名称映射
Micrometer 提供了一个 HierarchicalNameMapper
接口,用于控制如何将维度化的仪表 ID 映射为扁平的层次结构名称。
默认的(HierarchicalNameMapper.DEFAULT
)会按照键的字母顺序对标签进行排序,并将标签的键/值对附加到基础仪表名称上,使用 '.' 分隔符——例如,http_server_requests.method.GET.response.200
。名称和标签键首先会应用注册表的命名约定。
如果你的命名方案中有一些特殊的规则需要遵循,你可以提供自己的 HierarchicalNameMapper
实现。最常见的自定义映射器需求是需要在每个指标名称前添加前缀(通常是类似 app.<name>.http_server_requests.method.GET.response.200
这样的格式)。
5. 为你的指标添加前缀
要为发送到 Graphite 的所有指标添加前缀,可以使用 GraphiteConfig#tagsAsPrefix
配置选项。该选项会将一组常见标签的标签值作为前缀应用。例如,如果 tagsAsPrefix
包含 application
,并且创建了一个名为 myTimer
的计量器,其标签为 application=APPNAME
,那么它在 Graphite 中显示为 APPNAME.myTimer
。
通常,当你使用 tagsAsPrefix
时,你应该将通用标签添加到注册表中,以便这些标签出现在属于该注册表的所有仪表上:
@Bean
public MeterRegistryCustomizer<MeterRegistry> commonTags() {
return r -> r.config().commonTags("application", "APPNAME");
}
我们之所以这样做,是因为通常情况下,Graphite 中的标签前缀与其他地方的通用标签相关联。前缀通常是应用程序名称或主机名之类的内容。通过将这些值应用为通用标签,您可以使您的指标更具可移植性(如果您将来切换到维度监控系统,您就已经准备好了)。
当前缀的顺序很重要时,你可以使用这个功能。Micrometer 总是会对标签进行排序,但在 tagsAsPrefix
中标签键的顺序会被保留,因此将 host
和 application
添加到 tagsAsPrefix
中会生成一个带有前缀的指标,例如 HOST.APP.myCounter
。
为了满足您特定的命名需求,您还可以在创建 GraphiteMeterRegistry
时提供一个自定义的分层名称映射器,如下所示:
GraphiteMeterRegistry r = new GraphiteMeterRegistry(
GraphiteConfig.DEFAULT,
Clock.SYSTEM,
(id, convention) -> "prefix." + HierarchicalNameMapper.DEFAULT.toHierarchicalName(id, convention));
如果你使用了自定义的 HierarchicalNameMapper
,tagsAsPrefix
将被忽略。
6. 进一步自定义 GraphiteReporter
我们为您提供了配置 GraphiteReporter
的选项,如果您需要进一步的自定义。为此,请使用此构造函数并提供您自己的 GraphiteReporter
:
GraphiteMeterRegistry(GraphiteConfig config, Clock clock, HierarchicalNameMapper nameMapper,
MetricRegistry metricRegistry, GraphiteReporter reporter)
7. 图表绘制
本节旨在快速入门,展示如何将源自 Micrometer 的指标在 Graphite 中渲染为有用的表示形式。
7.1. 计数器
Graphite 计数器用于测量平均吞吐量以及一分钟、五分钟和十五分钟的指数加权移动平均吞吐量。
图 1. 随机游走计数器的 Graphite 渲染图。