SpringBoot Actuator指標收集:Micrometer與Prometheus集成

在這里插入圖片描述

文章目錄

    • 引言
    • 一、Spring Boot Actuator基礎
    • 二、Micrometer簡介與集成
    • 三、基本指標收集與配置
    • 四、自定義業務指標實現
    • 五、與Prometheus集成
    • 六、實戰案例:API性能監控
    • 總結

引言

在現代微服務架構中,監控應用程序的健康狀況和性能指標變得至關重要。Spring Boot Actuator為監控Spring Boot應用提供了強大的支持,而Micrometer作為應用程序指標門面,提供了與多種監控系統集成的能力。本文將深入探討如何使用Spring Boot Actuator結合Micrometer與Prometheus實現高效的應用監控方案,包括配置、自定義指標以及最佳實踐。

一、Spring Boot Actuator基礎

Spring Boot Actuator是Spring Boot的一個子項目,它為應用程序提供了生產級別的監控和管理能力。Actuator暴露了一系列的HTTP端點,通過這些端點可以獲取應用程序的健康狀況、內存使用、環境變量等信息。要使用Actuator,需要在項目中添加相應的依賴。

// 在pom.xml中添加以下依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置文件中可以開啟需要的端點,如下所示:

# application.yml
management:endpoints:web:exposure:include: health,info,metrics,prometheusendpoint:health:show-details: always

這段配置開啟了health、info、metrics和prometheus端點,并設置health端點顯示詳細信息。通過這些基礎配置,可以通過訪問對應的URL獲取應用程序的基本健康信息和指標數據。

二、Micrometer簡介與集成

Micrometer是一個應用指標門面,類似于SLF4J對于日志的作用。它提供了一個通用的接口,使得應用程序可以與各種監控系統集成,如Prometheus、Graphite、JMX等。Spring Boot 2.x已經默認集成了Micrometer,所以無需額外添加Micrometer核心依賴。

要與Prometheus集成,需要添加Micrometer的Prometheus注冊表依賴:

// 在pom.xml中添加以下依賴
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

添加這個依賴后,Spring Boot會自動配置一個PrometheusMeterRegistry,并注冊到全局MeterRegistry中。這樣,應用程序收集的所有指標數據都會自動通過/actuator/prometheus端點以Prometheus格式暴露出來。

三、基本指標收集與配置

Spring Boot應用默認會收集許多基本指標,如JVM內存使用、垃圾回收、線程狀態、HTTP請求統計等。這些指標會自動通過Micrometer注冊到Prometheus中。

下面的代碼展示了如何配置和自定義這些基本指標。

