SmallRye Metrics
以下指南演示了 Quarkus 应用程序如何使用 SmallRye Metrics,这是 MicroProfile Metrics规范的实现。 SmallRye Metrics 允许应用程序收集指标和统计数据,这些数据提供了有关应用程序内部发生的事情的见解。可以远程使用 JSON 或 OpenMetrics 格式读取指标信息,供 Prometheus 等其他工具处理并存储以进行分析和可视化。 除了本指南中描述的特定于应用程序的指标外,你还可以使用各种 Quarkus 扩展公开的内置指标。这些内容在支持内置指标的每个特定扩展指南中进行了描述。
Micrometer是针对 Quarkus 指标的推荐方法。在需要保留 MicroProfile 规范兼容性时,请使用 SmallRye Metrics 扩展。 当 Quarkus 升级到 Eclipse MicroProfile 6 时,SmallRye Metrics 支持将终止。
Unresolved directive in smallrye-metrics.adoc - include::{includes}/extension-status.adoc[]
Prerequisites
Unresolved directive in smallrye-metrics.adoc - include::{includes}/prerequisites.adoc[]
Architecture
在此示例中,我们构建了一个非常简单的微服务,提供了一个 REST 端点。该端点用于确定一个数是否是素数。实现类带有一些特定的度量注解,以便在响应用户的请求时收集特定的度量信息。稍后解释每个度量指标的含义。
Solution
我们建议你按照下一节中的说明一步一步创建应用程序。但是,你可以跳到已完成的示例。
-
Clone the Git repository:[source, bash]
git clone {quickstarts-clone-url}
-
或者,下载一个 {quickstarts-archive-url}[Quickstarts 存档]。解决方案位于
microprofile-metrics-quickstart
directory,然后按照 Running and using the application部分进行操作。
Creating a Maven project
若要创建一个新项目:
Unresolved directive in smallrye-metrics.adoc - include::{includes}/devtools/create-app.adoc[]
此命令生成一个使用 `smallrye-metrics`扩展的 Quarkus 项目。
如果你已配置好 Quarkus 项目,则可以通过在项目基本目录中运行以下命令,将 `smallrye-metrics`扩展添加到项目中:
Unresolved directive in smallrye-metrics.adoc - include::{includes}/devtools/extension-add.adoc[]
这将把以下内容添加到您的构建文件中:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-metrics</artifactId>
</dependency>
implementation("io.quarkus:quarkus-smallrye-metrics")
Writing an application
以下过程创建一个 Quarkus 应用程序,该程序包含一个实现用于检查数字是否为素数的算法的类。该算法通过一个 REST 接口公开。此外,需要有特定注解来确保在一段时间内计算出所需的度量信息,并且可以导出该信息以进行手动分析或通过其他工具进行处理。
该应用程序将收集以下指标:
-
performedChecks
:一个计数器,它在用户询问一个数字时增加 1。 -
highestPrimeNumberSoFar
:一个量规,它存储用户询问的最高数字(如果确定该数字为素数)。 -
checksTimer
:一个复合指标,它对素数测试需要多长时间进行基准测试。稍后提供其他详细信息。
整个源代码如下所示:
package org.acme.microprofile.metrics;
import org.eclipse.microprofile.metrics.MetricUnits;
import org.eclipse.microprofile.metrics.annotation.Counted;
import org.eclipse.microprofile.metrics.annotation.Gauge;
import org.eclipse.microprofile.metrics.annotation.Timed;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
@Path("/")
public class PrimeNumberChecker {
private long highestPrimeNumberSoFar = 2;
@GET
@Path("/{number}")
@Produces(MediaType.TEXT_PLAIN)
@Counted(name = "performedChecks", description = "How many primality checks have been performed.")
@Timed(name = "checksTimer", description = "A measure of how long it takes to perform the primality test.", unit = MetricUnits.MILLISECONDS)
public String checkIfPrime(long number) {
if (number < 1) {
return "Only natural numbers can be prime numbers.";
}
if (number == 1) {
return "1 is not prime.";
}
if (number == 2) {
return "2 is prime.";
}
if (number % 2 == 0) {
return number + " is not prime, it is divisible by 2.";
}
for (int i = 3; i < Math.floor(Math.sqrt(number)) + 1; i = i + 2) {
if (number % i == 0) {
return number + " is not prime, is divisible by " + i + ".";
}
}
if (number > highestPrimeNumberSoFar) {
highestPrimeNumberSoFar = number;
}
return number + " is prime.";
}
@Gauge(name = "highestPrimeNumberSoFar", unit = MetricUnits.NONE, description = "Highest prime number so far.")
public Long highestPrimeNumberSoFar() {
return highestPrimeNumberSoFar;
}
}
Running and using the application
要执行在 Writing an application 中创建的应用程序,请执行以下操作:
-
在开发模式下运行微服务:include::{includes}/devtools/dev.adoc[]:!devtools-wrapped:
-
生成度量的值。[style="loweralpha"]
-
查询端点以确定某些数字是否为质数:[source, bash]
-
curl localhost:8080/350
应用程序会响应说 350 不是质数,因为它可以被 2 整除。
-
对于较大的质数,测试需要更长的时间。[source, bash]
curl localhost:8080/629521085409773
应用程序会响应说 629521085409773 是质数。
-
使用您选择的数字执行其他调用。
-
Review the generated metrics:[source, bash]
-
curl -H"Accept: application/json" localhost:8080/q/metrics/application
您会收到如下响应:
{
"org.acme.microprofile.metrics.PrimeNumberChecker.checksTimer" : { 1
"p50": 217.231273, 2
"p75": 217.231273,
"p95": 217.231273,
"p98": 217.231273,
"p99": 217.231273,
"p999": 217.231273,
"min": 0.58961, 3
"mean": 112.15909190834819, 4
"max": 217.231273, 5
"stddev": 108.2721053982776, 6
"count": 2, 7
"meanRate": 0.04943519091742238, 8
"oneMinRate": 0.2232140583080189,
"fiveMinRate": 0.3559527083952095,
"fifteenMinRate": 0.38474303050928976
},
"org.acme.microprofile.metrics.PrimeNumberChecker.performedChecks" : 2, 9
"org.acme.microprofile.metrics.PrimeNumberChecker.highestPrimeNumberSoFar" : 629521085409773 10
}
<1> `checksTimer`:基准对比质数测试需要多少时间的复合度量。所有持续时间均以毫秒为单位进行测量。它包含以下值。 <1> `p50, p75, p95, p99, p999`:持续时间的百分比。例如,`p95` 中的值表示 95% 的测量值比此持续时间快。 <1> `min`:执行质数测试所需的最短持续时间可能是针对一个小数执行的。 <1> `mean`:测量持续时间的平均值。 <1> `max`:最长的持续时间,可能是针对一个大质数。 <1> `stddev`: The standard deviation. <1> `count`:观测次数,其值与 `performedChecks` 相同。 <1> `meanRate, oneMinRate, fiveMinRate, fifteenMinRate`:平均吞吐量以及一分钟、五分钟和十五分钟的指数加权移动平均吞吐量。 <1> `performedChecks`:每次用户询问一个数字时都会增加 1 的计数器。 <1> `highestPrimeNumberSoFar`:计量器,用于存储由用户要求且确定为素数的最高数目。
如果您更喜欢 OpenMetrics 导出而不是 JSON 格式,请从命令行中删除 `-H"Accept: application/json"`参数。 |
Management interface
默认情况下,系统在主 HTTP 服务器上公开规则。您可以通过使用 `quarkus.management.enabled=true`属性启用管理界面在单独的网络接口和端口上公开这些规则。有关详细信息,请参阅 management interface reference。 |
Unresolved directive in smallrye-metrics.adoc - include::{generated-dir}/config/quarkus-smallrye-metrics.adoc[]