← 返回 FDE 培养总览 FDE 培养 · 知识点深化 · 可观测性
知识点深化 · 可观测性

可观测性:日志(ELK)、指标(Prometheus+Grafana)、链路追踪(Jaeger)

线上出问题,用户先报障,你才发现——这叫"盲人骑瞎马"。可观测性就是让你不登录服务器也能知道系统健康度。它有三大支柱:日志(发生了什么事)、指标(数字趋势)、链路追踪(一个请求跨服务卡在哪)。这一页把三件套讲清楚。

① 小白第一课怎么学(4 步走,约 80 分钟)

先搞懂三大支柱各自回答什么问题,别一上来就搭 ELK。

1分清三支柱(15 分钟)
读②③:日志=事件、指标=数值、链路=请求路径。
2搭指标栈(20 分钟)
读④:Prometheus 拉指标 + Grafana 画图,最常用。
3看一个真实排错(30 分钟)
跟着⑤用指标+日志定位慢请求。
4排错+刷题(15 分钟)
读⑥告警/采样坑,做⑦⑩。
本课小目标学完你要能:① 说清日志/指标/链路各自解决什么;② 读懂 PromQL 基本查询;③ 知道一条告警怎么配;④ 用 trace 找到跨服务慢在哪。

② 一图看懂:可观测性三大支柱

可观测性 日志 Logs 发生了什么(ELK/Loki) 指标 Metrics 数字趋势(Prom+Grafana) 链路 Trace 请求路径(Jaeger) 告警 Alerting 异常自动通知人 从指标→日志→链路 排错三层钻取 易错:告警太多=没告警 日志没级别乱打
读法:指标告诉你"有问题"(看到 P99 飙高),日志告诉你"具体什么错"(堆栈),链路告诉你"问题出在哪个服务哪一跳"。三层配合排错。

③ 本质直觉:给系统装"神经系统"

一个线上服务由几十个实例、十几个微服务组成。出了问题你不可能一台台 ssh 上去看。可观测性就是把所有信息汇聚到一处,远程就能诊断。

日志回答"发生了什么":每一条事件带时间、级别(INFO/WARN/ERROR)、trace id。ELK(Elasticsearch+Logstash+Kibana)或 Loki 负责收集、检索。你想知道"刚才那个订单为什么失败",搜日志。

指标回答"现在怎么样":是数字随时间的曲线——CPU、内存、QPS、错误率、P99 延迟。Prometheus 定时抓取,Grafana 画看板。你一眼看到"错误率从 0.1% 涨到 5%"。

链路追踪回答"卡在哪":一个请求经过网关→服务A→服务B→数据库,trace 把每一跳的耗时记下来串成一条。你看到 P99 慢了,点开 trace 发现是"服务B 调数据库花了 1.8 秒"。

网关 → A(10ms) → B(1800ms!) → DB 指标看板:P99 延迟曲线在涨 日志:ERROR connection timeout 先看指标发现异常 再用 trace 定位到 B→DB 最后翻 B 的日志看具体错
排错三步法指标发现"不好了"→ 链路定位"是哪一段"→ 日志看清"具体报错"。别一上来就翻日志——海量日志里捞问题效率极低。

④ 完整体系:ELK、Prometheus+Grafana、Jaeger

三大栈对照

支柱主流栈存什么查询方式
日志ELK / Loki+Grafana离散文本事件关键词/级别检索
指标Prometheus + Grafana时间序列数字PromQL
链路Jaeger / Tempo请求跨服务调用链按 trace id 查

Prometheus 关键概念

概念说明
Counter只增计数器(如总请求数),用 rate() 算速率
Gauge可增可减的瞬时值(如内存用量、当前排队数)
Histogram分桶统计延迟,算 P95/P99

常用 PromQL

# HTTP 请求 QPS(每秒请求数)
rate(http_requests_total[5m])

# 5xx 错误率
sum(rate(http_requests_total{code=~"5.."}[5m]))
  / sum(rate(http_requests_total[5m]))

