当前位置: 首页 > news >正文

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

在 Java 微服务架构落地过程中,“监控” 始终是贯穿全生命周期的核心痛点。当业务规模从单体应用拆分到分布式服务后,传统的日志打印 + 服务器监控模式,早已无法应对链路追踪断层性能瓶颈定位难系统告警不及时等问题。本文基于生产环境实战经验,以 “解决微服务全链路可观测性” 为核心目标,从零搭建一套覆盖 “指标监控(Metrics)+ 链路追踪(Tracing)+ 可视化分析(Visualization)” 的完整监控体系,全程聚焦落地细节,附带可直接复用的配置代码与避坑指南。

一、实战背景:微服务监控的核心痛点与解决方案

1.1 业务场景与监控需求

本次实战基于一个典型的 Java 微服务架构,包含 5 个核心服务:

  • 用户服务(user-service):负责用户注册、登录、信息管理(Spring Boot 2.7.x)

  • 订单服务(order-service):处理订单创建、支付状态同步(Spring Boot 2.7.x)

  • 支付服务(pay-service):对接第三方支付接口(Spring Boot 2.7.x)

  • 商品服务(goods-service):提供商品查询、库存管理(Spring Boot 2.7.x)

  • 网关服务(gateway-service):统一入口,负责路由与鉴权(Spring Cloud Gateway)

核心监控需求

  1. 实时掌握各服务的运行状态(JVM 内存、CPU 使用率、接口响应时间);

  2. 快速定位分布式链路中的慢调用与异常(如订单创建超时是源于支付服务还是商品服务);

  3. 自定义业务指标监控(如每分钟订单量、支付成功率);

  4. 异常时自动告警(如 JVM 内存使用率持续超过 90%)。

1.2 技术选型与整体架构

针对上述需求,选择 “Prometheus(指标采集)+Grafana(可视化)+SkyWalking(链路追踪)” 的组合,三者分工明确且可无缝整合:

  • Prometheus:定时抓取各服务暴露的指标数据(如 JVM 指标、业务指标),支持多维度查询与告警规则配置;

  • Grafana:对接 Prometheus 与 SkyWalking,通过拖拽式面板实现指标与链路数据的可视化展示;

  • SkyWalking:基于字节码增强技术(Agent)采集分布式链路数据,关联服务拓扑、接口性能与日志,实现 “链路 - 指标 - 日志” 一体化分析。

整体架构图如下(基于 Mermaid 绘制):

暴露指标/链路数据
Agent采集链路
指标数据
链路/拓扑数据
可视化面板
触发告警
邮件/钉钉
存储链路数据
存储指标数据
Java微服务集群
Prometheus
SkyWalking OAP Server
Grafana
运维/开发人员
AlertManager
告警接收端
Elasticsearch
本地TSDB

数据流向说明

  1. Java 服务通过Micrometer(指标工具)暴露 Prometheus 格式的指标接口,通过SkyWalking Agent采集链路数据;

  2. Prometheus 定时(默认 15s)抓取服务指标,存储到本地时序数据库(TSDB);

  3. SkyWalking Agent 将采集的链路数据发送至 OAP Server,OAP Server 处理后存储到 Elasticsearch;

  4. Grafana 同时对接 Prometheus(指标数据源)与 SkyWalking(链路数据源),生成统一监控面板;

  5. 当 Prometheus 检测到指标异常(如接口错误率超过 5%),通过 AlertManager 触发告警。

二、实战第一步:环境部署与基础配置

2.1 环境准备

本次实战基于 Linux(CentOS 7)环境,所有组件通过 Docker Compose 部署(避免环境依赖冲突),提前安装:

  • Docker 20.10+

  • Docker Compose 2.0+

  • JDK 1.8+(用于本地调试 Java 服务)

2.2 基于 Docker Compose 部署核心组件

创建docker-compose.yml文件,统一管理 Prometheus、Grafana、SkyWalking 等组件,完整配置代码如下(含注释说明):

