Spring boot應用監控集成

Spring Boot應用監控集成記錄

背景

XScholar文獻下載應用基于Spring Boot構建,需要接入Prometheus監控系統。應用已部署并運行在服務器上,需要暴露metrics端點供Prometheus采集。

初始狀態

應用信息

  • 框架: Spring Boot 2.x
  • 部署端口: 10089
  • 服務器: Linux服務器 (IPv4/IPv6雙棧網絡)
  • Prometheus: Docker容器部署

已有依賴

項目中已包含監控相關依賴:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

集成過程記錄

第一步:配置Spring Boot應用

基礎配置
# application-prod.yml
management:endpoints:web:exposure:include: "health,info,prometheus"endpoint:prometheus:enabled: truehealth:show-details: alwaysmetrics:export:prometheus:enabled: true
關鍵配置說明
  1. endpoints.web.exposure.include: 暴露prometheus端點
  2. endpoint.prometheus.enabled: 啟用Prometheus指標導出
  3. metrics.export.prometheus.enabled: 啟用Prometheus格式指標

第二步:網絡綁定配置問題

遇到的嚴重問題

應用啟動后,Prometheus無法采集到數據,targets顯示為DOWN狀態。

初始錯誤配置
# 錯誤的配置 - 只綁定localhost
server:port: 10089# 默認只綁定127.0.0.1,外部無法訪問
問題分析過程
  1. 本地測試正常:在應用服務器上curl localhost:10089/actuator/prometheus能正常返回數據
  2. 遠程訪問失敗:從Prometheus容器或其他服務器無法訪問
  3. 網絡診斷:使用netstat -tlnp | grep 10089發現應用只綁定了127.0.0.1
解決方案
# 正確的配置 - 綁定所有網絡接口
server:port: 10089address: 0.0.0.0  # 關鍵配置:綁定所有網絡接口
驗證方法
# 檢查端口綁定情況
netstat -tlnp | grep 10089
# 應該看到: 0.0.0.0:10089 而不是 127.0.0.1:10089# 測試外部訪問
curl http://SERVER_IP:10089/actuator/health
curl http://SERVER_IP:10089/actuator/prometheus

第三步:Prometheus配置中的IP地址問題

遇到的核心問題

即使應用綁定了0.0.0.0,Prometheus仍然無法采集數據。

錯誤的Prometheus配置
# prometheus.yml - 錯誤配置
scrape_configs:- job_name: 'xscholar-scheduler'static_configs:- targets: ['localhost:10089']        # 錯誤:容器內的localhost# 或- targets: ['10.10.132.55:10089']   # 錯誤:內網IP在容器中不可達
問題根因分析
  1. 容器網絡隔離: Prometheus運行在Docker容器中,有獨立的網絡命名空間
  2. localhost解析: 容器內的localhost指向容器本身,而非宿主機
  3. 內網IP限制: 容器可能無法直接訪問宿主機的內網IP
解決方案:使用公網IP
# prometheus.yml - 正確配置
scrape_configs:- job_name: 'xscholar-scheduler'static_configs:- targets: ['PUBLIC_IP:10089']  # 使用服務器的公網IPmetrics_path: '/actuator/prometheus'scrape_interval: 30sscrape_timeout: 10s
網絡架構說明
Internet↓
Public IP (服務器公網地址)↓
Server (運行Spring Boot應用)↓ Docker網絡
Docker容器 (Prometheus)

第四步:IPv4/IPv6網絡棧問題

遇到的復雜問題

配置公網IP后,仍然出現間歇性連接問題,日志顯示網絡超時。

問題現象
# Prometheus日志中的錯誤
level=warn msg="Error on ingesting samples" err="connection refused"
level=warn msg="Scrape failed" target="PUBLIC_IP:10089" err="context deadline exceeded"
根因分析

現代Linux服務器通常同時支持IPv4和IPv6,JVM默認可能優先使用IPv6,導致網絡連接問題。

JVM網絡棧配置問題
# 問題:JVM啟動參數順序和IPv6優先級
java -jar app.jar -Djava.net.preferIPv4Stack=true
解決方案
# 正確的JVM啟動參數配置
java -Djava.net.preferIPv4Stack=true \-Djava.net.preferIPv6Addresses=false \-jar xscholar-scheduler.jar
參數說明
  1. preferIPv4Stack=true: 強制JVM使用IPv4網絡棧
  2. preferIPv6Addresses=false: 禁用IPv6地址優先級
  3. 參數位置: 必須在-jar之前,否則不會生效

第五步:監控指標驗證

