夜鶯監控(Nightingale)是一個開源的雲原生監控系統,本文介紹如何使用夜鶯監控 Java 類程式。

Java 類的程式如何監控?通常有如下幾種方式:

  • Actuator
  • Micrometer
  • JMX
  • 元件自身暴露指標

Actuator

如果你是 Spring Boot 的 App,可以直接使用 Actuator 來暴露指標。可以使用如下提示詞來提問 GPT:

如何开启 actuator,暴露 Prometheus 格式的监控指标?

我把 AI 的回覆貼在這裡,大概率應該是對的,你可以嘗試,如果發現問題,歡迎提 issue 或 pr。

要在 Spring Boot 專案中開啟 Actuator 並暴露 Prometheus 監控指標,你需要完成以下幾個步驟:

1. 引入相依

在你的 pom.xml 中加入以下相依:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

如果你使用的是 Gradle:

implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'

2. 設定 application.properties 或 application.yml

確保 Actuator 的端點和 Prometheus 指標端點是暴露的。例如:

management.endpoints.web.exposure.include=*
management.endpoint.prometheus.enabled=true
management.metrics.export.prometheus.enabled=true

或者 YAML 格式:

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    prometheus:
      enabled: true
  metrics:
    export:
      prometheus:
        enabled: true

3. 啟動應用

啟動你的 Spring Boot 應用後,Actuator 的 Prometheus 端點會預設暴露在 /actuator/prometheus

4. 驗證指標端點

用瀏覽器或 curl 存取:

http://localhost:8080/actuator/prometheus

你將看到 Prometheus 格式的監控指標,使用 Prometheus 或 Categraf 來抓取即可。

注意:

  • 如果你想只暴露部分端點,比如只暴露 prometheushealth,可以調整設定 management.endpoints.web.exposure.include=prometheus,health
  • 如需更進階設定(自訂指標等),可以在程式碼中注入 MeterRegistry 並註冊自訂指標。

Micrometer

如果你不是 Spring Boot 的 App,也可以使用 Micrometer 來暴露 Prometheus 格式的監控指標。Micrometer 是一個獨立的函式庫,可以與任何 Java 應用程式整合。Actuator 實際上是基於 Micrometer 的。你可以使用如下提示詞來提問 GPT:

如果没有使用 actuator,仅仅使用了 micrometer,应该如何把指标导出到 Prometheus?

我把 AI 的回覆貼在這裡,大概率應該是對的,你可以嘗試,如果發現問題,歡迎提 issue 或 pr。

1. 加入 Micrometer 和 Prometheus 相依

以 Maven 為例:

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-core</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

2. 註冊 PrometheusMeterRegistry

在你的應用程式碼中,手動建立並註冊 PrometheusMeterRegistry,比如:

import io.micrometer.prometheus.PrometheusMeterRegistry;
import io.micrometer.prometheus.PrometheusConfig;
import io.micrometer.core.instrument.MeterRegistry;

PrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);

// 你可以通过 MeterRegistry 来注册自定义指标
// prometheusRegistry.counter("my_custom_counter").increment();

3. 暴露 Prometheus 指標 HTTP 介面

Micrometer 並不會自動暴露 HTTP 介面,你需要自己實作一個 HTTP 端點,例如用 Spring MVC 或其他 Web 框架:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PrometheusController {
    private final PrometheusMeterRegistry prometheusRegistry;

    public PrometheusController(PrometheusMeterRegistry prometheusRegistry) {
        this.prometheusRegistry = prometheusRegistry;
    }

    @GetMapping("/prometheus")
    public String scrape() {
        return prometheusRegistry.scrape();
    }
}

或者,如果不是 Spring 專案,可以用類似 Jetty、Undertow、Netty 等 WebServer 直接暴露 /prometheus 路徑,將 prometheusRegistry.scrape() 的內容作為回應。最後使用 Prometheus 或 Categraf 來抓取這個端點即可。

JMX

如果你要監控的 Java 程式不是自研的程式,而是一個開源元件,比如 Tomcat、Kafka、Zookeeper 等,通常這些元件會透過 JMX 暴露監控指標。你可以使用如下提示詞來提問 GPT:

普通的 Java 中间件,比如 Tomcat、Kafka,应该如何采集其监控指标?
  1. 推薦使用 JMX Exporter,這是一個 jar 包,以 javaagent 的方式執行。
  2. 下載 jmx_exporter 的 jar 包
  3. 找到元件的啟動命令,在啟動參數中加入 javaagent 相關的參數,比如 -javaagent:/path/to/jmx_prometheus_javaagent-<version>.jar=PORT:/path/to/config.yaml 指定 jmx_exporter 的 jar 的路徑、要暴露的指標連接埠以及設定檔的路徑。

這樣會在指定連接埠上暴露 Prometheus 指標(如 http://localhost:PORT/metrics)。然後使用 Prometheus 或 Categraf 來抓取這個端點即可。

但是注意,不同的元件需要不同的設定檔,jmx_exporter 提供了很多範例,具體位址是:https://github.com/prometheus/jmx_exporter/tree/main/examples。你可以向 AI 繼續提問:

  • config.yaml 的設定項分別代表什麼意思
  • Java MBean 是個什麼東西
  • 如何設定 JMX Exporter 採集某個特定的 MBean
  • 把 jmx_exporter 提供的範例設定扔給 AI,讓 AI 幫你分析一下這個設定的具體含義

元件自身暴露指標

有些元件自身就內建了一些方式來暴露監控指標,比如 Tomcat,在 HTTP 端點 /manager/status/all 上可以看到各類監控指標。Categraf 提供的 tomcat 採集外掛就是基於這個端點來採集監控指標的。設定方法是:

1、修改 tomcat-users.xml ,新增下面的內容,相當於是建立了一個使用者來存取 /manager/status/all 端點:

<role rolename="admin-gui" />
<user username="tomcat" password="s3cret" roles="manager-gui" />

2、註解掉檔案 webapps/manager/META-INF/context.xml 的以下內容:

  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />

3、在 Categraf 的 conf/input.tomcat/tomcat.toml 中設定 Tomcat 採集位址和認證資訊即可。

注意:JMX 方式是通用的,但是各個元件自身暴露指標的方式不盡相同,上面只是用 Tomcat 舉例,其他的元件就需要分別查閱其文件了。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云