version: '3.8'services:\# 1. Prometheus:指标采集与存储prometheus:image: prom/prometheus:v2.45.0container\_name: prometheusports:\- "9090:9090"  # Prometheus Web端口volumes:\- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml  # 配置文件挂载\- prometheus-data:/prometheus  # 数据持久化command:\- '--config.file=/etc/prometheus/prometheus.yml'\- '--storage.tsdb.path=/prometheus'\- '--web.console.libraries=/usr/share/prometheus/console\_libraries'restart: alwaysnetworks:\- monitor-network\# 2. Grafana:可视化面板grafana:image: grafana/grafana:9.5.2container\_name: grafanaports:\- "3000:3000"  # Grafana Web端口volumes:\- grafana-data:/var/lib/grafanaenvironment:\- GF\_SECURITY\_ADMIN\_USER=admin  # 初始用户名\- GF\_SECURITY\_ADMIN\_PASSWORD=admin123  # 初始密码(生产环境需修改)restart: alwaysdepends\_on:\- prometheusnetworks:\- monitor-network\# 3. SkyWalking OAP Server:链路数据处理与分析skywalking-oap:image: apache/skywalking-oap-server:9.4.0container\_name: skywalking-oapports:\- "12800:12800"  # Agent数据接收端口\- "11800:11800"  # UI查询端口environment:\- SW\_STORAGE=elasticsearch  # 存储方式(Elasticsearch)\- SW\_ES\_HOST=elasticsearch  # ES地址(与下方ES服务名一致)\- SW\_ES\_PORT=9200  # ES端口\- SW\_HEALTH\_CHECKER=default\- SW\_TELEMETRY=prometheus  # 支持Prometheus指标输出restart: alwaysdepends\_on:\- elasticsearchnetworks:\- monitor-network\# 4. SkyWalking UI:链路数据可视化界面skywalking-ui:image: apache/skywalking-ui:9.4.0container\_name: skywalking-uiports:\- "8080:8080"  # UI Web端口environment:\- SW\_OAP\_ADDRESS=http://skywalking-oap:12800  # 连接OAP Server地址restart: alwaysdepends\_on:\- skywalking-oapnetworks:\- monitor-network\# 5. Elasticsearch:SkyWalking链路数据存储elasticsearch:image: elasticsearch:7.17.0container\_name: elasticsearchports:\- "9200:9200"\- "9300:9300"environment:\- discovery.type=single-node  # 单节点模式(生产环境需集群)\- ES\_JAVA\_OPTS=-Xms512m -Xmx512m  # JVM内存配置\- xpack.security.enabled=false  # 关闭安全验证(测试环境)volumes:\- es-data:/usr/share/elasticsearch/datarestart: alwaysnetworks:\- monitor-network\# 6. AlertManager:Prometheus告警管理alertmanager:image: prom/alertmanager:v0.26.0container\_name: alertmanagerports:\- "9093:9093"volumes:\- ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.ymlrestart: alwaysdepends\_on:\- prometheusnetworks:\- monitor-networkvolumes:prometheus-data:grafana-data:es-data:networks:monitor-network:driver: bridge
关键配置文件补充
  1. Prometheus 配置文件(prometheus/prometheus.yml):定义指标抓取规则与告警规则关联
global:scrape\_interval: 15s  # 全局抓取间隔evaluation\_interval: 15s  # 告警规则评估间隔rule\_files:\- "alert\_rules.yml"  # 告警规则文件(后续创建)scrape\_configs:\# 抓取Prometheus自身指标\- job\_name: 'prometheus'static\_configs:\- targets: \['localhost:9090']\# 抓取Java微服务指标(通过Micrometer暴露)\- job\_name: 'java-microservice'metrics\_path: '/actuator/prometheus'  # Spring Boot Actuator暴露指标的路径static\_configs:\- targets: \['192.168.1.100:8081',  # user-service地址'192.168.1.100:8082',  # order-service地址'192.168.1.100:8083'   # pay-service地址]\# 关联AlertManageralerting:alertmanagers:\- static\_configs:\- targets: \['alertmanager:9093']
  1. 告警规则文件(prometheus/alert_rules.yml):定义常见异常场景的告警规则
groups:\- name: service\_alertsrules:\# 1. 服务不可用(5分钟内抓取失败率100%)\- alert: ServiceDownexpr: up == 0for: 5mlabels:severity: criticalannotations:summary: "服务 {{ \$labels.instance }} 不可用"description: "服务 {{ \$labels.instance }} 已停止响应,持续时间超过5分钟"\# 2. JVM内存使用率超过90%\- alert: JVMMemoryHighUsageexpr: jvm\_memory\_used\_bytes{area="heap"} / jvm\_memory\_max\_bytes{area="heap"} > 0.9for: 2mlabels:severity: warningannotations:summary: "服务 {{ \$labels.service }} JVM内存使用率过高"description: "服务 {{ \$labels.service }} 堆内存使用率达 {{ \$value | humanizePercentage }},持续时间超过2分钟"\# 3. 接口平均响应时间超过500ms\- alert: ApiHighLatencyexpr: http\_server\_requests\_seconds\_sum{quantile="0.5"} / http\_server\_requests\_seconds\_count > 0.5for: 1mlabels:severity: warningannotations:summary: "接口 {{ \$labels.uri }} 响应时间过长"description: "接口 {{ \$labels.uri }} 50分位响应时间达 {{ \$value | humanizeDuration }},持续时间超过1分钟"
  1. AlertManager 配置文件(alertmanager/alertmanager.yml):配置告警接收方式(以钉钉为例)
