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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;分为内部存储器和外部存…