Quarkus 千分尺指南
一、簡介
監控和可觀察性是現代應用程式開發不可或缺的方面,尤其是在雲端原生和微服務架構中。
Quarkus 已成為建立基於 Java 的應用程式的熱門選擇,並以其輕量級和快速的特性而聞名。將 Micrometer 整合到我們的 Quarkus 應用程式中,為監控應用程式效能和行為的各個方面提供了強大的解決方案。
在本教程中,我們將探索在 Quarkus 中使用 Micrometer 的進階監控技術。
2.Maven依賴
要將 Micrometer 與 Quarkus 一起使用,我們需要包含[quarkus-micrometer-registry-prometheus](https://mvnrepository.com/artifact/io.quarkus/quarkus-micrometer-registry-prometheus)依賴項:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-micrometer-registry-prometheus</artifactId>
<version>3.11.0</version>
</dependency>
這種依賴關係提供了必要的介面和類別來檢測我們的程式碼,並包括特定的註冊表實作。具體來說, micrometer-registry-prometheus是一種流行的選擇,它實現 Prometheus REST 端點以在我們的 Quarkus 應用程式中公開指標。
這也間接地包括了核心quarkus-micrometer依賴。除了我們將用於自訂指標的指標註冊表之外,它還提供來自 JVM、線程池和 HTTP 請求的開箱即用指標。
3. 櫃檯
現在我們已經了解如何在 Quarkus 應用程式中包含 Micrometer,接下來讓我們實作自訂指標。首先,我們將考慮向應用程式添加基本計數器以追蹤各種操作的使用情況。
我們的 Quarkus 應用程式實作了一個簡單的端點來確定給定的字串是否是回文。回文是前後讀取相同的字串,例如“radar”或“level”。我們特別想在每次呼叫回文檢查時進行計數。
讓我們建立一個千分尺計數器:
@Path("/palindrome")
@Produces("text/plain")
public class PalindromeResource {
private final MeterRegistry registry;
public PalindromeResource(MeterRegistry registry) {
this.registry = registry;
}
@GET
@Path("check/{input}")
public boolean checkPalindrome(String input) {
registry.counter("palindrome.counter").increment();
boolean result = internalCheckPalindrome(input);
return result;
}
private boolean internalCheckPalindrome(String input) {
int left = 0;
int right = input.length() - 1;
while (left < right) {
if (input.charAt(left) != input.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}
}
我們可以透過對「 /palindrome/check/{input} 」發出 GET 請求來執行回文檢查,其中input是我們要檢查的單字。
為了實現我們的計數器,我們將MeterRegistry注入到PalindromeResource中。值得注意的是,我們在每次回文檢查之前increment()計數器。最後,在多次呼叫端點後,我們可以呼叫「 /q/metrics 」端點來查看計數器指標。我們將找到呼叫操作的次數作為palindrome_counter_total條目。
4. 定時器
我們還可以追蹤回文檢查的持續時間。因此,為了實現這一目標,我們將在PalindromeResource中新增一個 Micrometer Timer :
@GET
@Path("check/{input}")
public boolean checkPalindrome(String input) {
Timer.Sample sample = Timer.start(registry);
boolean result = internalCheckPalindrome(input);
sample.stop(registry.timer("palindrome.timer"));
return result;
}
首先,我們啟動計時器,這將建立一個追蹤操作持續時間的Timer.Sample 。然後,我們在啟動計時器後呼叫internalCheckPalindrome()方法。最後,我們停止計時器並記錄經過的時間。透過合併這個計時器,我們可以監控每個回文檢查的持續時間,這也使我們能夠識別效能瓶頸並優化應用程式的效率。
Micrometer 遵循 Prometheus 計時器指標約定,將測量的持續時間轉換為秒,並將該單位包含在指標名稱中。
多次呼叫端點後,我們可以在同一指標端點看到以下指標:
-
palindrome_timer_seconds_count –計數器被呼叫的次數 -
palindrome_timer_seconds_sum– 所有方法呼叫的總持續時間 -
palindrome_timer_seconds_max– 衰減間隔內觀察到的最大持續時間
最後,查看計時器產生的數據,我們可以使用總和和計數來計算確定字串是否為回文所需的時間(平均)。
5. 儀表
**量規是表示可以任意上升和下降的單一數值的量測.**儀表使我們能夠監控即時指標,提供對動態值的見解並幫助我們快速回應不斷變化的條件。它們對於追蹤頻繁波動的值(例如隊列大小和線程計數)特別有用。
假設我們想要將所有檢查過的單字保留在程式記憶體中並將它們儲存到資料庫或將它們發送到另一個服務。我們需要追蹤元素的數量來監視程式的記憶體。讓我們為此實現一個衡量標準。
注入註冊表後,我們將在建構函式中初始化一個儀表,並宣告一個空列表來儲存輸入:
private final LinkedList<String> list = new LinkedList<>();
public PalindromeResource(MeterRegistry registry) {
this.registry = registry;
registry.gaugeCollectionSize("palindrome.list.size", Tags.empty(), list);
}
現在,每當收到輸入時,我們都會將元素新增至清單中,並檢查palindrome_list_size值以查看儀表的大小:
list.add(input);
該儀表有效地為我們提供了當前程式狀態的快照。
我們還可以模擬清空清單並重置儀表:
@DELETE
@Path("empty-list")
public void emptyList() {
list.clear();
}
這表明儀表是即時測量的。清除清單後,我們的palindrome_list_size儀表將重設為零,直到我們檢查更多回文。
六,結論
在 Quarkus 中使用 Micrometer 的過程中,我們學會了使用計數器追蹤執行特定操作的頻率、使用計時器追蹤操作的持續時間,以及使用儀表監控即時指標。這些工具為我們的應用程式效能提供了寶貴的見解,使我們能夠做出明智的最佳化決策。
與往常一樣,本文的完整實作程式碼可以在 GitHub 上找到。