import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MetricsConfig {@Beanpublic MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {// 為所有指標添加通用標簽,如應用名稱、環境等return registry -> registry.config().commonTags("application", "my-service").commonTags("environment", "production");}
}

在這個配置類中,通過MeterRegistryCustomizer為所有的指標添加了通用標簽,這對于在多服務環境中區分不同應用的指標非常有用。此外,還可以在application.yml中進一步配置指標收集:

# application.yml
management:metrics:export:prometheus:enabled: truedistribution:percentiles-histogram:http.server.requests: truesla:http.server.requests: 10ms, 100ms, 500mspercentiles:http.server.requests: 0.5, 0.75, 0.95, 0.99

這個配置啟用了Prometheus指標導出,并為HTTP請求配置了直方圖、SLA和百分位數統計,這對于監控API響應時間非常有用。

四、自定義業務指標實現

除了系統默認指標外,經常需要收集特定業務相關的指標。Micrometer提供了多種指標類型,如計數器(Counter)、儀表(Gauge)、計時器(Timer)等,下面通過代碼示例說明如何使用這些類型創建自定義指標。

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import org.springframework.stereotype.Service;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;@Service
public class OrderService {private final MeterRegistry meterRegistry;private final AtomicInteger activeOrders = new AtomicInteger(0);private final Map<String, AtomicInteger> ordersByRegion = new ConcurrentHashMap<>();private final Counter orderCounter;private final Timer orderProcessingTimer;public OrderService(MeterRegistry meterRegistry) {this.meterRegistry = meterRegistry;// 創建計數器,記錄訂單總數this.orderCounter = Counter.builder("orders.created").description("Total number of orders created").register(meterRegistry);// 創建儀表,監控活躍訂單數量Gauge.builder("orders.active", activeOrders, AtomicInteger::get).description("Number of active orders").register(meterRegistry);// 創建計時器,記錄訂單處理時間this.orderProcessingTimer = Timer.builder("orders.processing.time").description("Order processing time").register(meterRegistry);}public void createOrder(String region) {// 增加計數器orderCounter.increment();// 增加活躍訂單數activeOrders.incrementAndGet();// 按區域統計ordersByRegion.computeIfAbsent(region, r -> {AtomicInteger counter = new AtomicInteger(0);Gauge.builder("orders.by.region", counter, AtomicInteger::get).tag("region", r).description("Orders by region").register(meterRegistry);return counter;}).incrementAndGet();}public void processOrder(String orderId) {// 使用計時器記錄處理時間orderProcessingTimer.record(() -> {// 訂單處理邏輯try {Thread.sleep(100); // 模擬處理時間} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 減少活躍訂單數activeOrders.decrementAndGet();});}
}

這個示例展示了如何使用不同類型的指標監控業務數據。Counter用于計數訂單總數;Gauge用于監控活躍訂單數和各區域訂單數;Timer用于測量訂單處理時間。

五、與Prometheus集成

配置好Micrometer和Actuator后,下一步是將Spring Boot應用與Prometheus集成。需要配置Prometheus抓取Spring Boot應用暴露的指標數據。

以下是一個基本的Prometheus配置示例:

# prometheus.yml
scrape_configs:- job_name: 'spring-boot-app'metrics_path: '/actuator/prometheus'scrape_interval: 5sstatic_configs:- targets: ['localhost:8080']

這個配置指示Prometheus每5秒抓取一次Spring Boot應用的/actuator/prometheus端點。要在Docker環境中運行Prometheus,可以使用以下命令:

# 運行Prometheus容器
docker run -d --name prometheus -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

為了完善監控系統,通常還會配合Grafana使用,用于可視化Prometheus收集的指標數據。以下是啟動Grafana的Docker命令:

# 運行Grafana容器
docker run -d --name grafana -p 3000:3000 grafana/grafana

六、實戰案例:API性能監控

下面通過一個完整的實戰案例,展示如何使用Micrometer和Prometheus監控REST API的性能。將創建一個簡單的控制器,并使用自定義指標監控API調用情況。

import io.micrometer.core.annotation.Timed;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;@RestController
@RequestMapping("/api")
public class ProductController {private final MeterRegistry meterRegistry;private final Map<String, Timer> categoryTimers = new ConcurrentHashMap<>();public ProductController(MeterRegistry meterRegistry) {this.meterRegistry = meterRegistry;}@GetMapping("/products")@Timed(value = "api.products.request", description = "Time taken to return products")public Map<String, Object> getProducts() {// 模擬業務邏輯try {Thread.sleep(50);} catch (InterruptedException e) {Thread.currentThread().interrupt();}return Map.of("status", "success", "count", 100);}@GetMapping("/products/category/{category}")public Map<String, Object> getProductsByCategory(@PathVariable String category) {// 獲取或創建該分類的計時器Timer timer = categoryTimers.computeIfAbsent(category,c -> Timer.builder("api.products.category.request").tag("category", c).description("Time taken to return products by category").register(meterRegistry));// 記錄執行時間long start = System.nanoTime();try {// 模擬不同分類的處理時間不同if ("electronics".equals(category)) {Thread.sleep(100);} else if ("clothing".equals(category)) {Thread.sleep(70);} else {Thread.sleep(30);}return Map.of("status", "success", "category", category, "count", 50);} catch (InterruptedException e) {Thread.currentThread().interrupt();return Map.of("status", "error", "message", "Operation interrupted");} finally {timer.record(System.nanoTime() - start, TimeUnit.NANOSECONDS);}}
}

這個控制器展示了兩種方式來記錄API性能指標:使用@Timed注解和手動計時。第一個接口使用了@Timed注解,Spring Boot會自動創建Timer并記錄方法執行時間;第二個接口手動創建Timer并記錄執行時間,這種方式更靈活,可以添加自定義標簽,如產品分類。

總結

Spring Boot Actuator結合Micrometer和Prometheus為Java應用提供了強大而靈活的監控能力。通過本文的介紹,我們了解了如何配置Spring Boot Actuator,如何使用Micrometer創建和定制各種類型的指標,以及如何與Prometheus集成實現應用監控。在實際應用中,合理的監控指標設計對于及時發現性能瓶頸、優化系統表現、提高服務可用性具有重要意義。監控不應該是事后的補救措施,而應該是貫穿應用開發全生命周期的基礎設施。通過結合自動化告警系統,可以構建一個完整的可觀測性平臺,為微服務架構下的應用穩定運行提供有力保障。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79811.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Android面試八股文】Android應用進程的啟動流程【二】

應用進程 1.1 Android系統進程的啟動過程&#xff1a; 1、init進程fork出Zygote進程后&#xff0c;Zygote進程會創建一個服務端socket&#xff0c;等待AMS發起socket請求。 同時&#xff0c;由Zygote進程fork出的SystemServer進程會啟動各項系統服務&#xff0c;其中就包含了A…

基于Django的AI客服租車分析系統

基于Django的AI客服租車分析系統 【包含內容】 【一】項目提供完整源代碼及詳細注釋 【二】系統設計思路與實現說明 【三】AI智能客服與用戶交互指導手冊 【技術棧】 ①&#xff1a;系統環境&#xff1a;Python 3.8&#xff0c;Django 4.2框架 ②&#xff1a;開發環境&a…

全同態加密醫療數據分析集python實現

目錄 摘要一、前言二、全同態加密與醫療數據分析概述2.1 全同態加密(FHE)簡介2.2 醫療數據分析需求三、數據生成與預處理四、系統架構與流程4.1 系統架構圖五、核心數學公式六、異步任務調度與(可選)GPU 加速七、PyQt6 GUI 設計八、完整代碼實現九、自查測試與總結十、展望…

linux 搭建 dvwa 滲透測試環境

linux 安裝 dvwa 1、分為4個部分&#xff0c;搭建dvwa滲透測試環境2、安裝centos 7.63、安裝apache http server4、安裝mysql5、安裝php6、運行dvwa 1、分為4個部分&#xff0c;搭建dvwa滲透測試環境 本文基于centos 7.6 搭建 dvwa 滲透測試環境 安裝一個linux系統安裝apache…

stm32(gpio的四種輸出)

其實GPIO這個片上外設的功能&#xff1a; 用于控制IO引腳。 CPU就如同大腦&#xff0c;而這些片上外設就如同四肢一樣的關系 如圖 —————————————————————————————— OK類比了以上 其實GPIO是有 八種工作模式的 這八種工作模式 因為GPIO是面向IO…

Flask(3): 在Linux系統上部署項目

1 前言 說實話&#xff0c;我并不想接觸linux系統&#xff0c;要記住太多的命令。我更習慣windows系統&#xff0c;鼠標點點&#xff0c;只要記住少量的命令就可以了。 但是我選擇了python&#xff0c;就注定無法逃避linux系統。雖然python也能在windows上很好的運行&#xff0…

WIN10重啟開機不用登錄,直接進入桌面

我們個人機不需要登錄。 步驟1 置&#xff0c;帳戶&#xff0c;登錄選項&#xff0c;密碼。 輸入當前密碼后&#xff0c;直接下一步。 再次重啟&#xff0c;就會發現不需要密碼了。

idea中導入從GitHub上克隆下來的springboot項目解決找不到主類的問題

第一步&#xff1a;刪除目錄下的.idea和target&#xff0c;然后用idea打開 第二步&#xff1a;如果有需要&#xff0c;idea更換jdk版本 原文鏈接&#xff1a;https://blog.csdn.net/m0_74036731/article/details/146779040 解決方法&#xff08;idea中解決&#xff09;&#…

數字友好戰略視域下數字安全核心要素的理論解構與實踐路徑

本論文聚焦數字友好戰略框架下的數字安全核心要素&#xff0c;系統闡述數字安全的理論內涵、戰略價值與實踐路徑。通過多維度分析數字安全在個人、企業與國家層面的作用機制&#xff0c;結合國際法規標準與前沿技術實踐&#xff0c;揭示數字安全對構建可持續數字生態的關鍵支撐…

管理與維護samba服務器

允許 Linux、Unix 系統與 Windows 系統之間進行文件和打印機共享&#xff0c;使得不同操作系統的用戶能夠方便地訪問和共享資源&#xff0c;就像在同一局域網中的 Windows 計算機之間共享資源一樣。 server01安裝Samba服務器 [rootserver ~]# rpm -qa | grep samba [rootserver…

前端面試每日三題 - Day 8

這是我為準備前端/全棧開發工程師面試整理的第八天每日三題練習&#xff0c;涵蓋 JavaScript 閉包與執行上下文、React 性能優化與虛擬 DOM、以及高可用消息隊列架構設計。 ? 題目 1&#xff1a;深入理解 JavaScript 中的閉包與執行上下文 &#x1f4d8; 解析&#xff1a; 閉…

996引擎-拓展變量:物品變量

996引擎-拓展變量:物品變量 測試代碼參考資料對于Lua來說,只有能保存數據庫的變量才有意義。 至于臨時變量,不像TXT那么束手束腳,通常使用Lua變量就能完成。 測試代碼 -- 存:物品拓展strfunction (player)local where =

現代Web應用中的高級模糊搜索實現:多條件組合查詢與性能優化

搜索功能是現代Web應用中提升用戶體驗的核心組件。本文將深入探討如何實現一個高效、靈活的前端模糊搜索解決方案&#xff0c;支持多條件組合查詢、精確匹配、模糊匹配以及時間范圍篩選。 需求分析與設計目標 核心需求場景 多字段模糊搜索&#xff1a;支持在多個字段中同時搜…

Selenium 實現自動化分頁處理與信息提取

Selenium 實現自動化分頁處理與信息提取 在 Web 自動化測試或數據抓取場景中&#xff0c;分頁處理是一個常見的需求。通過 Selenium&#xff0c;我們可以實現對多頁面內容的自動遍歷&#xff0c;并從中提取所需的信息。本文將詳細介紹如何利用 Selenium 進行自動化分頁處理和信…

VS qt 聯合開發環境下的多國語言翻譯

添加Linguist 文件方法&#xff0c;如同添加類文件的方式&#xff0c;那樣&#xff1a; 其他跟QT的一樣的流程&#xff0c;另外在main函數里要注冊一下&#xff0c; QTextCodec::setCodecForLocale(textCodec); QTranslator translator5; QString trans5 fi…

第十七節:高頻開放題-React未來發展趨勢

服務端組件&#xff08;RSC&#xff09;普及 React Compiler對開發模式的影響 React 未來發展趨勢深度解析&#xff1a;服務端組件與編譯器的革命性變革 一、服務端組件&#xff08;RSC&#xff09;的全面普及與生態重構 1. RSC 的核心理念與技術優勢 React Server Component…

Python爬蟲實戰:獲取B站查詢數據

一、引言 1.1 研究背景 隨著互聯網的迅猛發展,視頻分享平臺積累了海量的數據資源。以 B 站為例,其豐富的視頻內容和活躍的用戶群體蘊含著巨大的價值。對 B 站搜索數據進行爬取和分析,有助于洞察用戶興趣、市場趨勢以及內容創作方向,為市場調研、用戶行為分析和內容推薦系…

【Rust 精進之路之第3篇-變量觀】`let`, `mut` 與 Shadowing:理解 Rust 的變量綁定哲學

系列&#xff1a; Rust 精進之路&#xff1a;構建可靠、高效軟件的底層邏輯 作者&#xff1a; 碼覺客 發布日期&#xff1a; 2025-04-20 引言&#xff1a;為數據命名&#xff0c;Rust 的第一道“安全閥” 在上一篇文章中&#xff0c;我們成功搭建了 Rust 開發環境&#xff0c…

stm32(IO口的最高速度)

如果我們寫入速度 快到一種程度 肯定就不能完全按理想的來了 當我們寫01快起來 中間的保持時間就會越來越少 就逐漸往下面變化 所以其實 我們如果改變上升時間 和 下降時間 還是能將最后的波形 變成為正常的波形的。 不用追求高速 &#xff0c;滿足要求下 選低速的即可。 因…

String +memset字符串類題型【C++】

tips&#xff1a; 1、尋找最大公共子串時&#xff0c;如果字符串可以旋轉但是不能反轉&#xff0c;考慮在每個字符串后重復一次自身&#xff0c;如 "abcd" 變為 "abcdabcd"&#xff0c;這樣在用dp就可以了。 如何變環拆環為鏈&#xff1a; cin>>n&…