Java 生态监控体系实战:Prometheus+Grafana+SkyWalking 整合全指南(三) - 教程

news/2025/9/25 22:52:01/文章来源:https://www.cnblogs.com/tlnshuju/p/19112254

Java 生态监控体系实战:Prometheus+Grafana+SkyWalking 整合全指南(三) - 教程

2025-09-25 22:47  tlnshuju  阅读(0)  评论(0)    收藏  举报

五、实战第四步:问题排查案例分析

5.1 案例一:接口响应时间过长

问题现象

Grafana 监控面板显示/order/create接口 P95 响应时间超过 2 秒(阈值为 1 秒),触发告警。

排查流程
  1. 查看指标数据:在 Grafana 中查看接口响应时间曲线,确认异常开始时间(如 14:30);

  2. 定位链路瓶颈:打开 SkyWalking UI,按时间范围(14:30-14:40)和接口(/order/create)搜索链路,发现:

  1. 分析底层原因
  1. 解决方案
  1. 效果验证

5.2 案例二:服务内存泄漏导致频繁重启

问题现象

Grafana 告警显示user-service的 JVM 堆内存使用率(jvm_memory_used_bytes{area="heap"}/jvm_memory_max_bytes{area="heap"})持续超过 98%,且服务每 2 小时自动重启(由 K8s 健康检查触发)。

排查流程
  1. 确认内存增长趋势
  • 在 Grafana 中查看user-service的 JVM 堆内存使用曲线,发现内存从启动时的 400MB(堆内存总大小 2GB)持续增长,1.5 小时后达到 1.96GB,且 GC 后内存回收不足 10%(通过jvm_gc_memory_allocated_bytes_totaljvm_gc_memory_freed_bytes_total指标计算);
  1. 定位内存泄漏代码
  • 利用 SkyWalking 的 “服务实例监控” 功能,查看user-service的线程状态,发现UserExportThread(用户数据导出线程)的数量从启动时的 1 个增长至 32 个,且线程状态均为 “RUNNABLE”(正常应为 “TERMINATED”);

  • user-service的日志中搜索UserExportThread,发现每次执行用户数据导出任务(每日 9:00/11:00/15:00)后,线程未正常销毁,且持有大量UserDTO对象引用;

  • 查看UserExportService代码,发现线程创建逻辑存在问题:

// 问题代码:每次导出任务创建新线程,且未设置线程池,线程执行完后未释放资源
public void exportUserList(List\<
Long> userIds) {
new Thread(() ->
{
try {
List\<
UserDTO> userList = userMapper.selectByIds(userIds);
// 导出Excel逻辑(耗时5-10分钟)
excelExporter.export(userList, "user\_export.xlsx");
} catch (Exception e) {
log.error("用户数据导出失败", e);
}
}).start();
// 无线程池管理,线程执行完后仍占用内存
}
  1. 分析内存泄漏根源
  • 每次导出任务创建的线程未被回收,且UserDTO对象(包含用户头像等大字段)被线程引用,导致 GC 无法回收,形成内存泄漏;

  • 通过jmap -histo:live <user-service进程ID>命令(在容器内执行),确认UserDTO对象实例数超过 10 万,占用内存 1.2GB;

  1. 解决方案
  • 重构UserExportService,引入线程池管理导出任务,设置核心线程数 3,最大线程数 5,避免线程无限制创建;

  • 优化UserDTO对象,对用户头像等大字段采用 “懒加载”,导出时仅加载必要字段(如用户 ID、姓名、手机号);

  • 代码修复如下:

@Service
public class UserExportService
{
// 配置线程池,统一管理导出任务线程
@Bean
public ExecutorService exportExecutor() {
return new ThreadPoolExecutor(
3, // 核心线程数
5, // 最大线程数
60L, TimeUnit.SECONDS, // 空闲线程存活时间
new LinkedBlockingQueue<
>(10), // 任务队列
new ThreadFactoryBuilder().setNameFormat("user-export-thread-%d").build(), // 线程命名
new ThreadPoolExecutor.DiscardOldestPolicy() // 任务拒绝策略
);
}
@Resource
private ExecutorService exportExecutor;
@Resource
private UserMapper userMapper;
@Resource
private ExcelExporter excelExporter;
public void exportUserList(List\<
Long> userIds) {
// 提交任务到线程池,由线程池管理线程生命周期
exportExecutor.submit(() ->
{
try {
// 仅查询导出必要字段,减少内存占用
List\<
UserExportVO> exportList = userMapper.selectExportFieldsByIds(userIds);
excelExporter.export(exportList, "user\_export.xlsx");
} catch (Exception e) {
log.error("用户数据导出失败", e);
}
});
}
}
  1. 效果验证
  • 修复后,Grafana 面板显示user-service堆内存使用率稳定在 40%-60%,GC 后内存回收正常(回收比例超过 60%);

  • SkyWalking 中user-service的线程数稳定在 3-5 个,服务未再出现因内存泄漏导致的重启。

