基于SpringBoot Actuator與Prometheus自定義指標(biāo)監(jiān)控與性能優(yōu)化實戰(zhàn)指南
業(yè)務(wù)場景描述
在電商平臺的訂單服務(wù)中,隨著流量不斷攀升,系統(tǒng)性能瓶頸逐漸暴露,常見問題包括接口響應(yīng)時長波動大、服務(wù)并發(fā)壓測不達預(yù)期以及關(guān)鍵業(yè)務(wù)調(diào)用鏈路缺少可觀測性。為了精細(xì)化監(jiān)控業(yè)務(wù)指標(biāo),如訂單處理時長、并發(fā)提交量、下單失敗率等,需要在Spring Boot應(yīng)用中自定義指標(biāo),并推送到Prometheus進行存儲和告警。
技術(shù)選型過程
- Spring Boot Actuator:提供了一套可擴展的監(jiān)控指標(biāo)接口,內(nèi)置常見JVM、HTTP等指標(biāo)。
- Micrometer:Actuator底層度量庫,支持多種監(jiān)控后端。
- Prometheus:流行的時序數(shù)據(jù)庫,易于抓取指標(biāo)、支持多維度查詢和告警規(guī)則。
- Grafana:可視化展示和告警管理,支持PromQL語法。
選擇Micrometer + Spring Boot Actuator作為指標(biāo)采集層,由Prometheus周期性拉取指標(biāo)并存儲,Grafana用于展示與告警。
實現(xiàn)方案詳解
項目依賴與配置
在pom.xml中加入依賴:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
在application.yml中開啟Actuator暴露端點:
management:
endpoints:
web:
exposure:
include: prometheus,health,metrics
metrics:
export:
prometheus:
enabled: true
Prometheus抓取配置
在Prometheus的scrape_configs中添加:
scrape_configs:
- job_name: 'order-service'
metrics_path: /actuator/prometheus
static_configs:
- targets: ['order-service-host:8080']
自定義業(yè)務(wù)指標(biāo)
在代碼中通過Micrometer的MeterRegistry注冊自定義指標(biāo):
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Timer;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Component;
@Component
public class OrderMetrics {
private final Counter orderSuccessCounter;
private final Counter orderFailureCounter;
private final Timer orderProcessTimer;
public OrderMetrics(MeterRegistry registry) {
this.orderSuccessCounter = Counter.builder("order_success_total")
.description("成功下單總次數(shù)")
.register(registry);
this.orderFailureCounter = Counter.builder("order_failure_total")
.description("下單失敗總次數(shù)")
.register(registry);
this.orderProcessTimer = Timer.builder("order_process_duration")
.description("訂單處理時長")
.publishPercentileHistogram()
.register(registry);
}
public void recordSuccess() {
orderSuccessCounter.increment();
}
public void recordFailure() {
orderFailureCounter.increment();
}
public Timer.Sample startTimer() {
return Timer.start(orderProcessTimer.getId().getRegistry());
}
}
在Service層使用:
@Service
public class OrderService {
private final OrderMetrics metrics;
public OrderService(OrderMetrics metrics) {
this.metrics = metrics;
}
public void createOrder(OrderRequest req) {
Timer.Sample sample = metrics.startTimer();
try {
// 業(yè)務(wù)邏輯:保存訂單、調(diào)用支付等
// ...
metrics.recordSuccess();
} catch (Exception e) {
metrics.recordFailure();
throw e;
} finally {
sample.stop(metrics.orderProcessTimer);
}
}
}
Grafana展示與告警
在Grafana中新建數(shù)據(jù)源,類型選擇Prometheus,指向Prometheus地址。
創(chuàng)建Dashboard,使用如下PromQL:
rate(order_success_total[1m])實時下單成功速率histogram_quantile(0.95, sum(rate(order_process_duration_bucket[5m])) by (le))P95訂單處理時長
告警示例:當(dāng)P95時長超過500ms或失敗率高于1%時發(fā)送通知。
踩過的坑與解決方案
指標(biāo)沖突:自定義指標(biāo)名稱與Actuator內(nèi)置指標(biāo)重名,導(dǎo)致注冊失敗。解決:為業(yè)務(wù)指標(biāo)統(tǒng)一添加前綴,如order_。
直方圖數(shù)據(jù)量大:Histogram默認(rèn)bucket較多,Prometheus存儲壓力大。解決:合理配置bucket或使用摘要(Summary)類型。
HTTP拉取超時:Prometheus拉取時觸發(fā)高并發(fā),導(dǎo)致服務(wù)響應(yīng)變慢。解決:調(diào)整Prometheus抓取并發(fā)量,或使用中間網(wǎng)關(guān)限流。
總結(jié)與最佳實踐
- 合理設(shè)計業(yè)務(wù)指標(biāo)名稱與標(biāo)簽,避免沖突與cardinality爆炸。
- 按需開啟Percentile Histogram,僅對關(guān)鍵接口使用。
- Grafana Dashboard與告警策略結(jié)合SLO(服務(wù)等級目標(biāo))定義閾值。
- 在高并發(fā)環(huán)境中,組件拉取和注冊指標(biāo)操作需輕量,避免影響業(yè)務(wù)。
- 可擴展至Tracing與日志服務(wù),構(gòu)建完整的可觀測性平臺。
以上方案已在真實電商平臺中驗證,通過自定義監(jiān)控指標(biāo)定位性能瓶頸,P95時長從800ms降至350ms,系統(tǒng)穩(wěn)定性顯著提升。
到此這篇關(guān)于基于SpringBoot Actuator與Prometheus自定義指標(biāo)監(jiān)控與性能優(yōu)化實戰(zhàn)指南的文章就介紹到這了,更多相關(guān)SpringBoot Actuator與Prometheus監(jiān)控內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)JWT 雙簽發(fā)認(rèn)證+RBAC權(quán)限的示例代碼
本文主要介紹了Java實現(xiàn)JWT 雙簽發(fā)認(rèn)證+RBAC權(quán)限的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08
Java中PageHelper分頁后對list操作導(dǎo)致分頁無效
在項目中使用分頁插件的時候發(fā)現(xiàn)PageHelper插件失效了,本文就來介紹一下Java中PageHelper分頁后對list操作導(dǎo)致分頁無效的解決方法,感興趣的可以了解一下2021-05-05
Java使用Thumbnailator實現(xiàn)快速處理圖片
它提供了簡單易用的API,可以輕松地生成縮略圖并進行各種操作,Thumbnailator是一個Java庫,用于創(chuàng)建和操作圖像縮略圖,下面我們就來看看具體的操作吧2025-04-04
SpringBoot之HttpWebServiceMessageSenderBuilder用法詳解
這篇文章主要介紹了SpringBoot之HttpWebServiceMessageSenderBuilder用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04
Java基于Log4j2實現(xiàn)異步日志系統(tǒng)的性能優(yōu)化實踐指南
在高并發(fā)的后端應(yīng)用中,日志記錄往往成為性能瓶頸之一,本文將從原理層面解析 Log4j2 異步Appender 與 Disruptor 工作機制,并結(jié)合 Spring Boot 業(yè)務(wù)場景給出最佳實踐配置與性能調(diào)優(yōu)建議2025-07-07
spring學(xué)習(xí)JdbcTemplate數(shù)據(jù)庫事務(wù)管理
這篇文章主要為大家介紹了spring學(xué)習(xí)JdbcTemplate數(shù)據(jù)庫事務(wù)管理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05

