监控不是锦上添花,而是救命稻草

开源路边摊
2025-06-16 22:20
阅读 742

引言:监控的“存在感”

引言:监控的“存在感”

在我参与过的多个项目中,有一个话题几乎每次都绕不开——监控。它不像数据库、缓存或者服务治理那样直接决定系统的性能和功能,但却像一位隐形的守护者,在关键时刻发挥着至关重要的作用。

我至今还记得几年前,我们上线一个核心业务系统之后,用户反馈“偶尔卡顿”。当时团队排查了整整一天,最终才发现是某个第三方接口偶发超时,而这个细节在本地测试和压测环境中都没法复现。如果当时有一套完善的监控体系,这个问题可能在上线当天就能被发现。

这让我深刻意识到:监控不是可有可无的工具,它是保障系统稳定性的基石。

接下来,我想结合自己亲身经历的几个项目,聊一聊我对监控工具的看法,包括选型思路、实践中的踩坑经验以及一些真实场景下的心得。


问题描述:从一次血泪教训说起

问题描述:从一次血泪教训说起

2019年我在一家电商公司负责订单中心的重构。那是一个典型的分布式系统,包含支付、库存、物流等多个子系统,服务通过Kafka异步解耦,整体采用Spring Cloud微服务架构。

当时我们的监控体系非常薄弱,仅仅是每个服务里加了几行日志输出,并用ELK收集起来。运维同学也配置了一个Prometheus+Grafana来做基础指标监控(CPU、内存等),但对业务层面的追踪基本没覆盖。

有一天凌晨三点,值班电话突然响起,说“下单失败率暴涨”。我们火速上线排查,结果却发现:

  • 系统 CPU 和内存都很正常;
  • Kafka 消费堆积不严重;
  • 日志里也没看到明显的异常;

直到我们查到数据库慢查询日志,才意识到问题是由于某个订单拆单逻辑在高并发下出现了死锁。整个定位过程持续了将近四个小时,期间损失了大量订单。

这件事之后,我们彻底重新思考了监控的意义和策略。


解决方案:打造分层立体化的监控体系

解决方案:打造分层立体化的监控体系

为了构建真正有效的监控体系,我们围绕“可观测性”提出了三个层次的监控模型:

第一层:基础设施监控

这部分主要是对服务器、容器、网络等基础设施的监控,属于最基础的一层。

我们继续使用 Prometheus + Node Exporter 来采集机器的 CPU、内存、磁盘 IO 等信息。搭配 Grafana 展示图表,再配合 Alertmanager 实现预警机制。

配置样例:

# prometheus.yml 片段
scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['host1:9100', 'host2:9100']

这一层虽然简单,但至关重要。比如之前就曾出现过因磁盘满导致服务无法写入临时文件的问题,就是靠 node_disk_used% 这个指标及时发现的。

第二层:应用层监控

应用层监控包括接口响应时间、QPS、错误率、调用链等信息。

我们引入了 Micrometer + Prometheus 组合来实现 Metrics 的暴露与采集,同时集成了 Zipkin 来做分布式链路追踪。

以 Spring Boot 应用为例,只需添加以下依赖即可支持:

<!-- pom.xml -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

同时开启 Sleuth 自动埋点,可以自动记录请求的 traceId 和 spanId。

Zipkin 配置也很简单,只需要在 application.yml 中加上:

spring:
  zipkin:
    base-url: http://zipkin-server:9411
  sleuth:
    enabled: true

这样就可以在 Zipkin 界面中看到完整的调用链,帮助我们在复杂调用关系下精准定位问题。

第三层:业务层监控

这是我们之前最容易忽视的部分。有些时候,系统运行平稳,但某些核心业务指标却悄然下降。

例如:

  • 订单支付成功率下降?
  • 商品加入购物车但未提交的比例升高?
  • 某种优惠券使用率异常?

这类问题往往需要我们主动埋点,通过自定义指标来捕捉。

我们在 Micrometer 中自定义了一些计数器:

Counter paymentSuccessCounter = Metrics.counter("payment.success.count", "env", env);
Counter paymentFailureCounter = Metrics.counter("payment.fail.count", "env", env);

public void processPayment(Order order) {
    try {
        boolean result = doPay(order);
        if (result) {
            paymentSuccessCounter.increment();
        } else {
            paymentFailureCounter.increment();
        }
    } catch (Exception e) {
        log.error("支付失败", e);
        paymentFailureCounter.increment();
    }
}