六、监控体系优化与扩展建议

6.1 性能优化(生产环境必看)

  1. Prometheus 性能优化
  1. SkyWalking 性能优化
  1. Java 服务监控优化

6.2 功能扩展

  1. 日志与监控联动
  • 接入 ELK(Elasticsearch+Logstash+Kibana)栈,将 Java 服务日志(通过 Logback 输出)同步至 Elasticsearch;

  • 在 SkyWalking UI 中配置 “日志关联”,通过链路 ID(traceId)直接查询对应的日志内容,实现 “链路 - 指标 - 日志” 三位一体排查;

  • 示例:在logback.xml中输出traceId

\<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">\<encoder>\<pattern>%d{yyyy-MM-dd HH:mm:ss} \[%thread] %-5level %logger{36} - traceId:\${SW\_CTX\_TRACE\_ID:-NA} - %msg%n\</pattern>\</encoder>
\</appender>
  1. 业务监控深化
  • 基于 Prometheus 的Histogram类型指标,实现业务指标的分位数统计(如订单支付成功率的 P99 分位数);

  • 示例:在OrderMetricsUtils中添加支付成功率指标:

// 初始化Histogram指标(用于分位数统计)
@PostConstruct
public void initHistograms() {
Histogram paySuccessRateHistogram = Histogram.builder(OrderMetricsEnum.ORDER\_PAY\_SUCCESS\_RATE.getMetricName())
.description(OrderMetricsEnum.ORDER\_PAY\_SUCCESS\_RATE.getDescription())
.tags(OrderMetricsEnum.ORDER\_PAY\_SUCCESS\_RATE.getTags())
.register(meterRegistry);
histogramCache.put(OrderMetricsEnum.ORDER\_PAY\_SUCCESS\_RATE.getMetricName(), paySuccessRateHistogram);
}
// 记录支付成功率(0-1之间的数值)
public void recordPaySuccessRate(OrderMetricsEnum metricsEnum, double successRate, String... tagValues) {
Histogram histogram = histogramCache.get(metricsEnum.getMetricName());
if (histogram != null) {
histogram.tag(tagValues).record(successRate);
}
}
  1. 多环境监控隔离
  • 通过 Grafana 的 “Folder” 功能,按环境(开发 / 测试 / 生产)创建独立文件夹,每个文件夹下的数据源与面板独立配置;

  • 在 Prometheus 中通过job_label区分环境,如job: "java-microservice-prod"(生产环境)、job: "java-microservice-test"(测试环境),避免指标混乱。

七、实战总结

7.1 核心收获

  1. 监控体系的 “三位一体” 价值
  1. 实战避坑指南
  1. 可复用的落地框架

7.2 未来展望

  1. 智能化监控:引入 Prometheus Alertmanager 的 “告警分组” 与 “抑制规则”,结合 AI 工具(如 Prometheus AI Alert)自动分析告警根因,减少人工介入;

  2. 全链路压测联动:将监控体系与全链路压测工具(如 JMeter+SkyWalking 压测插件)结合,在压测过程中实时监控系统瓶颈,实现 “压测 - 监控 - 调优” 闭环;

  3. 云原生适配:将监控组件迁移至 K8s 集群(通过 Helm Chart 部署),利用 K8s 的 ServiceDiscovery 自动发现服务实例,减少手动配置 Target 的工作量。

通过本次实战,不仅搭建了一套可落地的 Java 生态监控体系,更重要的是形成了 “以监控驱动系统优化” 的思维模式 —— 监控不再是 “事后救火” 的工具,而是 “事前预警、事中定位、事后优化” 的核心支撑,为微服务架构的稳定运行保驾护航。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络编程】UDP 编程实战:从套接字到聊天室多场景计划构建

【网络编程】UDP 编程实战:从套接字到聊天室多场景计划构建pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Conso…

网站重新备案需要多长时间深圳移动网站建设

当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统&#xff0c;Django内置权限系统基于model层做控制&#xff0c;新的model创建后会默认新建三个权限&#xff0c;分别为&#xff1a;add、change、delete&#xff0c;如果给…

做网站的顶部图片怎么打开文件做的网站

目录 一.平台架构与技术特点 二、DeepSeek R1模型介绍与优势 DeepSeek R1 模型简介 DeepSeek R1 模型优势 三.蓝耘智算平台使用DeepSeek教程 展望未来 耘元生代智算云是蓝耘科技推出的一款智算云平台有着以下特点&#xff1a; 一.平台架构与技术特点 基于 Kubernetes 原…

