使用 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 实例。

基本上,我们需要完成以下步骤

  1. 为 OpenShift 中用户定义的项目启用监控

  2. 部署我们的 Quarkus 应用程序

  3. 在我们的项目中创建 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"},现在我们应该看到

micrometer quarkus io

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