这些数据会自动暴露给 Prometheus,然后在 Grafana 上可视化展示。


踩坑经验:那些年我们走过的弯路

在实施上述方案的过程中,我们也踩了不少坑。总结下来主要有以下几个方面:

坑1:指标命名混乱,缺乏规范

一开始大家各自为政,有人用 http_request_latency_seconds,有人用 api.latency, 甚至还有人写 my_app_http_time。后来我们制定了统一的命名规范,推荐采用类似 app_name.operation.type.tag 的格式,比如:

order.process.latency.env=prod
user.login.count.role=guest

还专门做了内部文档,方便后续维护和扩展。

坑2:过度采样,Prometheus 内存爆炸

一开始我们图省事,把所有接口都开启了详细的 histogram 指标,结果 Prometheus 实例频繁 OOM。

解决办法是优化 metrics 的粒度和标签数量,去掉不必要的 tag,限制 histogram 的 bucket 数量,比如:

Histogram.builder("custom.metric.name")
    .tags("operation", operation)
    .register(Metrics.globalRegistry);

并设置合理的 buckets:

management:
  metrics:
    distribution:
      percentiles-histogram:
        custom.metric.name: true

坑3:日志+监控割裂

早期我们分别用 ELK 做日志分析,Prometheus 做指标监控。出问题时经常需要切换两个平台才能定位问题。

后来我们在 Grafana 中接入了 Loki 插件(基于 LogQL 的轻量级日志系统),实现了在同一界面中查看指标与日志的关联情况。

效果如下:

{job="order-service"} |~ "TraceId"

这样我们就可以根据某个 trace_id 快速找到对应时间段的日志条目,大大提高了排查效率。


效果总结:监控带来的变化

当整个监控体系搭建完成并投入使用后,我们发现:

  • 故障响应时间大幅缩短:过去平均定位故障需要3小时以上,现在大多可以在30分钟内定位原因。
  • 被动变主动:有了告警机制,很多潜在问题能在影响用户前就被发现。
  • 业务视角更清晰:通过埋点我们能实时了解业务流转情况,甚至能辅助产品决策(比如判断某个新功能是否受欢迎)。

有一次我们上线了一个新的配送调度算法,初期看起来各项指标正常,但在 Grafana 上看业务指标发现新算法的订单履约率略有下降。我们及时回滚并进行分析,发现是因为新算法在极端天气下适应性不好。

如果没有这套监控体系,这个问题很可能会在几天后被用户投诉才发现。


经验分享:几点建议送给你

如果你正在考虑或已经着手构建自己的监控体系,希望我这些年踩过的坑能帮你们少走一点弯路:

1. 别等到出问题才想起监控

监控不是锦上添花,而是救命稻草。不要等到线上出了事故才想着去补监控。

2. 分层设计,逐步演进

可以从基础设施监控起步,逐步加入应用层指标、链路追踪,最后才是业务埋点。每一步都要有明确的目标和收益。

3. 埋点要“聪明”,别贪多

不是每个操作都需要打点,重点是那些你关心的核心路径。否则会造成指标爆炸、难于维护。

4. 把监控纳入CI/CD流程

每次上线新版本时检查是否有新增关键指标,是否需要修改告警规则。就像代码Review一样对待监控配置。

5. 关注“信号”而非“噪音”

监控系统会产生大量数据,但我们要关注的是“信号”——真正反映系统健康状态和业务行为的数据。避免陷入一堆无关紧要的指标中。


结语:监控,是一种态度

在我看来,一个团队的监控水平,某种程度上反映了他们的工程素养。一个不重视监控的团队,往往会在“救火”的节奏中越陷越深。

而当你建立起一套高效的监控体系,它不仅仅是技术上的进步,更是组织思维的一种升级——从“被动修复”转变为“主动感知”。

我也相信,随着云原生、Service Mesh 和 AIOps 的发展,未来的监控会越来越智能,越来越自动化。但对于工程师来说,理解监控背后的思想,建立良好的观测习惯,始终是最根本的能力。

所以无论你现在处于哪个阶段,请记得:

你的监控工具有多完善,你的系统就有多可靠。

希望这篇文章能带来一些启发,也欢迎大家分享自己的监控实践和想法!

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