Micrometer New Relic
New Relic 提供了一个名为 Insights 的维度监控系统产品。它包括一个完整的用户界面和一种称为 NRQL 的查询语言。New Relic Insights 采用推送模型运行。NRQL 的某些功能假设 Insights 会为每个时间点、计数等接收一个独立的事件负载。而 Micrometer 则以预设的时间间隔发送聚合数据,使你的应用程序的吞吐量能够扩展,而无需担心事件传播到 Insights 成为瓶颈。
New Relic 提供了基于维度指标的自己的 Micrometer MeterRegistry
实现。它旨在取代 Micrometer 的 NewRelicMeterRegistry
(该实现在 New Relic 中使用自定义事件),因为 New Relic 的维度指标比自定义事件更适合用于指标。你可以在 其 GitHub 仓库 中找到更多详细信息。
1. 安装 micrometer-registry-new-relic
建议使用 Micrometer(或您的框架,如果有的话)提供的 BOM,您可以在此处查看如何配置它 here。以下示例假设您正在使用 BOM。
1.1. Gradle
在 配置 完 BOM 后,添加以下依赖:
implementation 'io.micrometer:micrometer-registry-new-relic'
此依赖项的版本无需指定,因为它由 BOM 定义。
1.2. Maven
在 配置 好 BOM 之后,添加以下依赖:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-new-relic</artifactId>
</dependency>
此依赖项的版本不需要指定,因为它由 BOM 定义。
2. 配置
以下示例配置了 New Relic:
NewRelicConfig newRelicConfig = new NewRelicConfig() {
@Override
public String accountId() {
return "MYACCOUNT";
}
@Override
public String apiKey() {
return "MY_INSIGHTS_API_KEY";
}
@Override
public String get(String k) {
return null; // accept the rest of the defaults
}
};
MeterRegistry registry = new NewRelicMeterRegistry(newRelicConfig, Clock.SYSTEM);
在 New Relic 中有两种不同的 API 密钥来源。
NewRelicConfig
是一个带有一组默认方法的接口。如果在 get(String k)
的实现中,你不返回 null
,而是将其绑定到一个属性源,那么你可以覆盖默认配置。例如,Micrometer 的 Spring Boot 支持将前缀为 management.metrics.export.newrelic
的属性直接绑定到 NewRelicConfig
:
management.metrics.export.newrelic:
account-id: MYACCOUNT
api-key: MY_INSIGHTS_API_KEY
# The interval at which metrics are sent to New Relic. See Duration.parse for the expected format.
# The default is 1 minute.
step: 1m
3. 图表绘制
本节作为快速入门,介绍了如何在 New Relic 中呈现来自 Micrometer 的指标数据的有用表示。有关 New Relic 中可能实现的功能的更完整参考,请参阅 New Relic NRQL 文档。
3.1. 定时器
在每个发布间隔,New Relic 的 Timer
会生成一个事件,该事件包含计时器的名称和多个属性:
-
avg
: 发布间隔内的平均延迟。 -
count
: 发布间隔内每秒的吞吐量。 -
totalTime
: 发布间隔内每秒的总时间(与count
一起使用)以创建可聚合的平均值。
此外,如果在计时器上定义了任何百分位数或 SLO 桶,还会生成额外的事件:
-
${name}.percentiles
:Micrometer 计算的发布间隔百分位数。每个百分位数都会生成一个事件,并带有一个phi
标签,其值在 [0,1] 范围内。 -
${name}.histogram
:每个 SLO 边界都会生成一个事件,并带有一个le
标签,表示它代表了发布间隔内小于或等于 SLO 边界的事件累积计数。
要在 New Relic 中生成可聚合的延迟视图,将 totalTime
除以 count
:
SELECT sum(totalTime)/sum(count) as 'Average Latency', max(max) as 'Max' FROM timer since 30 minutes ago TIMESERIES auto
图 1. 定时器延迟。
以下示例生成了一个吞吐量图表:
SELECT average(count) as 'Average Throughput' FROM timer since 30 minutes ago TIMESERIES auto
图 2. 计时器吞吐量。
以下示例生成了客户端百分位数的图表:
SELECT latest(value) from timerPercentile FACET phi since 30 minutes ago TIMESERIES auto
图 3. 计时器百分位数。
注意这些百分位数是不可聚合的。我们选择了 latest(value)
函数来显示此图表(对百分位数值使用 average(value)
是不正确的)。你为计时器添加的维度越多,这些值的用处就越小。
最后,如果您使用 Timer
的流式构建器定义 SLO 边界,您可以查看低于某些 SLO 边界的吞吐量。在这个示例中,我们为一个模拟的 Timer
设置了 275 毫秒(黄色)、300 毫秒(红色)和 500 毫秒(蓝色)的 SLO 边界,该 Timer
记录的是围绕 250 毫秒正态分布的样本。这些计数表示每秒小于或等于每个 SLO 边界的样本速率。
SELECT sum(value) from timerHistogram FACET le since 30 minutes ago TIMESERIES auto
图 4. 计时器 SLO 边界。
在各条线交汇的多个点上,显而易见的是,没有任何样本超出了 275 毫秒的 SLO 边界。