global:resolve\_timeout: 5mroute:group\_by: \['alertname']group\_wait: 10sgroup\_interval: 10srepeat\_interval: 1hreceiver: 'dingding'  # 告警接收者receivers:\- name: 'dingding'webhook\_configs:\- url: 'http://dingding-webhook:8080/send'  # 钉钉机器人WebHook地址(需自行部署或使用公开服务)send\_resolved: true  # 发送告警恢复通知inhibit\_rules:\- source\_match:severity: 'critical'target\_match:severity: 'warning'equal: \['alertname', 'service', 'instance']
部署启动与验证
  1. 创建目录结构并放置配置文件:
mkdir -p monitor/{prometheus,alertmanager}\# 将上述prometheus.yml、alert\_rules.yml放入monitor/prometheus\# 将alertmanager.yml放入monitor/alertmanager
  1. 启动所有组件:
cd monitordocker-compose up -d
  1. 验证组件可用性:
  • Prometheus:访问 http://服务器IP:9090,查看 “Targets” 菜单,确认所有服务状态为 “UP”(若显示 “DOWN”,需检查服务网络连通性或端口是否开放);

  • Grafana:访问 http://服务器IP:3000,使用初始账号密码(admin/admin123)登录,首次登录需修改密码;

  • SkyWalking UI:访问 http://服务器IP:8080,确认界面正常加载,默认显示 “服务列表”(暂为空,后续接入服务后会显示);

  • Elasticsearch:执行 curl http://服务器IP:9200,返回包含 “name”“cluster_name” 等字段的 JSON 数据,说明 ES 启动成功。

http://www.dtcms.com/a/390490.html

相关文章:

  • 【学习】响应系统
  • Linux网络:socket网络套接字
  • 知识图谱对人工智能中自然语言处理的深层语义分析的影响与启示
  • 从车间到云端:Kepware如何加速IIoT落地
  • MyISAM 与 InnoDB 深度对比:如何正确选择 MySQL 存储引擎
  • 串口无线数传模块实现化工园区与3公里外水泵PLC无线通讯实现设备数据传输
  • rook-ceph自定义添加osd流程
  • 【需求导向】解读660页智慧教育大数据信息化顶层设计及智慧应用建设方案
  • InnoDB 引擎深潜指南---从逻辑结构到 MVCC 原理,带源码级案例与性能要点
  • Android Compose 开发 界面间的跳转(Router)
  • unity(C#/cs)请求 python django后端服务器预制体渲染 scroll list 视频列表
  • 《Linux 指令实战进阶:从终端新手到 shell 驾驭者的技术跃迁(第三篇)》
  • 临床AI产品化全流程研究:环境聆听、在环校验与可追溯系统的多技术融合实践(下)
  • Croe 11.0 学习笔记:1.5 草绘
  • Hadoop 1.x 与 2.x 版本对比:架构演进与核心差异解析
  • 【5/20】Express.js 基础:构建 RESTful API,实现用户数据端点
  • SmartX 榫卯企业云平台+ StarRocks 大数据联合解决方案
  • CodeX 新王已来:从技术原理到工程实践,AI 如何重构编程全流程
  • 智慧赋能:King‘s Biobank 重构生物样本管理新范式
  • Chromium 138 编译指南 Ubuntu 篇:环境配置与基础准备(一)
  • 知识库新增三方应用AI问答,新增标签管理,集成Excalidraw,重构全文检索,zyplayer-doc 2.5.4 发布啦!
  • JupyterLab部署及使用
  • 本地连接服务器使用jupyter
  • 泰迪智能科技分享数据挖掘定义、主要方法、预处理、应用领域
  • (vue)vue2实现导入excel文件功能
  • 【C语言数据结构】第1章:绪论
  • Python自动化办公2.0全能实战:从Excel到BI大屏,从OCR到机器学习,一站式提升办公效率100倍
  • 第十四届蓝桥杯青少组C++选拔赛[2022.11.27]第二部分编程题(3、业务办理时间)
  • 微服务-网关gateway理论与实战
  • 吴恩达机器学习笔记week1-2(线性回归模型及Sklearn的使用)