AC自动机在线版本(alert命中报警)

模板洛谷p3311 code: #include<bits/stdc++.h> using namespace std; typedef long long LL; // 常量定义:N为AC自动机状态数上限、数位DP位数上限;mod为答案取模值 const int N=2010,mod=1e9+7;// AC自动机核…

US$79 BMW FEM/BDC Key Programmer Data Desktop Test Platform for FEM/BDC Key and Program ECU Gearbox

BMW FEM/BDC Key Programmer Data Desktop Test Platform for FEM/BDC Key and Program ECU GearboxFEM BDC Module Testing Platform for BMW F20 F30 F35 X5 X6 I3With your FEM/BDC keys, FEM BDC Module Testing P…

week1 homework

C语言代码规范 参考了大公司的标准 1、程序采用缩进风格,每层缩进使用一个制表位(TAB) 2、源程序使用英文书写,尽量不含有中文。 3、左花括号要另起一行,不能跟在上一行的行末; 4、一个变量定义占一行,一个语句…

(南科大深度学习课程笔记)Lecture_2_Mathematical background(数学背景)(上) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

app那个网站开发比较好xp优化大师

Serverless 话题涉及范围极广&#xff0c;几乎包含了代码管理、测试、发布、运维和扩容等与应用生命周期关联的所有环节。在线应用如何不改代码也能迁移到 Serverless 架构&#xff1f;今天&#xff0c;我们来揭秘阿里巴巴成千上万在线应用的Serverless 演进过程。 AWS Lambda …

最牛网站建设是谁装饰公司办公室图片

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 什么是WebSocket&#xff1f; WebSocket是一种在Web应用程序中实现双向通信的协议。它允许在客户端和服务器之间建立持久…

Java EE ----- Spring MVC (上) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

秦皇岛网站排名郑州手机网站制作公司哪家好

可以删一下 按住alt按移除可以删掉 选择你要删的那些线 按住alt点移除

浦东做网站如何在社交网站做销售

一、介绍部分 (win7 下的 GUI 效果图见 本篇文章的最后部分截图2张)wxWidgets是一个开源的跨平台的C构架库(framework)&#xff0c;它可以提供GUI(图形用户界面)和其它工具。目前的2.x版本支持所有版本的Windows、带GTK或Motif的Unix和MacOS。相当于大家熟悉的 VC。二、wxWidge…

Windows 10 C盘占用释放 - tfel

C盘又要撑爆...前言 安装的Windows 10 LSTC, 系统盘留了 200G 最近发现可用只剩下50G, 甚至还在减少 排查 使用 SpaceSniffer 看下具体占用 好用,到Windows 10我也觉得它装机必备!!!占用大头 网易云音乐 缓存它默认…

CherryStudio+cpolar:让智能工作流突破组织边界 - 详解

CherryStudio+cpolar:让智能工作流突破组织边界 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

科学计算方法--矩阵分析记录

1. 前言砚上三五笔,落墨鹧鸪啼本文用于记录:科学计算方法--矩阵分析记录 最近有点忘记矩阵了(汗),这里记录一下。 如有不对,欢迎评论区指正! 2. 正文 2.1 矩阵(matrix) 矩阵理解为空间中的一种变换,作用到对…

window.addEventListener(message,()={})中的回调函数无故被一直触发的问题 - broky

遇到的问题使用第一个进入无痕模式就没有被一直触发的问题了 一、最可能的 3 个 “隐式消息发送源”(非你主动写的代码)浏览器插件 / 扩展程序发送的消息 很多浏览器插件(如广告拦截、翻译、开发者工具插件)会通过…

建设单位网站设计有了公网ip如何做网站

盒模型是界面布局需要掌握的基本功。盒模型基本概念 盒模型四要素&#xff1a;margin、border、padding、content。 盒模型分为&#xff1a;标准盒模型&#xff08;W3C盒模型&#xff09; 、 怪异盒模型&#xff08;IE盒模型&#xff09; 盒模型区别 怪异盒模型总宽度 content…

做网站包括什么网站备案的意思

list: quert.list()方法会将从数据库查找到的数据库放到一级缓存和二级缓存,但是不能从一级和二级缓存读取数据,但是可以从二级缓存的查询缓存读取数据, iterate: quert.iterate()方法总会先查找数据表的主键,然后根据每一个主键发送对应的sql语句从数据库读取数据,它可以把数据…

iis7重启 网站河南网站建设服务公司

当然&#xff0c;可以使用 Python 编写一个简单的程序来查找给定列表中的最大和最小值。以下是一个示例程序&#xff1a; def find_max_min(values):if not values: # 检查列表是否为空return None, Nonemax_value values[0]min_value values[0]for value in values:if val…