Collect metrics using Micrometer

创建使用 Micrometer 指标库来收集运行时、扩展和应用程序指标并将其作为 Prometheus(开放指标)端点公开的应用程序。

Prerequisites

如要完成本指南,您需要:

  • Roughly 15 minutes

  • An IDE

  • 安装了 JDK 17+,已正确配置 JAVA_HOME

  • Apache Maven ${proposed-maven-version}

  • 如果你想使用 Quarkus CLI, 则可以选择使用

  • 如果你想构建一个本机可执行文件(或如果你使用本机容器构建,则使用 Docker),则可以选择安装 Mandrel 或 GraalVM 以及 configured appropriately

Solution

建议您按照说明逐步创建应用程序,但如果您愿意,可以跳到解决方案。二者之一:

  • 克隆 git 存储库:git clone $${quickstarts-base-url}.git,或

  • Download an $${quickstarts-base-url}/archive/main.zip[archive].

解决方案位于 micrometer-quickstart directory

Create the Maven project

使用以下命令创建一个新项目:

CLI
quarkus create app {create-app-group-id}:{create-app-artifact-id} \
    --no-code
cd {create-app-artifact-id}

要创建一个 Gradle 项目,添加 --gradle--gradle-kotlin-dsl 选项。 有关如何安装和使用 Quarkus CLI 的详细信息,请参见 Quarkus CLI 指南。

Maven
mvn {quarkus-platform-groupid}:quarkus-maven-plugin:{quarkus-version}:create \
    -DprojectGroupId={create-app-group-id} \
    -DprojectArtifactId={create-app-artifact-id} \
    -DnoCode
cd {create-app-artifact-id}

要创建一个 Gradle 项目,添加 -DbuildTool=gradle-DbuildTool=gradle-kotlin-dsl 选项。

适用于 Windows 用户:

  • 如果使用 cmd,(不要使用反斜杠 \ ,并将所有内容放在同一行上)

  • 如果使用 Powershell,将 -D 参数用双引号引起来,例如 "-DprojectArtifactId={create-app-artifact-id}"

此命令会生成一个 Maven 项目,它导入 `micrometer-registry-prometheus`扩展作为依赖项。此扩展将加载核心 `micrometer`扩展以及支持 Prometheus 所需的其他库依赖项。

Create a REST endpoint

我们首先添加一个计算素数的简单端点。

link:{generated-dir}/examples/telemetry-micrometer-tutorial-example-resource.java[role=include]

在 dev 模式下启动应用程序:

CLI
quarkus dev
Maven
./mvnw quarkus:dev
Gradle
./gradlew --console=plain quarkusDev

Review automatically generated metrics

Micrometer 扩展自动计算 HTTP 服务器请求时间。

我们使用 curl(或浏览器)访问我们的端点几次:

curl http://localhost:8080/example/prime/256
curl http://localhost:8080/example/prime/7919

Micrometer Prometheus MeterRegistry 扩展创建一个端点,我们可以使用它来观察收集的指标。让我们看看已经收集的指标:

curl http://localhost:8080/q/metrics

在输出中查找 http_server_requests_seconds_counthttp_server_requests_seconds_sum`和 `http_server_requests_seconds_max

添加维度标签以用于请求 URI、HTTP 方法(GET、POST 等)、状态代码(200、302、404 等)和一个更通用的结果字段。您应该找到类似这样的内容:

# HELP http_server_requests_seconds
# TYPE http_server_requests_seconds summary
http_server_requests_seconds_count{method="GET",outcome="SUCCESS",status="200",uri="/example/prime/{number}"} 2.0
http_server_requests_seconds_sum{method="GET",outcome="SUCCESS",status="200",uri="/example/prime/{number}"} 0.017385896
# HELP http_server_requests_seconds_max
# TYPE http_server_requests_seconds_max gauge
http_server_requests_seconds_max{method="GET",outcome="SUCCESS",status="200",uri="/example/prime/{number}"} 0.017385896
#

指标会延迟出现,在访问端点之前,通常看不到任何数据。

Exported metrics format

默认情况下,度量使用 Prometheus 格式 application/openmetrics-text`导出,你可以通过将 `Accept 请求头指定为 text/plain (curl -H "Accept: text/plain" localhost:8080/q/metrics/) 来恢复为以前的形式。

Inject the MeterRegistry

要注册指标,您需要一个 `MeterRegistry`的引用,该引用由 Micrometer 扩展配置并维护。

可以将 `MeterRegistry`注入到应用程序中,如下所示:

link:{generated-dir}/examples/telemetry-micrometer-tutorial-example-resource.java[role=include]

Add a Counter

计数器用于测量只会增加的值。

让我们添加一个计数器来跟踪我们测试一个数字是否为素数的频率。我们将添加一个维度标签(也称为属性或标记),它将允许我们以不同的方式聚合此计数器值。

