给开发者用的监控系统,说到底只有一件事要做:出了问题尽快让人知道,并且直接告诉他坏了什么、坏在哪。要做到这一点,指标、日志和链路得互相打通,告警要指明从哪开始查,仪表板得是大家不用催也会主动打开的那种。不管是自己开发监控系统,还是用现成的工具,标准都一样;跑在 AWS 上的话,小团队用 CloudWatch 就够了,规模上去了,Datadog 才物有所值。
“在我机器上能跑"和"在生产环境能跑"之间有一道鸿沟,监控本该把它填上。可大多数时候填不上,因为监控往往被当成运维工具来建,而不是开发者出事时会伸手去拿的东西。
我最近开始以自由职业身份做 DevOps 和基础设施的活儿,每到一个新环境,最先看的东西之一就是监控配置——它比 README 更能说明一个团队的真实状态。失败的方式几乎千篇一律:工具都在,但和开发者的实际工作方式是脱节的。有人在一个 bug 上耗了三小时,其实能看生产日志的话五分钟就完事;故障不是靠告警发现的,是靠客服工单;或者反过来,一天 200 条告警,绝大部分是噪音,于是所有人干脆全部无视,每次出事的前半小时都花在搞清"到底坏了什么"上,而不是修它。
这篇讲的是通用做法。我现在给两个产品实际在用的工具,另外写了一篇。
指标、日志、链路:打通了才有用#
指标告诉你出问题了(错误率飙升、延迟突增),日志告诉你发生了什么(堆栈、请求内容、报错信息),链路告诉你问题在哪(哪个服务、哪个接口、哪次数据库调用)。这些都是常识。关键在于三者有没有打通:告警一响,你应该能从指标一路点到相关日志,再点到链路。如果开发者还得在三个工具之间手动比对时间戳,那不管每个工具单看多漂亮,这套方案就是失败的。
仪表板也用同一条标准检验。CPU、内存、磁盘 I/O 对容量规划很重要,但对排查一个 500 错误毫无帮助。大家会主动打开的仪表板,上面放的是:技术指标旁边摆着业务指标(错误率旁边是每小时注册数)、时间轴上叠加的最近部署、最近一小时的前五个错误(带日志链接),以及延迟百分位——p50、p95、p99——而不只是平均值。一个没人主动打开的仪表板,就是没有证明自己的价值。
告警同理。每条告警都该回答两个问题:坏了什么?从哪开始查?
坏告警:“web-server-3 CPU 高”
好告警:“14:32 起 /api/payments 错误率 > 5%。最近部署:14:15,@sarah。[查看日志] [查看链路]”
往第二种靠拢有几个办法:按基线偏离告警,而不是按拍脑袋定的阈值;按归属路由(支付的错误发给支付团队,别全组织广播);相关错误合并成一条 Slack 消息,别发 50 条。反馈环也要收紧——从"出事了"到"开发者知道了"应该在一分钟以内,这意味着实时日志流而不是五分钟一批、每个仪表板都有部署标记、以及跨服务边界不断链的分布式追踪。
为用它的人而建#
运维团队最大的错误,是给自己建监控。解决办法一点也不高深:在开发者调试的时候坐到旁边,看他们在哪卡住;问问事故当中大家在问什么——“哪个服务?““什么变了?““请求长什么样?";再搞清楚对产品真正要紧的指标是什么。基本不会是 CPU,多半是结账完成率、上传成功率这类东西。
然后是消除阻力。给新服务接监控要花一整天的话,没人会做。要提供能自动接入你们在用框架(Django、Express、Spring)的库、可以直接复制的仪表板和告警模板,以及不用提工单就能自己加指标的自助工具。整套东西还要当代码来管:配置进版本控制,告警规则要测试(该响的时候真的会响),要做多区域的话一开始就规划进去。
AWS 上的小团队?先用 CloudWatch#
不到 50 个工程师、又跑在 AWS 上的话,CloudWatch 就是正确起点,第一天就想买更高级工具的冲动最好忍住。EC2、Lambda、RDS、ECS 全都自动上报 CloudWatch,不写一行埋点代码就有了可见性;小团队每月 10~50 美元,没有固定平台费;指标、日志、链路(走 X-Ray)、告警都在一个地方。像样的告警和仪表板,一个下午就能搭出来,用不了几周。
最被低估的是 CloudWatch Logs Insights——不用架 Elasticsearch 就能查日志:
fields @timestamp, @message
| filter @message like /ERROR/
| stats count() by bin(5m)其他几点:
- 复合告警能压噪音:错误率高"且"响应时间劣化时才告警,别每个条件单独响。
- 真正的价值在自定义指标。用 CloudWatch SDK 把业务指标(注册、交易、功能使用)和基础设施指标放在一起。
- CloudWatch Synthetics 能按计划跑金丝雀测试,模拟真实用户路径,让你赶在用户之前发现结账坏了。
- X-Ray 用极少的配置就能拿到分布式追踪,对大多数微服务架构够用了。
什么时候 CloudWatch 不够用了,也很好判断:要上多云了、想要正经的异常检测了、仪表板定制开始难受了,或者团队过了 50 人、需要真正的协作功能了。
团队大了:Datadog#
Datadog 很贵——大组织一年 2 万到 10 万美元以上很正常——但到了规模就值回票价。AWS、Azure、GCP、本地机房、容器、Serverless、数据库、前端,一个视图全看到。Watchdog 不用手动调阈值就能标记异常模式,这点很关键,因为几千个服务是不可能靠人盯的。它还补上了 CloudWatch 缺的协作层:团队仪表板、RBAC、共享调查笔记本、PagerDuty/Opsgenie 集成、多条件告警、阈值突破预测、维护窗口,以及能下钻到代码级性能分析的 APM 和自动生成的服务拓扑图。
推行顺序我大致会这么排:先给关键服务接入,第一天就按团队和环境把标签打全;指标命名规范、仪表板模板、告警级别、SLO 定义要趁早定好——事后补标准是苦役;接入 CI/CD 部署标记、事件管理和 Slack;给培训留出时间,Datadog 强归强,不是看看就会的;最后盯紧账单:过滤噪音指标、大流量服务对链路采样、定期盘点到底在为哪些功能付费。
签约之前值得比较一下:New Relic(定位类似,大流量追踪有时更便宜)、Dynatrace(AIOps 很强,金融行业常见)、Splunk(日志分析顶级,安全团队已经在用的话更合适)、Grafana Cloud(已经在用 Prometheus/Loki 的话是自然归宿)。
实践中很多团队最后落在混合方案上:AWS 原生服务交给自动又便宜的 CloudWatch,应用层交给 Datadog,再让 Datadog 采集 CloudWatch 指标拼出统一视图。不花哨,但好使。
CloudWatch 和 Datadog 对比#
| CloudWatch | Datadog | |
|---|---|---|
| 适合谁 | 不到 50 个工程师、全在 AWS 上的团队 | 服务多、用不止一家云的大组织 |
| 费用结构 | 按量付费,没有平台费;小团队每月 10~50 美元 | 大组织一年 2 万到 10 万美元以上很正常,账单得一直盯着 |
| 上手成本 | EC2、Lambda、RDS、ECS 自动上报,一个下午就能搭出像样的告警 | 先给关键服务接入,趁早定好标签和命名规范,还要留出培训时间 |
| 多云 | 以 AWS 为中心,要上多云就说明该换了 | AWS、Azure、GCP、本地机房、容器、Serverless 一个视图全看到 |
| 异常检测 | 基本是自己调的告警,想要更多也说明该换了 | Watchdog 不用手动调阈值就能标记异常 |
| 协作 | 比较薄弱,团队过了 50 人就会不够用 | 团队仪表板、RBAC、共享调查笔记本、PagerDuty/Opsgenie 集成 |
| 链路追踪 | X-Ray,配置很少 | 能下钻到代码级性能分析的 APM,自动生成服务拓扑图 |
从零开始:监控系统搭建顺序#
我的顺序是:
- 先找开发者聊,问清事故当中什么最痛。
- 给要紧的流程定义 SLO:对登录、结账、搜索来说,“正常"到底是什么意思。
- 从这条关键路径开始埋点。
- 接着加分布式追踪,在微服务架构里它的排障回报率最高。
- 告警挂在这些流程上,而不是挂在 CPU 上,每条告警发给负责的团队。
- 给每条告警配一份运维手册,让凌晨三点的自己知道该查什么。
- 在日历上排一个季度回顾,删掉过期告警、修正漂移的阈值、确认仪表板还对得上现在的架构。
再列几个我反复把团队从里面捞出来的坑:工具太多(能配合的 3 个胜过各自为战的 6 个);图表没有基线(500 rps 是正常水位还是十倍突增?);监控了用户根本感知不到的东西(无状态容器的磁盘 I/O);还有监控系统本身没有冗余——告警系统在事故中间挂掉,你就在最不能瞎的时候瞎了。
这些没有一件需要最花哨的工具。需要的只是:让开发者在他们真正会看的地方,快速拿到需要的信息。
