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

应用监控详解

应用监控详解

本章导读

没有监控的系统就像在黑暗中摸索——你永远不知道问题何时发生、发生在哪里。本章深入讲解APM工具、链路追踪、指标采集三大监控支柱,帮助读者构建全方位的系统可观测性,实现从被动救火到主动预防的转变。

学习目标

  • 目标1:理解可观测性三大支柱(Metrics、Traces、Logs)及其关联分析
  • 目标2:掌握Prometheus + Micrometer实现Java应用指标采集与暴露
  • 目标3:熟练运用Spring Cloud Sleuth + Zipkin进行分布式链路追踪
  • 目标4:能够设计和配置Grafana Dashboard实现监控数据可视化展示
  • 目标5:建立基于指标的多级告警体系实现故障快速响应

前置知识:熟悉Spring Boot应用开发,了解时序数据库概念,具备基本的运维知识

阅读时长:约 45 分钟

一、知识概述

应用监控是确保系统稳定运行的关键环节,通过实时收集、分析和展示应用的运行状态,帮助运维人员及时发现和解决问题。现代应用监控主要包括APM(应用性能监控)、链路追踪和指标采集三个方面。

1.1 监控体系架构

┌─────────────────────────────────────────────────────────────┐ │ 监控体系架构 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 数据采集层 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ Metrics │ │ Traces │ │ Logs │ │ Events │ │ │ │ 指标 │ │ 链路 │ │ 日志 │ │ 事件 │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ │ │ │ │ │ ▼ ▼ ▼ ▼ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ 数据处理与存储 │ │ │ │ Prometheus / Jaeger / ELK / Kafka │ │ │ └─────────────────────┬───────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ 数据分析与告警 │ │ │ │ AlertManager / Grafana / Kibana │ │ │ └─────────────────────┬───────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ 可视化展示 │ │ │ │ Grafana Dashboards / Kibana / Jaeger UI │ │ │ └─────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘

1.2 监控指标类型

┌─────────────────────────────────────────────────────────────┐ │ 监控指标类型 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. 基础设施指标 (Infrastructure Metrics) │ │ - CPU使用率、内存使用率 │ │ - 磁盘I/O、网络流量 │ │ - 系统负载、进程数 │ │ │ │ 2. 应用指标 (Application Metrics) │ │ - 请求量(QPS)、响应时间 │ │ - 错误率、成功率 │ │ - 并发连接数、线程池状态 │ │ │ │ 3. JVM指标 (JVM Metrics) │ │ - 堆内存使用、GC次数和时间 │ │ - 线程数、类加载数 │ │ - CPU使用、编译时间 │ │ │ │ 4. 业务指标 (Business Metrics) │ │ - 订单量、交易金额 │ │ - 用户活跃数、转化率 │ │ - 业务成功率、失败原因 │ │ │ │ 5. 自定义指标 (Custom Metrics) │ │ - 业务特定指标 │ │ - 缓存命中率 │ │ - 队列积压量 │ │ │ └─────────────────────────────────────────────────────────────┘

1.3 三大支柱

┌─────────────────────────────────────────────────────────────┐ │ 可观测性三大支柱 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Metrics │ │ Traces │ │ Logs │ │ │ │ 指标 │ │ 链路 │ │ 日志 │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ 回答:发生了什么? 回答:哪里出了问题? 回答:为什么? │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ 关联分析 │ │ │ │ 指标发现问题 → 链路定位位置 → 日志分析原因 │ │ │ └─────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘

二、APM工具实践

2.1 Prometheus + Micrometer集成

