夜鶯監控(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 來抓取即可。
注意:
- 如果你想只暴露部分端點,比如只暴露
prometheus和health,可以調整設定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,应该如何采集其监控指标?
- 推薦使用 JMX Exporter,這是一個 jar 包,以 javaagent 的方式執行。
- 下載 jmx_exporter 的 jar 包
- 找到元件的啟動命令,在啟動參數中加入 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 舉例,其他的元件就需要分別查閱其文件了。