驗證metrics端點
# 檢查基礎指標
curl http://PUBLIC_IP:10089/actuator/prometheus | grep jvm_memory# 檢查自定義業務指標
curl http://PUBLIC_IP:10089/actuator/prometheus | grep daily_task# 檢查指標數量
curl http://PUBLIC_IP:10089/actuator/prometheus | wc -l
Prometheus驗證
# 檢查target狀態
curl http://localhost:9090/api/v1/targets | jq '.data.activeTargets[] | select(.job=="xscholar-scheduler")'# 查詢特定指標
curl 'http://localhost:9090/api/v1/query?query=up{job="xscholar-scheduler"}'

完整配置示例

Spring Boot配置

# application-prod.yml
server:port: 10089address: 0.0.0.0  # 關鍵:綁定所有網絡接口management:endpoints:web:exposure:include: "health,info,prometheus"endpoint:prometheus:enabled: truehealth:show-details: alwaysmetrics:export:prometheus:enabled: truetags:application: xscholar-schedulerenvironment: production

Prometheus配置

# prometheus.yml
scrape_configs:- job_name: 'xscholar-scheduler'static_configs:- targets: ['PUBLIC_IP:10089']  # 使用公網IPmetrics_path: '/actuator/prometheus'scrape_interval: 30sscrape_timeout: 10shonor_labels: truescheme: http

JVM啟動配置

#!/bin/bash
# start-app.sh
java -Djava.net.preferIPv4Stack=true \-Djava.net.preferIPv6Addresses=false \-Duser.timezone=Asia/Shanghai \-Xms1g -Xmx2g \-jar xscholar-scheduler.jar \--spring.profiles.active=prod

網絡問題排查流程

第一層:應用層檢查

# 1. 檢查應用端口綁定
netstat -tlnp | grep 10089# 2. 本地訪問測試
curl http://localhost:10089/actuator/health# 3. 內網訪問測試
curl http://INTERNAL_IP:10089/actuator/health# 4. 公網訪問測試
curl http://PUBLIC_IP:10089/actuator/health

第二層:網絡連通性檢查

# 1. 防火墻檢查
sudo ufw status
sudo iptables -L | grep 10089# 2. 端口可達性測試
telnet PUBLIC_IP 10089# 3. 從Prometheus容器測試
docker exec prometheus wget -O- http://PUBLIC_IP:10089/actuator/prometheus

第三層:容器網絡檢查

# 1. 檢查容器網絡配置
docker network ls
docker network inspect prometheus_monitoring# 2. 容器間通信測試
docker exec prometheus ping PUBLIC_IP# 3. DNS解析測試
docker exec prometheus nslookup PUBLIC_IP

踩坑總結

主要難點

  1. 網絡綁定理解不足: localhost vs 0.0.0.0的區別
  2. 容器網絡隔離: Docker容器網絡與宿主機網絡的關系
  3. IP地址選擇: 內網IP vs 公網IP的可達性問題
  4. IPv4/IPv6棧: JVM網絡棧優先級問題

關鍵經驗教訓

  1. 逐層排查: 從應用→網絡→容器,分層次排查問題
  2. 網絡理解: 深入理解容器網絡和宿主機網絡的關系
  3. 參數順序: JVM參數位置影響是否生效
  4. 配置驗證: 每層配置都要獨立驗證

最佳實踐

網絡配置規范
  1. 應用綁定: 生產環境統一使用0.0.0.0綁定
  2. IP地址選擇: 優先使用公網IP,確保各組件可達
  3. IPv4優先: 生產環境強制使用IPv4避免兼容性問題
排查工具集合
# 網絡診斷工具包
netstat -tlnp | grep PORT        # 檢查端口綁定
ss -tlnp | grep PORT            # 現代版netstat
curl -I http://IP:PORT          # HTTP連通性測試
telnet IP PORT                  # TCP連通性測試
nmap -p PORT IP                 # 端口掃描
監控驗證清單
  • 應用端口正確綁定到0.0.0.0
  • 防火墻規則允許對應端口
  • metrics端點返回有效數據
  • Prometheus能成功scrape目標
  • target狀態顯示為UP
  • 指標數據在Prometheus中可查詢

常見錯誤案例

錯誤1:只綁定localhost

# 錯誤配置
server:port: 10089# 缺少address配置,默認只綁定127.0.0.1

現象: 本地curl正常,遠程訪問失敗
解決: 添加address: 0.0.0.0

錯誤2:使用容器內localhost

# 錯誤配置
- targets: ['localhost:10089']

現象: Prometheus無法連接目標
解決: 使用宿主機的公網IP

錯誤3:JVM參數位置錯誤

# 錯誤啟動方式
java -jar app.jar -Djava.net.preferIPv4Stack=true

現象: IPv6優先導致連接問題
解決: 參數必須在-jar之前

