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
使用以下命令创建一个新项目:
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 指南。
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 模式下启动应用程序:
quarkus dev
./mvnw quarkus:dev
./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_count
、http_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
#
指标会延迟出现,在访问端点之前,通常看不到任何数据。 |
默认情况下,度量使用 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,请再次启动它:
quarkus dev
./mvnw quarkus:dev
./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_total
和 type
值的唯一组合都会有一个计量值。
查看此计数器产生的维度数据,您可以计算:
-
检查负数的次数:
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,请再次启动它:
quarkus dev
./mvnw quarkus:dev
./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,请再次启动它:
quarkus dev
./mvnw quarkus:dev
./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