可观测性概述
说实话,我第一次接触「可观测性」这词儿的时候,心里也挺嘀咕的。
不就是监控换了个马甲吗?
后来在几个大型项目里摸爬滚打,才慢慢咂摸出味来——这事儿还真不一样。
从传统监控到可观测性
传统监控的核心思路是什么?
是你提前把所有可能出问题的地方都定义好,然后盯着这些阈值看。
CPU超了80%就告警,内存不够了就发通知。
但现实很骨感。我遇到过多少次了——监控面板全是绿的,用户那边却炸了锅。
传统监控的痛:你只能看到你已知的问题。
未知的、突发的情况,监控根本不会告诉你。
可观测性 就不一样了。
它不预设你一定会遇到什么问题。它让你有能力随时问系统:「你现在到底怎么了?」
说白了,就是通过你从系统里拿到的各种数据,直接推理出系统的内部状态。
三大支柱:指标、日志、链路
这个概念最早是Google的工程师提出来的。我个人觉得,这个框架特别好理解,也特别实用。
它们就像是系统的三种「打开方式」,很多时候你需要三者结合,才能看清全貌。
| 支柱 | 核心价值 | 典型工具 |
|---|---|---|
| 指标(Metrics) | 告诉你「有没有问题」 | Prometheus, Grafana |
| 日志(Logs) | 告诉你「具体发生了什么」 | ELK, Loki |
| 链路(Traces) | 告诉你「问题到底出在哪」 | Jaeger, Zipkin |
指标(Metrics)
指标是数字化的、可聚合的数据。它的特点是轻量、高效、能长期保存。
我习惯把指标分成四种类型:
- Counter(计数器):只增不减。比如请求总数、错误总数。
- Gauge(仪表盘):可增可减。比如当前内存使用量、在线用户数。
- Histogram(直方图):观察数据的分布。比如请求延迟的P50、P99。
- Summary(摘要):类似直方图,但可以计算分位数。
一个小建议:
刚开始用Prometheus的时候,别上来就把所有东西都做成Gauge。
我吃过这个亏——保存了大量只增不减的Gauge,存储压力巨大。该用Counter的地方别省。
日志(Logs)
日志是带时间戳的文本记录。它最详细,但也是最「重」的。
结构化是日志的王道。你看下面这两段对比:
# 非结构化日志(别这么干)
2024-10-27 10:00:00 ERROR user 123 login failed password mismatch
# 结构化日志(推荐)
{
"timestamp": "2024-10-27T10:00:00Z",
"level": "ERROR",
"service": "user-service",
"user_id": "123",
"action": "login",
"reason": "password_mismatch",
"duration_ms": 45
}
结构化之后,你用查询语言(比如LogQL)就能秒级定位到所有特定用户、特定操作的失败记录。这在排查问题的时候体验极好。
踩过的一个坑:
我曾经在生产环境把日志级别统一设成了DEBUG。当天晚上磁盘就爆了,所有进程都挂了。
日志级别一定要分环境控制。生产环境用WARN/ERROR,DEBUG留给开发和测试。
链路(Traces)
微服务架构下,一个请求会经过十几个服务。哪一步慢了?哪一步失败了?
链路追踪就是来解决这个问题的。它会给每个请求分配一个全局唯一的 TraceID。
你可以通过这个 TraceID,把一个请求在所有服务上的「足迹」串起来看。
我在项目中遇到过这样一个问题:
业务反馈下单很慢。我看监控,每个服务的CPU、内存、网络都正常。
最后是靠链路追踪才发现——问题出在「订单服务」调用「库存服务」的一个Redis操作上,那个Redis实例的网络延迟偶尔会飚到5秒。
而这个延迟波动,传统监控根本捕获不到。
与传统监控的区别
你想想看,传统监控和可观测性到底差在哪?
我列了个表格,对比一下:
| 对比维度 | 传统监控 | 可观测性 |
|---|---|---|
| 核心方式 | 预设规则 + 阈值告警 | 数据探索 + 按需查询 |
| 响应模式 | 被动:等告警来了再查 | 主动:随时可以问系统「现在怎样」 |
| 数据关联 | 指标、日志、工具各自独立 | 三者关联,可跨维度交叉分析 |
| 处理未知问题 | 几乎没办法 | 有能力探索未知原因 |
说白了,传统监控是「等你告诉我出了什么事」,可观测性是「我自己就能看出来出了什么事」。
这两个维度不冲突,是互补关系。你上线初期可以先搭基础监控,系统复杂了再逐步引入完整的可观测性能力。
小结一下:
可观测性不是新瓶装旧酒。它本质上是让你从「知道它坏了」升级到「知道它为什么坏」。
三大支柱——指标、日志、链路——就像是你的三个好帮手。
指标告诉你「着火了」,日志告诉你「哪里着火了」,链路告诉你「火是怎么烧起来的」。