性能考慮

指標收集頻率

# 根據業務需求調整采集頻率
scrape_configs:- job_name: 'xscholar-scheduler'scrape_interval: 30s    # 業務應用30秒采集一次scrape_timeout: 10s     # 10秒超時

指標過濾優化

# 只采集需要的指標,減少存儲壓力
metric_relabel_configs:- source_labels: [__name__]regex: '(daily_task_.*|token_.*|last_task_.*|jvm_memory_.*)'action: keep

下一步

Spring Boot應用成功接入Prometheus后,下一階段將重點關注:

  1. 自定義業務指標的設計和實現
  2. 指標數據的分析和告警規則優化
  3. 性能監控和問題定位實踐

這個階段的重點是解決網絡連通性問題,確保監控數據能穩定采集,為后續的業務監控和告警奠定基礎。

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

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

相關文章

安寶特案例丨又一落地,Vuzix AR眼鏡助力亞馬遜英國倉庫智能化升級!

Vuzix M400智能眼鏡近日落地亞馬遜&#xff08;英國&#xff09;倉庫&#xff0c;通過解放雙手、免提操作優化物流效率。 安寶特&VuzixAR智能眼鏡解決方案為亞馬遜倉庫提供實時決策支持、無縫對接員工-主管-企業管理系統&#xff0c;并加速了新員工培訓流程&#xff0c;優…

ui框架-文件列表展示

ui框架-文件列表展示 介紹 UI框架的文件列表展示組件&#xff0c;可以展示文件夾&#xff0c;支持列表展示和圖標展示模式。組件提供了豐富的功能和可配置選項&#xff0c;適用于文件管理、文件上傳等場景。 功能特性 支持列表模式和網格模式的切換展示支持文件和文件夾的層…

使用QMediaPlayer開發音樂播放器

編譯完成的程序下載:【免費】使用QMediaPlayer開發音樂播放器資源-CSDN文庫 完整源碼:使用QMediaPlayer開發音樂播放器源碼資源-CSDN文庫 需求分析: 1.本地音樂播放器 核心播放功能 支持常見音頻格式本地播放MP3、WAV、FLAC 等 2.播放控制:播放 / 暫停 / 停止 / 上一曲…

Linux-07 ubuntu 的 chrome 啟動不了

文章目錄 問題原因解決步驟一、卸載舊版chrome二、重新安裝chorme三、啟動不了&#xff0c;報錯如下四、啟動不了&#xff0c;解決如下 總結 問題原因 在應用中可以看到chrome&#xff0c;但是打不開(說明&#xff1a;原來的ubuntu系統出問題了&#xff0c;這個是備用的硬盤&a…

【Redis】緩存雪崩、緩存擊穿、緩存穿透

目錄 1、緩存雪崩【1】定義【2】原因【3】解決方案[1]差異化過期時間[2]多級緩存[3]熔斷降級[4]緩存永不過期異步更新 2、緩存擊穿【1】定義【2】原因【3】解決方案[1]互斥鎖[2]邏輯過期[3]熱點數據加載 3、緩存穿透【1】定義【2】原因【3】解決方案[1]緩存空對象[2]布隆過濾器…

【論文閱讀筆記】萬花筒:用于異構多智能體強化學習的可學習掩碼

摘要 在多智能體強化學習&#xff08;MARL&#xff09;中&#xff0c;通常采用參數共享來提高樣本效率。然而&#xff0c;全參數共享的流行方法通常會導致智能體之間的策略同質&#xff0c;這可能會限制從策略多樣性中獲得的性能優勢。為了解決這一關鍵限制&#xff0c;我們提出…

vue2 , el-select 多選樹結構,可重名

人家antd都支持&#xff0c;elementplus 也支持&#xff0c;vue2的沒有&#xff0c;很煩。 網上其實可以搜到各種的&#xff0c;不過大部分不支持重名&#xff0c;在刪除的時候可能會刪錯&#xff0c;比如樹結構1F的1樓啊&#xff0c;2F的1樓啊這種同時勾選的情況。。 可以全…

golang循環變量捕獲問題??

在 Go 語言中&#xff0c;當在循環中啟動協程&#xff08;goroutine&#xff09;時&#xff0c;如果在協程閉包中直接引用循環變量&#xff0c;可能會遇到一個常見的陷阱 - ??循環變量捕獲問題??。讓我詳細解釋一下&#xff1a; 問題背景 看這個代碼片段&#xff1a; fo…

【一文看懂Spring循環依賴】Spring循環依賴:從陷阱破局到架構涅槃

