在 Quarkus 中使用 Java Flight Recorder (JFR)
一、簡介
Java Flight Recorder (JFR) 是一個功能強大的 JVM 工具,用於擷取事件以監控、分析和排除應用程式故障。將 JFR 與 Quarkus 集成,透過添加 Quarkus 特定事件,我們可以詳細了解應用程式行為和效能。
在本文中,我們將展示如何在 Quarkus 專案中設定 JFR、產生自訂事件並分析資料以有效診斷潛在問題。
2.Maven**依賴**
要在 Quarkus 專案中啟用 Java Flight Recorder,我們需要新增[quarkus-jfr](https://mvnrepository.com/artifact/io.quarkus/quarkus-jfr)
擴充。此擴充將 JFR 與 Quarkus 集成,支援自訂 Quarkus 事件以增強監控和診斷:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jfr</artifactId>
<version>3.17.3</version>
</dependency>
3. 專案配置
3.1.建立 REST 端點
我們將從創建一個簡單的 REST 端點開始。此資源將模擬輕量級應用程式互動:
@Path("/hello")
public class JfrResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
}
3.2.開始飛行記錄
為了確保 JFR 自動開始記錄,我們需要傳遞適當的 JVM 參數。在我們的 Quarkus 應用程式中,我們可以在application.properties
檔案中執行此操作,或在啟動應用程式時作為命令列的一部分執行此操作。
為了進行開發,我們加入以下 JVM 參數:
quarkus dev -Djvm.args="-XX:StartFlightRecording=name=quarkus,dumponexit=true,filename=myrecording.jfr"
除了在應用程式運行時自動啟動 JFR 之外,在應用程式退出時將錄音轉儲到myrecording.jfr
。
4. 儲存 JFR 事件
預設情況下,當應用程式停止時,JFR 將其錄音轉儲到指定檔案 ( myrecording.jfr
)。我們可以透過在終端機中按 CTRL+C 或使用jcmd
命令來觸發此操作:
jcmd <PID> JFR.dump name=quarkus filename=myrecording.jfr
要查找應用程式的 jcmd
命令。這將列出所有正在運行的 Java 進程及其進程 ID。
5. 開啟 JFR 轉儲文件
一旦我們使用 JFR 記錄了應用程式事件,分析轉儲文件對於發現有價值的見解至關重要。我們可以使用兩個主要工具:用於快速命令列分析的JFR CLI 工具和用於詳細圖形視圖的JDK Mission Control (JMC) 。
5.1.使用 JFR CLI
JFR CLI 是一個輕量級工具,可直接從終端進行快速分析。要檢查 JFR 檔案的內容,我們將使用jfr
print 指令:
jfr print myrecording.jfr
運行命令後,輸出會列出事件、它們的時間戳記和相關詳細資訊:
Event: io.quarkus.HttpRequest
Method: GET
Path: /hello
ResponseCode: 200
Duration: 3ms
Event: jdk.GarbageCollection
StartTime: 2024-11-10T14:23:45.123Z
Duration: 5ms
Cause: System.gc()
為了關注特定的事件類別,我們可以使用 –categories 標誌:
jfr print --categories "quarkus" myrecording.jfr
此命令過濾輸出以僅顯示與 Quarkus 相關的事件,從而更輕鬆地分析相關數據。
5.2.使用 JDK 任務控制 (JMC)
JMC提供圖形介面和強大的視覺化工具進行深入分析。我們可以使用終端機或系統的 GUI 啟動 JCM 以開啟 JDK Mission Control。啟動 JMC 後,可以透過「檔案」>「開啟檔案」選單直接開啟錄製的檔案 (myrecording.jfr)。載入後,JMC 會將擷取的資料組織成直覺的視圖和類別:
JMC 中的事件瀏覽器可讓我們探索特定事件,包括 HTTP 請求、記憶體使用情況和垃圾收集。 Quarkus 特定的事件,例如io.quarkus.HttpRequest
,被分組在各自的類別下。時間軸視圖有助於將事件隨時間推移關聯起來,從而更輕鬆地識別模式和效能瓶頸。
6. 新增自訂事件
除了 Quarkus 和 JVM 提供的內建事件之外,我們還可以定義自訂事件來監視應用程式的特定部分。這在追蹤特定於領域的行為或效能指標時特別有用。
若要定義自訂事件,請擴展jdk.jfr.Event
類別並使用@Name
對其進行註解以指定其事件名稱:
@Name("com.baeldung.DatabaseQueryEvent")
public class DatabaseQueryEvent extends Event {
private final String query;
private final long executionTime;
public DatabaseQueryEvent(String query, long executionTime) {
this.query = query;
this.executionTime = executionTime;
}
public String getQuery() {
return query;
}
public long getExecutionTime() {
return executionTime;
}
}
我們可以在應用程式程式碼中實例化並提交自訂事件。例如,記錄資料庫查詢執行時間:
DatabaseQueryEvent event = new DatabaseQueryEvent("SELECT * FROM users", 15);
event.commit();
現在,在運行我們的程式後,我們可以查看自訂已建立的事件:
jfr print --events DatabaseQueryEvent myrecording.jfr
七、結論
Java Flight Recorder 與 Quarkus 結合,是一個用於監控和最佳化應用程式效能的強大工具。透過使用內建事件和自訂事件,我們可以獲得有關應用程式行為的寶貴見解、診斷問題並提高效率。
與往常一樣,程式碼片段可在 GitHub 上取得。