一、Spring Boot Actuator簡介
什么是Spring Boot Actuator?Spring Boot Actuator 是 Spring Boot 提供的生產級監控和管理模塊,旨在幫助開發者實時監控應用狀態、收集運行時指標,并提供一系列管理端點(Endpoints),它的關鍵特性是提供了一系列的Web接口,通過它們能夠快速診斷問題、優化性能,并確保應用健康運行。
Actuator 的核心功能
1.1 應用健康檢查
/health 端點:檢查應用關鍵組件(如數據庫、磁盤、消息隊列)是否正常。
1.2 性能指標監控
/metrics 端點:提供 JVM 內存、CPU 使用率、HTTP 請求統計等指標。
1.3 動態日志調整
/loggers 端點:運行時修改日志級別(如臨時開啟 DEBUG 日志排查問題)。
1.4 請求追蹤(HTTP Trace)
/httptrace 端點(Spring Boot 2.x):記錄最近請求的 URL、方法、響應時間等。
1.5 線程與堆棧分析
/threaddump 端點:導出當前所有線程狀態,用于診斷死鎖或性能瓶頸。
/heapdump 端點:生成 JVM 堆內存快照。
二、開啟Http接口監控
在一般的分布式架構中,我們一般有查看API接口的請求/響應的需求,而Spring Boot Actuator通過其httptrace
端點即能夠返回基本的HTTP跟蹤信息,本文介紹該功能的使用
環境:SpringBoot 2.7.6
1.為SpringBoot項目添加依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
2.添加yml配置
management:endpoint:health:show-details: alwaystrace:http:enabled: true # 啟用HTTP追蹤include:endpoints:jmx:exposure:include: '*'web:exposure:include: '*'# 暴露端點,這里開啟所有默認Web端點server:port: 8081 # 這里訪問/actuator 端點的端口
此時,我們本地訪問/actuator端點的地址為:http://127.0.0.1/actuator,返回結果如下
我們可以看到返回了很多Actuator的端點接口路徑,但并沒有發現httptrace模塊,要開啟接口監控功能我們還要注冊一個HttpTraceRepository
類型的Bean
3.聲明存儲Bean
Spring Boot Actuator 默認會把最近100次的HTTP請求記錄到內存中,對應的實現類是InMemoryHttpTraceRepository
package com.example.springhttptrace.config;import org.springframework.boot.actuate.trace.http.InMemoryHttpTraceRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class HttpActuatorConfig {@BeanInMemoryHttpTraceRepository inMemoryHttpTraceRepository() {return new InMemoryHttpTraceRepository() ;}
}
完成上面類配置,啟動項目并訪問:訪問http://localhost:8081/actuator,可以看到:
注意:Spirngboot2.x版本可以通過注入 InMemoryHttpTraceRepository來開啟httptrace,但Spirngboot3.x版本中是不能直接注入InMemoryHttpTraceRepository 開啟,需要使用httpExchanges開啟http trace,官方解釋生產環境可能存在一些性能問題,官方建議使用 zipKin或OpenTelemetry等開源框架
4.寫測試API接口
@Controller
public class BasicController {// http://127.0.0.1:8080/hello?name=lisi@RequestMapping("/hello")@ResponseBodypublic String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {return "Hello " + name;}// http://127.0.0.1:8080/user@RequestMapping("/user")@ResponseBodypublic User user() {User user = new User();user.setName("theonefx");user.setAge(666);return user;}// http://127.0.0.1:8080/save_user?name=newName&age=11@RequestMapping("/save_user")@ResponseBodypublic String saveUser(User u) {return "user will save: name=" + u.getName() + ", age=" + u.getAge();}@ModelAttributepublic void parseUser(@RequestParam(name = "name", defaultValue = "unknown user") String name, @RequestParam(name = "age", defaultValue = "12") Integer age, User user) {user.setName("zhangsan");user.setAge(18);}
}
訪問:http://127.0.0.1:8080/hello?name=lisi
返回結果后,再訪問:http://localhost:8081/actuator/httptrace,結果如下:
其中:
- timestamp,請求發生的時間戳(UTC 格式)
- principal,認證用戶信息(未認證時為 null)
- session,會話 ID(未啟用會話時為 null)
- request,請求對象信息
- response,響應對象信息
- timeTaken,請求處理耗時(毫秒),未記錄時為 null 值為 150 表示處理耗時 150ms
總結
Spring Boot Actuator的HTTP Trace功能為監控HTTP接口提供了便捷的解決方案,它開箱即用地記錄請求方法、URL、狀態碼和耗時等基礎信息,適合快速定位問題。然而,該功能默認不記錄請求體/響應體等關鍵數據,內存存儲僅保留100條記錄,且高頻請求下可能產生性能開銷,生產環境建議優先考慮更專業的APM工具。
參考:
https://docs.spring.io/spring-boot/reference/actuator/endpoints.html#page-title
https://docs.spring.io/spring-boot/docs/3.1.0/reference/html/actuator.html#actuator.http-exchanges
https://github.com/spring-projects/spring-boot/issues/17047