link:{generated-dir}/examples/telemetry-micrometer-tutorial-example-resource.java[role=include]
1 找到或创建一个名为 `example.prime.number`的计数器,其中包含具有指定值的 `type`标签。
2 Increment that counter.

Review collected metrics

如果您没有在 dev 模式下运行 Quarkus,请再次启动它:

CLI
quarkus dev
Maven
./mvnw quarkus:dev
Gradle
./gradlew --console=plain quarkusDev

尝试下面的序列,并查找纯文本输出中的 example_prime_number_total

请注意,当 Micrometer 将 Prometheus 命名约定应用于 example.prime.number,即最初指定的计数器名称时,会添加 _total 后缀。

curl http://localhost:8080/example/prime/-1
curl http://localhost:8080/example/prime/0
curl http://localhost:8080/example/prime/1
curl http://localhost:8080/example/prime/2
curl http://localhost:8080/example/prime/3
curl http://localhost:8080/example/prime/15
curl http://localhost:8080/q/metrics

请注意,每个 example_prime_number_totaltype 值的唯一组合都会有一个计量值。

查看此计数器产生的维度数据,您可以计算:

  • 检查负数的次数: type="not-natural"

  • 检查数字 1 的次数: type="one"

  • 检查偶数的次数: type="even"

  • 检查质数的次数: type="prime"

  • 检查非质数的次数: type="not-prime"

您还可以通过汇总所有这些值来计算检查数字(一般)的次数。

Add a Timer

计时器是用于测量持续时间的专业抽象。我们添加一个计时器来测量确定数字是否是质数需要多长时间。

link:{generated-dir}/examples/telemetry-micrometer-tutorial-example-resource.java[role=include]
1 找到或创建一个名为 `example.prime.number`的计数器,其中包含具有指定值的 `type`标签。
2 Increment that counter.
3 调用一个包装原始 testPrimeNumber 方法的方法。
4 创建一个 Timer.Sample 来跟踪开始时间
5 调用要计时的函数,并存储布尔结果
6 使用指定 ID 和带结果值的 prime 标签找到或创建一个 Timer,并记录 Timer.Sample 捕获的持续时间。

Review collected metrics

如果您没有在 dev 模式下运行 Quarkus,请再次启动它:

CLI
quarkus dev
Maven
./mvnw quarkus:dev
Gradle
./gradlew --console=plain quarkusDev

Micrometer 会在为该计时器发出指标时应用 Prometheus 约定。具体来说,计量持续时间会被转换为秒,该单位会包含在指标名称中。

尝试以下序列,并在纯文本输出中查找以下条目:

  • example_prime_number_test_seconds_count——方法被调用的次数

  • example_prime_number_test_seconds_sum——所有方法调用的总持续时间

  • example_prime_number_test_seconds_max——衰减时间间隔内观察到的最长时间。如果不频繁地调用该方法,此值将返回为 0。

curl http://localhost:8080/example/prime/256
curl http://localhost:8080/q/metrics
curl http://localhost:8080/example/prime/7919
curl http://localhost:8080/q/metrics

通过查看此计数器产生的维度数据,可以利用总和和数量计算确定一个数字是否为质数需要多长时间(平均时间)。通过使用维度标签,你可能会看出,对于质数和非质数,它们持续时间的显著差异。

Add a Gauge

测量仪会测量可以随时间推移而增大或减小的值,比如汽车上的车速表。测量仪的值不会累积,而是在收集时进行观察。使用测量仪来观察集合的大小,或函数返回的值。

link:{generated-dir}/examples/telemetry-micrometer-tutorial-example-resource.java[role=include]
1 定义将包含任意数字的列表。
2 注册一个会追踪列表大小的测量仪。
3 创建一个 REST 端点来填充列表。偶数会被添加到列表中,奇数会从列表中移除一个元素。

Review collected metrics

如果您没有在 dev 模式下运行 Quarkus,请再次启动它:

CLI
quarkus dev
Maven
./mvnw quarkus:dev
Gradle
./gradlew --console=plain quarkusDev

然后尝试以下序列,并在纯文本输出中查找 example_list_size

curl http://localhost:8080/example/gauge/1
curl http://localhost:8080/example/gauge/2
curl http://localhost:8080/example/gauge/4
curl http://localhost:8080/q/metrics
curl http://localhost:8080/example/gauge/6
curl http://localhost:8080/example/gauge/5
curl http://localhost:8080/example/gauge/7
curl http://localhost:8080/q/metrics

Summary

恭喜你!

你已创建了一个项目,该项目利用 Micrometer 和 Prometheus Meter 注册扩展来收集指标。你已经观察了一些 Quarkus 自动捕获的指标,并且添加了一个 CounterTimer,它们对应用程序来说是唯一的。你还向指标中添加了维度标签,并且已经观察到这些标签如何影响 Prometheus 端点发出的数据。