使用 Micrometer 和 Prometheus 在 OpenShift 中监控 Quarkus 应用
指标是应用程序任何方面的测量,例如资源使用情况或行为。我们可以使用 Micrometer 扩展通过 /q/metrics
端点从 Quarkus 应用程序公开这些指标。
会公开哪些指标?仅通过添加 Micrometer 扩展,默认就会公开大量指标,例如有关 JVM 引擎的指标,如当前活动线程数 jvm_threads_live_threads
,或有关系统本身的指标,如当前 CPU 使用率 system_cpu_usage
。此外,根据我们可能使用的其他 Quarkus 扩展,还会自动公开更多指标。例如,如果我们使用 Quarkus REST 扩展(如 Resteasy),它会自动公开有关您正在运行的服务的指标。
http_server_requests_seconds_count{method="GET",outcome="SUCCESS",status="200",uri="/hello",} 1.0
http_server_requests_seconds_sum{method="GET",outcome="SUCCESS",status="200",uri="/hello",} 0.018198043
如果我们使用 Kafka 扩展,情况也是如此。所有这些配置都在 Quarkus Micrometer 指南中有详细记录。
这些指标是如何被消耗的? 如前所述,Micrometer 在 /q/metrics
端点上公开指标,以便被 Prometheus 等第三方消耗。OpenShift 提供了一个嵌入式 Prometheus 实例供我们使用。那么,让我们看看需要做什么来集成我们的 Quarkus 应用程序指标和 OpenShift 中提供的嵌入式 Prometheus 实例。
基本上,我们需要完成以下步骤
-
为 OpenShift 中用户定义的项目启用监控
-
部署我们的 Quarkus 应用程序
-
在我们的项目中创建 Service Monitor
第一步 - 为 OpenShift 中用户定义的项目启用监控
为了启用用户定义的项目的监控,我们需要遵循 OpenShift 文档中的说明。
本质上,我们需要在 openshift-monitoring
命名空间中创建一个 ConfigMap。
cluster-monitoring-config.yaml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-monitoring-config
namespace: openshift-monitoring
data:
config.yaml: |
enableUserWorkload: true
并应用它
oc apply -f cluster-monitoring-config.yaml
对于 OpenShift 4.5 或更早版本,您需要改用 |
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-monitoring-config
namespace: openshift-monitoring
data:
config.yaml: |
techPreviewUserWorkload:
enabled: true
Openshift 将自动创建 openshift-user-workload-monitoring
命名空间,并将所需的资源部署到其中,供 Prometheus 使用。
2. 部署我们的 Quarkus 应用程序
在 OpenShift 中准备好所需的基础设施后,让我们继续进行 Quarkus 应用程序。我们将实现一个 REST API 并启用 micrometer 和 prometheus,这需要在我们的 pom.xml
文件中添加两个 Quarkus 扩展。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-micrometer-registry-prometheus</artifactId>
</dependency>
我们将添加 Greeting 资源。
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;
@Path("/hello")
public class GreetingsResource {
@Inject
MeterRegistry registry;
@GET
@Path("/{name}")
public String sayHello(@PathParam(value = "name") String name) {
registry.counter("greeting_counter", Tags.of("name", name)).increment();
return "Hello!";
}
}
正如我们所见,我们使用 micrometer 注册表外观来创建一个带有名称标签的计数器,每次调用它时都会递增。
让我们通过运行此应用程序来尝试它。
mvn compile quarkus:dev
现在,我们应该能够调用我们的服务了。
curl https://:8080/hello/quarkus
它应该返回 Hello!
。到目前为止一切顺利,我们也可以在 https://:8080/q/metrics
中看到指标,在那里您应该会看到我们的 greeting_counter
计数器。
# HELP greeting_counter_total
# TYPE greeting_counter_total counter
greeting_counter_total{name="quarkus",} 1.0
接下来,我们需要将我们的 Quarkus 应用程序部署到 OpenShift。为了简化此步骤,Quarkus 提供了一个非常有用的扩展,称为 quarkus-openshift
,让我们将其添加到我们的 pom.xml
文件中。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-openshift</artifactId>
</dependency>
所以,让我们将应用程序部署到 OpenShift 中一个新创建的项目 my-project
。
oc new-project my-project
mvn clean package -Dquarkus.kubernetes.deploy=true -Dquarkus.openshift.expose=true -Dquarkus.openshift.labels.app-with-metrics=quarkus-app
标签 app-with-metrics
将在稍后的步骤中用于选择要由 OpenShift 监控的应用程序。
3. 在我们的项目中创建 Service Monitor
在继续之前,让我们先解释一下 Prometheus 是如何工作的。Prometheus 使用拉取模型从应用程序获取指标。这意味着 Prometheus 将抓取或监视端点以从中拉取指标。
从上一步开始,我们的服务现在正在 OpenShift 中运行,但我们还没有为 Prometheus 配置任何内容来抓取我们的服务。这是通过 Service Monitor 资源完成的。
service-monitor.yaml
:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
k8s-app: prometheus-app-monitor
name: prometheus-app-monitor
namespace: my-project
spec:
endpoints:
- interval: 30s
targetPort: 8080
path: /q/metrics
scheme: http
selector:
matchLabels:
app-with-metrics: 'quarkus-app'
/q/metrics
路径是 Quarkus 中的默认指标端点。
我们可以通过以下属性将 Prometheus 期望的 /metrics
端点配置在 application.properties
中,而不是在上面的 path
属性中添加路径:quarkus.micrometer.export.prometheus.path=/metrics
。
并应用它
oc apply -f service-monitor.yaml
我们刚刚做的是创建一个名为 prometheus-app-monitor
的 Service Monitor,它将选择带有在上一步添加的 app-with-metrics: quarkus-app
标签的应用。然后,OpenShift 将每 30 秒为所有带有 app-with-metrics: quarkus-app
标签的服务调用 /q/metrics
端点。
最后,让我们开始使用它!
首先,我们需要调用我们的 greeting 服务:http://quarkus-micrometer-my-project.ocp.host/hello/quarkus
。这将增加 greeting_counter_total
计数器。但是我们可以在哪里看到指标呢?让我们浏览到 OpenShift 控制台的 Developer > Monitoring
视图,选择 Metrics
,然后选择 Custom Query
并输入 greeting_counter_total{name = "quarkus"}
,现在我们应该看到

太棒了!我们现在正在 OpenShift 中公开我们的 Quarkus 应用程序指标!