# P99 延迟
histogram_quantile(0.99, rate(http_duration_seconds_bucket[5m]))

# CPU 使用率
1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))

告警规则(Prometheus Alertmanager)

groups:
- name: api
  rules:
  - alert: HighErrorRate
    expr: sum(rate(http_requests_total{code=~"5.."}[5m]))
          / sum(rate(http_requests_total[5m])) > 0.02
    for: 2m                 # 持续2分钟才告警,防抖动
    labels: {severity: critical}
    annotations:
      summary: "5xx 错误率超过 2%"

日志规范

生产日志要打 JSON,带 timestamp / level / trace_id / message。级别分层:DEBUG(调试)、INFO(正常流程)、WARN(可疑但没挂)、ERROR(出错了)。别把所有日志都打成 INFO 或 ERROR。

⑤ 用法场景与典型例题

例1(选工具)用户说"下单很慢",你想知道慢在网关、A 服务还是数据库,该看什么?
跨服务定位耗时用链路追踪。
① 看 Grafana 指标确认 P99 延迟确实涨了。
② 打开 Jaeger,找一个慢请求的 trace。
③ 看到各 span 耗时:网关 10ms、A 服务 15ms、B 服务 1800ms、DB 20ms。
④ 瓶颈在 B 服务。
答案:跨服务耗时定位用 Jaeger 链路追踪,不是翻日志。
例2(PromQL)怎么算过去 5 分钟的 5xx 错误率?
5xx 的速率除以总速率。
① 分子:sum(rate(http_requests_total{code=~"5.."}[5m]))。
② 分母:sum(rate(http_requests_total[5m]))。
③ 相除即错误率。
答案:结果大于 0.02(2%)持续 2 分钟就触发 HighErrorRate 告警。
例3(日志级别)用户登录失败,密码错了一行,该打什么级别?
区分业务预期错误和系统故障。
① 密码错是用户操作,不是系统故障。
② 打 WARN 或 INFO,带用户名。
③ 只有"数据库连不上""空指针崩溃"这种才打 ERROR。
答案:别把密码错打 ERROR,否则告警风暴淹没真正的故障。ERROR 要留给真故障。
采样与成本全量链路追踪开销大,生产一般采样 1%~10%(错误请求全采)。日志也按级别采样,别 DEBUG 全量上生产,否则存储爆了。

⑥ 高频错误诊断(4 条)

错误 1:告警太多,人人视而不见这叫"告警疲劳"。把所有指标都配告警=没有告警。只对真正影响用户的 SLI 配告警,加 for 持续时间防抖动,分级(warning 钉钉、critical 电话)。
错误 2:日志不带 trace_id,没法关联一条请求跨多个服务,日志里没有共同的 trace_id,你就拼不出完整路径。网关入口生成 trace_id,全程透传。
错误 3:只监控服务器,不监控用户体验CPU/内存都正常,但 P99 延迟 3 秒,用户已经在骂了。要加业务指标(错误率、延迟、下单成功率),别只盯主机。
错误 4:日志全打 ERROR 或全打 INFO级别失控,Kibana 里无法区分严重程度。严格按规范:预期内用 WARN/INFO,真故障才 ERROR。

⑦ 考点真题演练(4 题)

考点分布

考法出题形式应对
三支柱分工场景选工具日志/指标/链路各管一块
PromQL算错误率/延迟rate + histogram_quantile
告警为什么加 for防抖动
排错顺序慢请求先看啥指标→链路→日志

真题基础1. 想知道一个慢请求在网关、A服务、数据库之间到底哪一跳耗时最多,应该用?

真题中档2. Prometheus 里只增不减的总请求数,叫什么类型?

真题中档3. 告警规则里 for: 2m 的作用是?

真题拔高4. 线上报"下单变慢",正确的排错顺序是?

⑧ 必背命令/知识点卡