&#x1f32a;? Spring Boot循環依賴&#xff1a;從陷阱破局到架構涅槃 循環依賴如同莫比烏斯環上的螞蟻&#xff0c;看似前進卻永遠困在閉環中。本文將帶你拆解Spring中這一經典難題&#xff0c;從臨時救火到根治重構&#xff0c;構建無懈可擊的依賴體系。 &#x1f525; 一、…

el-table封裝自動滾動表格(適用大屏)

表格功能&#xff1a;自動滾動&#xff0c;鼠標移入停止滾動&#xff0c;移出繼續滾動。如果想加觸底加載新數據可以判斷 scrollWrap.scrollTop和maxScrollTop大小來加載數據&#xff0c;另寫邏輯。 <template><el-table ref"eltable" :data"tableDa…

Eureka REST 相關接口

可供非 Java 應用程序使用的 Eureka REST 操作。 appID 是應用程序的名稱&#xff0c;instanceID 是與實例關聯的唯一標識符。在 AWS 云中&#xff0c;instanceID 是實例的實例 ID&#xff1b;在其他數據中心&#xff0c;它是實例的主機名。 對于 XML/JSON&#xff0c;HTTP 的…

DSP——時鐘樹講解

配置任何外設的第一步都要看一下時鐘樹,下圖是DSP28377的時鐘樹: 由圖所示DSP28377由4個時鐘源,分別是INTOSC1、INTOSC2、XTAL、AUXCL INTOSC1:0M內部系統時鐘,備用時鐘,檢測到系統時鐘缺失自動連接到備用時鐘,也作為看門狗時鐘使用; INTOSC2:10M內部系統時鐘,復位…

少量數據達到更好效果

九坤團隊新作&#xff01;一條數據訓練AI超越上萬條數據 一 僅需一條無標簽數據和10步優化 九坤團隊訓練了13,440個大模型&#xff0c;發現熵最小化 (EM) 僅需一條無標簽數據和10步優化&#xff0c;就能實現與強化學習中使用成千上萬條數據和精心設計的獎勵機制所取得的性能提…

html - <mark>標簽

<mark> 標簽在HTML中用于高亮顯示文本&#xff0c;通常用于突出顯示某些重要的部分。它的默認樣式通常是背景色為黃色&#xff0c;但你可以通過CSS自定義其外觀。 1. 基本用法 <mark> 標簽用于標記文本的高亮顯示。它常用于搜索結果中&#xff0c;突出顯示匹配的…

YOLOv8+ByteTrack:高精度人車過線統計系統搭建指南

文章目錄 1. 引言2. YOLOv8簡介3. 過線統計原理4. 代碼實現4.1 環境準備4.2 基礎檢測代碼4.3 過線統計實現4.4 完整代碼示例5. 性能優化與改進5.1 多線程處理5.2 區域檢測優化5.3 使用ByteTrack改進跟蹤6. 實際應用中的挑戰與解決方案7. 總結與展望1. 引言 目標檢測是計算機視…

20、React常用API和Hook索引

這一小節中只給出一些API和Hook的索引&#xff0c;需要用到的時候可以去官網查詢&#xff0c;如無必要此處不列出詳細用法。React v1.19.1。 對Components的支持 以下是開發時通用的一些功能組件 APIdescription<Fragment>通常使用 <>…</> 代替&#xff0…

Python爬蟲實戰:研究feedparser庫相關技術

1. 引言 1.1 研究背景與意義 在當今信息爆炸的時代,互聯網上存在著海量的信息資源。RSS(Really Simple Syndication)作為一種標準化的信息聚合技術,被廣泛用于網站內容的發布和訂閱。通過 RSS,用戶可以方便地獲取網站更新的內容,而無需頻繁訪問各個網站。 然而,互聯網…

HTML實現的2048游戲

以下是一個純HTML實現的2048游戲代碼&#xff0c;包含CSS和JavaScript&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>2048 Game</title><style>body {font-family: Arial, sans-serif;text-a…

使用Python 構建支持主流大模型與 Ollama 的統一接口平臺

?? 背景概述 近年來,隨著大語言模型(LLM)的蓬勃發展,OpenAI 的 GPT 系列、Google 的 Gemini、Anthropic 的 Claude、以及開源的 Ollama 本地模型等,逐漸成為自然語言處理、智能問答、AI 助手等應用的基礎組件。 開發者在使用這些模型時常面臨如下問題: 各模型接口不統…

計算機系統概述(4)

計算機系統層次結構&#xff1a;硬件層、系統層、應用層。 計算機的基本硬件系統由運算器、控制器、存儲器、輸入設備和輸出設備5大部件組成。 運算器、控制器等部件被集成在一起統稱為中央處理單元CPU。 存儲器是計算機系統中的記憶設備&#xff0c;分為內部存儲器和外部存…