面试官关注点:你能不能把日志、指标、链路追踪融合起来做根因分析?知道 SLS/ARMS 并用过吗?能写 PromQL 查询吗?
一、可观测性三支柱
| 维度 | 回答什么问题 | 代表产品 |
|---|---|---|
| Metrics(指标) | 系统运行在什么状态? | Prometheus、ARMS Prometheus、CloudMonitor |
| Logs(日志) | 发生了什么? | SLS、ELK、Loki |
| Traces(链路) | 请求为什么慢 / 错? | ARMS、Jaeger、SkyWalking、Zipkin |
新增第四支柱:Events(事件) — K8s 事件、变更事件、告警事件;Profiles(剖析) — CPU/内存火焰图。
二、监控指标体系(Metrics)
2.1 指标分层
业务层:订单量、GMV、转化率、DAU
应用层:QPS、延迟、错误率、JVM 指标
中间件:MQ 积压、DB 连接、缓存命中率
系统层:CPU、内存、磁盘、网络
基础设施:云产品指标(SLB QPS、RDS CPU)
2.2 四大黄金指标(Google SRE)
- Latency 延迟
- Traffic 流量
- Errors 错误
- Saturation 饱和度
2.3 Prometheus 核心概念
| 概念 | 说明 |
|---|---|
| Target | 被抓取对象(/metrics 接口) |
| Metric | 指标,有 name + labels |
| Sample | 时序数据点(timestamp, value) |
| Series | 一组(metric + labels)组合的时序 |
| Scrape | Prometheus 主动抓取 |
| Exporter | 将非原生应用指标转成 Prom 格式(node_exporter、mysql_exporter) |
2.4 指标类型
- Counter:累计计数(只增不减),如请求总数
- Gauge:瞬时值,可增可减,如内存使用
- Histogram:分桶统计,可算分位数(客户端预定义桶)
- Summary:客户端算分位数(不推荐,聚合不友好)
2.5 PromQL 实战
# QPS(5 分钟速率)
rate(http_requests_total[5m])
# 错误率
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))
# P99 延迟
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
# 按服务分组的 P99
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service))
# CPU 使用率
100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 内存使用率
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
# Top 5 耗内存 Pod
topk(5, sum(container_memory_working_set_bytes{namespace="prod"}) by (pod))
# 同比(昨天同时段对比)
rate(http_requests_total[5m])
/ rate(http_requests_total[5m] offset 1d)
2.6 Prometheus 生产架构
- 单机:< 100 万 series 可扛
- 分片:按服务/业务拆多实例(hashmod)
- 联邦:上层 Prom 聚合下层
- 远程存储:Thanos / VictoriaMetrics / ARMS Prometheus / Mimir(长期存储 + 跨集群查询)
阿里云 ARMS Prometheus:
- 全托管,自动采集 ACK 集群指标
- 兼容开源 PromQL 和 Grafana
- 数据保留 15 月起
- 大规模场景性能优于自建
三、日志体系(Logs)
3.1 SLS(日志服务)
阿里云日志平台标杆产品,整个阿里内部也用它(原名 Loghub)。
核心能力:
- LogHub:采集(Logtail/API/SDK),秒级入库
- LogSearch:查询分析(自研 SQL,索引秒级)
- LogShipper:投递到 OSS/MaxCompute
- Data Transform:实时 ETL、富化、脱敏
- 告警 + AI 异常检测
3.2 Logtail 采集模式
- 极简模式:单行文本
- 正则模式:按正则分字段
- 分隔符模式:CSV/TSV
- JSON 模式:JSON 自动解析字段
- 容器模式:按容器 Label/环境变量 过滤
Logtail 资源消耗低(单机 CPU < 5%),比 Filebeat/Fluentd 更省。
3.3 日志规范(生产必做)
必含字段:
- timestamp(纳秒精度)
- level(INFO/WARN/ERROR)
- service_name
- traceId / spanId(关联链路)
- userId / orderId(业务维度,按需)
- message
- 堆栈(ERROR 级别必带)
格式:JSON(便于结构化查询)
等级规范:
- DEBUG:生产关闭
- INFO:关键业务动作
- WARN:可恢复异常
- ERROR:需告警的错误
3.4 SLS 查询示例
-- 最近 1 小时错误日志 top 10 按服务
* AND level:ERROR
| SELECT service_name, COUNT(*) as cnt
GROUP BY service_name
ORDER BY cnt DESC
LIMIT 10
-- 延迟分位数
* | SELECT
approx_percentile(latency_ms, 0.50) as p50,
approx_percentile(latency_ms, 0.99) as p99,
approx_percentile(latency_ms, 0.999) as p999
-- 按 traceId 串联全链路
traceId:"abc123"
-- 同比环比
* | SELECT
count_if(event_time > now() - interval '5' minute) as now_cnt,
count_if(event_time between now() - interval '10' minute
and now() - interval '5' minute) as prev_cnt
3.5 成本治理
日志最容易爆预算的地方。
- 采样:DEBUG/INFO 按 1%-10% 采样,ERROR 100% 留
- 冷热分离:3 天热数据索引,30 天冷数据只存(投递 OSS)
- 字段索引:只给高频查询字段建索引(索引流量也收费)
- 压缩存储:SLS 默认已压缩
- 日志分级 Project:核心业务独立 project,降级可单独处理
四、链路追踪(Tracing)
4.1 核心概念
- Trace:一次完整请求
- Span:Trace 中的一个调用片段(有 parent/child 关系)
- TraceId / SpanId:标识,全链路透传
- Baggage:跨 Span 传递的业务字段
4.2 追踪协议
- OpenTelemetry(OTel):CNCF 毕业,新事实标准
- OpenTracing(已合并入 OTel)
- Jaeger / Zipkin 格式:存储格式
- W3C Trace Context:HTTP Header 标准(
traceparent/tracestate)
4.3 ARMS 应用监控
阿里云托管 APM,核心能力:
- 自动埋点:Java Agent 无侵入接入,Node.js/Python/Go 也支持
- 全链路视图:微服务调用拓扑
- 慢 SQL / 慢接口自动采集
- 异常诊断:自动关联 JVM 指标、线程池、GC
- 业务监控:注解式埋点
ARMS 和开源对比:
- 优势:托管、与 SLS/Prometheus 深度集成、AI 诊断
- 劣势:成本比开源 SkyWalking 高
4.4 采样策略
全量采样成本爆炸,需要采样:
- 头部采样:入口随机 1% 保留 trace
- 尾部采样:先全收,根据 trace 最终状态(错/慢)决定保留
- 分层采样:错误 100%、慢请求 100%、正常 1%
- 业务关键路径:核心交易 100%,非核心 1%
4.5 追踪与日志联动(黄金场景)
告警触发 → 打开 ARMS 慢调用列表 → 点到一个 trace → 看到某个 Span 慢
→ 右键跳到 SLS 过滤该 traceId 看日志细节 → 定位业务代码
→ 看 Prometheus 该时间段该节点 CPU → 确认是否资源压力
能讲出这套组合拳,面试加分很多。
五、告警体系
5.1 告警分级
| 级别 | 响应 | 通道 |
|---|---|---|
| P0 | 立刻响应(5 分钟) | 电话 + 短信 + 群 |
| P1 | 30 分钟响应 | 短信 + 群 |
| P2 | 工时内响应 | 群 + 邮件 |
| P3 | 日报汇总 | 邮件 |
5.2 告警设计原则
- 可操作:每条告警必须有对应 Runbook
- 不重复:合并关联告警,抑制下游告警
- 不漏报:关键指标双通道告警
- 不误报:定期 review,误报率 > 20% 必须优化
5.3 常见告警模式
- 阈值告警:简单,适合稳定基线
- 同比/环比:消除周期性
- 趋势预测:线性回归预测到达阈值
- 异常检测(AI):ARMS/SLS 内置智能异常检测(3σ/移动平均/Prophet)
- 日志告警:ERROR 日志激增
- 多指标联合:A 且 B 才告警
5.4 告警风暴抑制
- 分组:同服务/同集群告警合并
- 静默:变更窗口、已知故障抑制
- 依赖抑制:根因告警抑制派生告警
- 冷却:同告警 N 分钟内不重复发
- 智能降噪:AIOps 合并关联告警
六、eBPF 可观测(前沿)
6.1 为什么 eBPF
- 零侵入:不改应用代码
- 全栈覆盖:从内核到应用
- 低性能损耗:内核态执行
6.2 产品
- Cilium Hubble:网络流量可视化
- Pixie:K8s 全栈可观测
- Parca:持续 profiling
- 阿里云 SysOM:基于 eBPF 的系统诊断
七、成本与落地策略
7.1 成本优先级
通常监控成本占整体云成本 5-10%,过高需要治理。
- 指标:控制 series 数量(label 基数爆炸是头号杀手)
- 日志:采样、冷热分层
- 链路:尾部采样
- 存储:长期低频数据下沉 OSS
7.2 Label 基数爆炸反面教材
❌ 把 userId 作为 label:百万级 series 炸库
❌ 把完整 URL 作为 label:URL 无穷多
✅ URL path 模板(/api/users/:id)
✅ 业务维度放到日志,不放指标
7.3 落地路线图(新团队)
- M1(1 月):节点 + K8s 基础指标(ARMS Prometheus)+ 日志接入 SLS
- M2:应用 APM 接入 ARMS,关键服务 SLO 看板
- M3:告警体系分级、Runbook 初版
- M4:链路追踪 + 日志联动,根因分析流程化
- M5:成本治理 + AIOps 降噪
- M6:混沌工程 + 故障演练,验证可观测覆盖度
八、面试高频问答
Q1:Prometheus 怎么做高可用? A:
- 本地:两台 Prom 同时抓取同一套 target,前面挂 Alertmanager 集群做去重告警
- 长期存储:Thanos Sidecar 上传块到 OSS,Thanos Query 聚合查询
- 跨集群:ARMS Prometheus 或 Thanos Query 联邦
Q2:为什么 Histogram 比 Summary 好? A:
- Summary 在客户端算分位数,多副本无法合并(分位数不可加)
- Histogram 服务端算(
histogram_quantile),可跨实例聚合 - 缺点:Histogram 精度取决于桶划分,要合理设置
Q3:SLS 和 ELK 怎么选? A:
- SLS 优势:全托管、成本低(小规模)、秒级写入、查询快、与阿里云深度集成、大规模免运维
- ELK 优势:开源可控、本地部署、生态丰富
- 建议:阿里云环境 SLS 为主,跨云/本地 IDC 混合用 ELK
Q4:链路追踪怎么在老 Java 系统接入? A:
- 无侵入方案:ARMS Java Agent(
-javaagent)或 SkyWalking Agent - 自动埋点常见框架(Spring/Dubbo/HTTP Client/JDBC/Redis)
- 自定义埋点:OpenTelemetry SDK 注解
- 坑:Agent 版本兼容、异步线程 TraceId 透传(需用 MDC + 包装 Runnable)
Q5:告警总是太多怎么办? A:结构化治理:
- Review 历史告警:Top N 噪声源
- 调阈值:基于历史数据 P99 值 +buffer
- 合并告警:按服务/集群聚合
- 分级:真正要叫人的才 P0/P1
- 自愈:能自动处理的闭环(磁盘清理、重启)
- 看板替代:趋势类关注放大盘,不必告警
Q6:怎么监控微服务之间的依赖健康? A:
- 链路追踪:ARMS 自动画服务拓扑
- 服务网格层:Istio/ASM 提供 request_duration、error_rate 分服务
- SLO 看板:每个服务独立 SLO 页面
- 变更关联:监控面板叠加发布事件
Q7:指标数据保留多久合适? A:
- 实时指标(秒级):7-14 天
- 5 分钟降采样:3-6 月
- 1 小时降采样:1-3 年
- 成本和价值权衡,历史趋势分析用低精度足够
Q8:应用 OOM 了怎么定位? A:
- 日志:SLS 找 OOM 关键字(
OutOfMemoryError、dmesgOOM killer) - 指标:Prometheus 看 JVM old 区增长趋势
- Heap dump:应用配
-XX:+HeapDumpOnOutOfMemoryError自动落盘 - 链路:看 OOM 前相关请求(是否有超大返回/批量查询)
- 持续 profiling:Parca/pyroscope 捕捉内存分配热点
Q9:怎么设计一个高价值 SLO 看板? A:
- 最上层:业务成功率、延迟、量(老板看)
- 中层:依赖服务调用健康(按下游分)
- 底层:基础设施(CPU/内存/网络/依赖中间件)
- 右侧:变更事件时间线(发布、配置变更)
- 交互:下钻能力,从业务指标点到服务点到实例
Q10:ARMS 和 Prometheus 的关系? A:
- ARMS Prometheus:托管 Prom 服务,协议兼容开源
- ARMS 应用监控:独立 APM 产品(链路追踪 + 应用指标 + 诊断)
- ARMS 前端监控 / 小程序:端侧
- 生产推荐组合:ARMS Prometheus(指标) + SLS(日志) + ARMS APM(链路)
九、必读资源
- 《Observability Engineering》Charity Majors
- OpenTelemetry 官方文档
- Google SRE Book Ch6 监控
- 阿里云 SLS / ARMS / Prometheus 产品文档