三支柱:日志 / 指标 / 链路 发生了什么/现在怎样/卡在哪
日志栈:ELK 或 Loki JSON+trace_id
指标栈:Prometheus 抓 + Grafana 画 PromQL
链路:Jaeger 按 trace id 串起每一跳
算速率:rate(metric[5m]) Counter 必用
算分位:histogram_quantile(0.99, ...) P99
排错:指标发现→链路定位→日志看清 别一上来翻日志

⑨ 应用输出:给一个 Web 服务接好三件套

场景:FastAPI 服务上线,要能看错误率、查日志、追慢请求
① 日志:应用打 JSON 日志(含 trace_id),输出到 stdout,由 Docker/K8s 收集到 Loki。
② 指标:用 prometheus_client 暴露 /metrics,Prometheus 定时抓取;Grafana 看板画 QPS、P99、错误率。
③ 链路:接 OpenTelemetry SDK,上报到 Jaeger;入口生成 trace id 并透传。
④ 告警:配 HighErrorRate(5xx>2% 持续 2 分钟)和 HighLatency(P99>2s)。
⑤ 演练:故意打 503,看 Grafana 错误率变红、告警发钉钉、Jaeger 能搜到这条慢 trace。
口述搭建思路"应用埋点打指标和结构化日志,Prometheus 抓取、Grafana 看板、Jaeger 追链路,告警盯 SLI;出问题按指标→链路→日志三层钻取。"

⑩ 分层练习 15 题(基础 5 + 中档 5 + 拔高 5)

▍基础 5 题

基础1可观测性三大支柱是?
日志、指标、链路追踪。
基础2Grafana 主要用来干嘛?
把 Prometheus 的指标画成看板图表。
基础3Prometheus 用什么语言查询?
PromQL。
基础4日志级别 ERROR 用来记什么?
真正的系统故障,不是用户操作错误。
基础5Jaeger 是哪一类工具?
链路追踪工具。

▍中档 5 题

中档6Counter 和 Gauge 的区别?
Counter 只增(总请求数);Gauge 可增可减(当前内存)。
中档7怎么算 P99 延迟?
histogram_quantile(0.99, rate(http_duration_bucket[5m]))。
中档8为什么日志要带 trace_id?
把一次请求跨多服务的日志串起来,方便关联排查。
中档9"告警疲劳"是什么?怎么避免?
告警太多导致人人忽略。只对影响用户的 SLI 告警、加 for 防抖动、分级通知。
中档10为什么不能只监控 CPU/内存?
资源正常不代表用户体验好,要加错误率、延迟、业务成功率等用户视角指标。

▍拔高 5 题

拔高11rate() 为什么要加时间窗口?
Counter 是累计值,必须除以时间窗口才得到每秒速率;[5m] 表示过去 5 分钟平均。
拔高12生产链路追踪为什么要采样?
全量 trace 开销和存储巨大。按比例采样,错误请求全采,正常请求采一小部分。
拔高13告警分 warning 和 critical 怎么落地?
warning 发群消息/工单,critical 电话/短信 oncall,避免小事半夜吵醒人。
拔高14日志为什么推荐 JSON 格式?
机器可解析、可按字段检索;纯文本(如"user 123 login fail")不好结构化过滤。
拔高15指标都正常但用户报错,可能漏了什么?
可能漏了业务指标(如下单成功率、支付成功率),或漏了下游依赖(第三方接口)监控。

⑪ 记忆口诀 + 7 天复习计划

三句口诀 ① 日志记事、指标看趋势、链路找卡点。
② Prometheus 抓数 Grafana 画图,PromQL 算率和分位。
③ 排错先指标后链路再日志,告警要精不要多。
天任务自检
第 1 天读②③,分清三支柱能各举一例
第 2 天背知识点卡 + 做基础 1-5基础全对
第 3 天读 PromQL,手写错误率和 P99PromQL 写对
第 4 天做中档 6-10,配一条告警规则会加 for
第 5 天做拔高 11-15 + 真题 4 题会三层排错
第 6-7 天口述排错三步法,默写三支柱分工不看资料全默对

← 返回 FDE 培养总览