<!-- pom.xml - 依赖配置 --><dependencies><!-- Spring Boot Actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- Micrometer Prometheus --><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency><!-- Micrometer Core --><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-core</artifactId></dependency></dependencies>
# application.yml - Actuator配置management:endpoints:web:exposure:include:health,info,prometheus,metrics,heapdump,threaddumpbase-path:/actuatorendpoint:health:show-details:alwaysprometheus:enabled:truemetrics:tags:application:${spring.application.name}environment:${spring.profiles.active}distribution:percentiles-histogram:http.server.requests:truepercentiles:http.server.requests:0.5,0.9,0.95,0.99export:prometheus:enabled:true
// ============================================// 自定义指标配置// ============================================@ConfigurationpublicclassMetricsConfig{@BeanpublicMeterRegistryCustomizer<MeterRegistry>metricsCommonTags(){returnregistry->registry.config().commonTags("application","myapp").commonTags("host",getHostName());}privateStringgetHostName(){try{returnInetAddress.getLocalHost().getHostName();}catch(Exceptione){return"unknown";}}}// ============================================// 业务指标收集// ============================================@ServicepublicclassOrderService{privatefinalCounterorderCounter;privatefinalCounterorderSuccessCounter;privatefinalCounterorderFailureCounter;privatefinalTimerorderProcessingTimer;privatefinalGaugependingOrdersGauge;// 自定义业务指标privatefinalAtomicLongpendingOrders=newAtomicLong(0);publicOrderService(MeterRegistrymeterRegistry){// 订单总数计数器this.orderCounter=Counter.builder("orders.total").description("总订单数").tag("type","all").register(meterRegistry);// 成功订单计数器this.orderSuccessCounter=Counter.builder("orders.success").description("成功订单数").register(meterRegistry);// 失败订单计数器this.orderFailureCounter=Counter.builder("orders.failure").description("失败订单数").tag("reason","unknown").register(meterRegistry);// 订单处理时间this.orderProcessingTimer=Timer.builder("orders.processing.time").description("订单处理时间").publishPercentiles(0.5,0.95,0.99).publishPercentileHistogram().minimumExpectedValue(Duration.ofMillis(100)).maximumExpectedValue(Duration.ofSeconds(10)).register(meterRegistry);// 待处理订单数量this.pendingOrdersGauge=Gauge.builder("orders.pending",pendingOrders,AtomicLong::get).description("待处理订单数量").register(meterRegistry);}publicOrdercreateOrder(OrderRequestrequest){returnorderProcessingTimer.record(()->{orderCounter.increment();pendingOrders.incrementAndGet();try{// 处理订单逻辑Orderorder=processOrder(request);orderSuccessCounter.increment();returnorder;}catch(Exceptione){orderFailureCounter.increment();throwe;}finally{pendingOrders.decrementAndGet();}});}privateOrderprocessOrder(OrderRequestrequest){// 订单处理逻辑returnnewOrder();}}// ============================================// HTTP请求指标收集// ============================================@ComponentpublicclassHttpMetricsFilterimplementsWebMvcTagsProvider{@OverridepublicIterable<Tag>getTags(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Throwableexception){returnArrays.asList(Tag.of("method",request.getMethod()),Tag.of("uri",getUriTemplate(request)),Tag.of("status",String.valueOf(response.getStatus())),Tag.of("exception",exception!=null?exception.getClass().getSimpleName():"none"));}privateStringgetUriTemplate(HttpServletRequestrequest){Stringuri=request.getRequestURI();// 参数化URI,避免高基数问题returnuri.replaceAll("/\\d+","/{id}");}}// ============================================// 缓存指标监控// ============================================@ServicepublicclassCacheService{privatefinalCountercacheHitCounter;privatefinalCountercacheMissCounter;privatefinalTimercacheGetTimer;public
http://www.jsqmd.com/news/679110/

相关文章:

  • 终极高效炉石传说BepInEx插件完整指南:55+功能深度优化方案
  • 告别“一锤子买卖”:给你的Xilinx FPGA设计加上Multiboot双镜像冗余备份
  • 解决NaViL-9B部署常见问题:从环境配置到服务启动全攻略
  • HTML5中通过MessageChannel实现多个Worker间直接通信
  • 如何在Android应用中实现PDF打印功能:5个步骤集成AndroidPdfViewer与PrintManager
  • 从OOM到零事故:某支付平台迁移Java 25虚拟线程后,如何通过“可审计虚拟线程池+上下文签名链”实现100%调用链安全溯源
  • 日志体系详解
  • 深度解析:如何通过可视化即代码重塑神经网络架构设计思维
  • SSV6155/6255 WiFi驱动加载失败?从硬件检查到内核日志的完整调试指南
  • Real-Anime-Z实操指南:Jupyter中动态加载不同LoRA并可视化中间特征
  • da da wda d
  • DeepSeek-OCR-2实际案例:发票收据自动识别效果分享
  • 故障排查详解
  • 魔兽争霸3优化完全指南:用WarcraftHelper解决现代系统兼容性问题
  • 2026届学术党必备的降重复率神器实测分析
  • 别再死记硬背了!用这5个方法搞定ADAS测试用例设计(附信号验证/诊断/升级实战案例)
  • 从混乱到有序:NSC_BUILDER 让你的 Switch 游戏库焕然一新
  • DROID-SLAM 夜晚超强(3) 数学模型 latex - MKT
  • golang如何使用expvar暴露运行时指标_golang expvar运行时指标暴露步骤
  • 【无标题】d wa dwa da w
  • 终极iOS设备降级工具:Legacy-iOS-Kit完全指南
  • Vitis自定义IP编译过了,Debug却卡在QEMU文件缺失?一个手动创建空文件的“土办法”救了我
  • 如何用MAA明日方舟助手彻底解放你的游戏时间?
  • 2026兰州复读学校排行:甘肃高三复读学校/甘肃高三文化课冲刺/甘肃高中复读学校/甘肃高考复读学校/甘肃高考文化课冲刺集训/选择指南 - 优质品牌商家
  • 爱奇艺发布纳逗Pro平台、新爱奇艺号和分账新规 今年预计上线3.5万部漫剧
  • 2026年4月西北机制净化板厂家排行:兰州中空玻镁岩棉净化板/兰州净化板厂家/兰州净化板生产厂家/兰州岩棉净化板/选择指南 - 优质品牌商家
  • 2026兰州钢塑波纹管技术全解析:兰州pe双壁波纹管/兰州pe聚乙烯波纹管/兰州pe钢带增强波纹管/兰州pe钢带增强螺旋波纹管/选择指南 - 优质品牌商家
  • 如何在Windows上快速安装苹果设备驱动程序:终极解决方案指南
  • 打印时隐藏元素_print样式display-none技巧【操作】
  • 保姆级教程:用dynv6免费域名+ddns-go,给你的Windows远程桌面挂个‘固定电话’