想象你家小区门口有一家叫“云朵奶茶店”的小店。顾客点单后最怕的不是奶茶不好喝,而是等太久。店长为了留住客人,在外卖平台承诺:“出杯超过15分钟,这单免单。”这句白纸黑字的承诺,就是SLA。为了让承诺不落空,店长又给自己定了内部标准:“95%的订单要在5分钟内做好。”这就是SLO。而收银台电子屏上实时滚动的每笔订单耗时、每天免单数、高峰期排队长度,就是SLI。 云原生世界里的服务,和这家奶茶店没什么两样。微服务之间互相调用、互相“点单”,谁也不能保证自己永远不出错。可观测性平台就像那面电子屏,帮我们把服务的“出杯时长”“免单次数”实时采集并展示出来。本文要讲的,就是如何在这面大屏上,把SLO、SLI、错误预算、SLA合规报告这些概念真正落地成一套工程体系,让平台不仅能“看见”故障,还能“管理”可靠性。
对AI从业者来说,SLO工程是云原生可观测性的核心闭环:它把抽象的可靠性变成可测量、可预警、可问责的工程指标,是SRE和平台架构师最核心的职业技能之一。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
SLO基础概念
云朵奶茶店的外卖台贴着一张字条:“出杯超过15分钟,这单免单。”这是店长和顾客之间的合同,也就是SLA。但店长知道,真要等客户抱怨才免单就晚了,于是给店员定了内部要求:“100单里至少95单要在5分钟内出杯。”这个内部要求,就是SLO。而收银台上那把记着每一单制作秒数的电子计时器,就是SLI——它把“承诺”变成了“数字”。
把视角从奶茶店搬到云原生环境:一个订单中心服务要调用库存、支付、积分三个下游服务,每个下游都可能变慢。对运维团队来说,SLA往往写在与客户的合同里,而真正每天驱动研发行为的,是内部定义的SLO。SLO背后必须有一个可采集的SLI,否则“目标”就是空中楼阁。
SLI的经典定义是“好事件占全部事件的比率”。对HTTP服务来说,最朴素的SLI就是请求成功率——把2xx和3xx当作好事件,把4xx、5xx以及超时统统算作坏事件。
这个比值越高,说明“顾客拿到奶茶”的概率越大。SLA、SLO、SLI三者环环相扣:SLA是外卖平台上的白纸黑字,SLO是店里的操作标准,SLI则是墙上那块让所有人都看得见的仪表屏。没有SLI,SLO只是口号;没有SLO,SLA就成了赌运气。
- 统计分母(全部请求)在观测时间窗口内,系统收到的所有有效请求数,相当于奶茶店一整天接下的全部订单。
- 统计分子(好请求)凡是顺利返回2xx或3xx状态的请求,都算作“好订单”。
- 求出比值用成功数除以总数,得到观测窗口内服务的可靠程度。
SLI指标设计
云朵奶茶店的店长发现,只看“平均出杯时间”很容易骗人:上午10分钟出一杯,下午2分钟出一杯,平均下来6分钟,好像还不错,可上午排队的顾客早就骂街了。于是他给电子屏加了一条横线——5分钟阈值,凡是超过这条线的订单都被标记为“慢单”。
在云原生可观测性领域,这条“横线”就是SLI的设计核心。Google SRE 经典著作提出的“四个黄金信号”给了我们一个很好的起点:延迟(请求有多慢)、流量(请求有多少)、错误(请求失败了多少)、饱和度(服务快满了吗)。但并非每个指标都适合直接作为SLI,设计SLI的关键在于“用户视角”:用户并不关心CPU是否90%,用户只关心页面能不能在2秒内打开。
以时延SLI为例,我们需要先定义“多快算快”,然后统计所有请求中达到这个标准的比例:
每个黄金信号都有适合自己的SLI形态:成功率反映“能不能用”,时延反映“用得快不快”,饱和度反映“还能撑多久”。设计SLI最怕“指标太多而没有重点”,就像奶茶店如果同时盯温度、湿度、牛奶保质期,反而会忽略顾客最关心的出杯速度。只挑几个与用户体感强相关的指标,才能让大屏真正指导行动。
- 确定时延阈值定义用户可接受的最长响应时间,超过就算“品质不达标”。
- 统计达标请求数通过链路追踪和指标直方图,统计响应时间小于等于阈值的请求数量。
- 除以总请求数将达标请求数与窗口内全部请求数相除,得到时延维度的SLI。
SLO制定方法
店长想给外卖平台写新承诺:“99%的订单5分钟内出杯!”店员们立刻抗议:晚高峰奶茶机只有一台,怎么可能?店长于是翻出过去28天的出杯记录,算出高峰期实际只有92%能在5分钟内完成。最终他把SLO定为95%,留出5%的“犯错空间”。这个从数据出发定目标的方法,就是基线数据法。
制定SLO不能拍脑袋。首先应该明确“从谁的视角看”:是用户体感、还是系统内部的健康?显然应该选用户体感。其次是看基线数据:至少采集一到两个星期的历史SLI,了解正常波动范围,再定一个“跳一跳够得着”的目标。最后一定要给错误预算留出空间——SLO越接近100%,需要投入的冗余成本就越高,甚至呈指数增长。
在可观测性平台上,SLO通常表达为“在统计窗口内,SLI达标的时间占比不低于某个百分比”。从时间维度看:
SLO不是越高越好,也不是越低越省事。定得太高,团队会为了虚无的“五个九”疲于奔命;定得太低,用户体感又会变差。用基线数据定目标,就像店长先看28天流水再决定“95%”:既有依据,又有余量,还让所有人服气。
- 确定统计窗口定义SLO的观测周期,通常是28天或一个月。
- 统计不可用时间汇总窗口内所有SLO不达标的时间片段,例如超时、5xx、连接失败累积的时长。
- 计算可用占比用总时长减去不可用时长,再除以总时长,得到SLO达标率。
错误预算管理
既然SLO承诺“95%的订单5分钟内出杯”,那就意味着还有5%的订单可以“犯错”。云朵奶茶店的店长把这5%换算成每月可以超时的订单数,存进一个“犯错额度罐子”。这个罐子,就是错误预算。只要罐子里还有余额,团队就可以安心迭代;一旦罐子快空了,大家就得放下新功能,专心修稳定性。
错误预算的伟大之处,在于它把“可靠性”变成了可消费的资源。产品和研发经常因为“要不要发版”吵架,错误预算是双方都认可的裁判:预算充足就发,预算耗尽就冻结。计算方式也很简单:
更进一步,我们还要关注消耗速率:错误预算不是“月底才看总量”,而是按小时追踪“烧钱速度”。如果预算在一个小时内就烧掉一半,哪怕余额还有30%,也必须立即预警。预算是静态的存量,消耗速率才是动态的风险信号。把这个信号接进告警平台,才能真正实现“烧到多少、采取什么行动”的自动化管理。
- 算出错误率余量用1减去SLO目标,得到允许出错的比例。
- 乘以总请求数把允许出错的比例乘到统计窗口内的总请求数上,得到可容忍的失败次数。
- 实时扣减每一次失败请求都从错误预算中扣掉,余额趋近于零时触发告警。
可观测性集成
云朵奶茶店的店长把电子计时器、外卖平台的差评记录、高峰期的排队摄像头全部接到一台总控电脑上。每个数据源都按约定每秒上报一次,大屏上实时滚动:今日订单量、超时单数、错误预算余额。这就是把SLI集成进可观测性平台的过程。
在云原生环境里,SLI自动采集通常依赖“埋点 + 指标协议 + 数据管线”三部曲。服务通过Prometheus SDK或OpenTelemetry埋点暴露指标,监控系统按固定间隔抓取,再经过聚合层处理后存入时序数据库,最终由Grafana等工具展示。为了让聚合结果稳定,我们常用滑动窗口计算平均SLI:
采集层要看“准”,计算层要看“稳”,展示层要看“懂”。SDK上报延迟、指标缺失、采样不全都会让SLI失真。架构设计上还得考虑数据管线的容灾:监控系统本身挂了怎么办?采集端点是不是单点?这些看似琐碎的问题,决定了大屏上的数字是否值得信任。店长也明白,计时器坏了,所谓的“95%达标”就只是一块好看的黑板。
- 切分时间窗口以分钟或小时为单位切分观测窗口,每个窗口独立记录。
- 统计每个窗口的好事件在每个窗口内分别累计成功请求数。
- 汇总所有窗口把全部窗口的成功数相加,除以总请求数,得到聚合SLI。
SLA合规报告
月底到了,云朵奶茶店的外卖平台给店长发来一张对账单:本月总订单12800单,超时免单213单,履约率98.3%,低于合同约定的99%,按规则需要赔付平台违约金。店长一点不慌,因为他手里的总控电脑也自动生成了同样一张报告,数据一分不差。这就是SLA合规报告。
在企业级平台中,SLA合规报告必须是自动生成、口径一致、可审计的。所谓合规计算口径,就是明确“哪些时长算故障时长、哪些算免责时长”。比如云厂商的SLA通常会把“客户维护窗口”“不可抗力”排除在外。报告的生成机制要可复现:任何人拿同一批原始数据,都能算出同一个结论。月度可用性公式如下:
SLA报告不仅是“对账”,更是改善依据。如果连续几个月可用性都在合同线上挣扎,说明SLO的设定或资源投入出了系统性问题。审计留痕同样重要:每条告警、每次故障恢复、每一笔扣减都要有日志可追溯。就像店长会保存每一张免单小票,平台的SLA报告背后,也需要一套完整的审计追踪链路。
- 汇总故障时长把本月所有SLA故障单的持续时间累加,得到扣减时长。
- 确定月度总时长以自然月为分母,通常按30天计算。
- 计算可用性百分比用总时长减去扣减时长,再除以总时长,得到月可用性。
AIOps智能运营
店长发现,光靠人盯大屏总会慢半拍:等看到错误预算跌到10%时,其实一天前就该启动备料了。于是他给总控电脑加了个“智能店员”——它能根据订单趋势预测明天的出杯压力,自动提醒店长提前安排兼职员工。这个“智能店员”,就是AIOps。
AIOps在SLO工程中的价值主要体现在三件事:异常自动识别、消耗趋势预测、根因智能定位。传统监控靠固定阈值告警,而AIOps会用历史数据学习SLI的正常波动模式,在异常刚露头时发出信号。对于错误预算这类带时间序列特征的指标,常用指数平滑模型进行预测:
AIOps不是要替代SRE,而是帮SRE在故障发生前“多想一步”。当AIOps识别错误预算消耗速率异常时,会自动触发告警并推荐可能的根因(例如最近变更的版本、异常的中间件指标)。这些推荐不会直接发版,而是进入值班人员的工作流。智能店员再聪明,最终拍板的还是店长本人——人机协同,才是AIOps落地的最佳姿势。
- 获取当前观测值记录本时间窗口的SLI真实值。
- 取出上次预测值拿到上一个窗口对本次的预测结果。
- 加权融合用平滑系数α把真实值和预测值组合起来,得到对下一个窗口的预测。
工程实践落地
最后一步,是把以上所有能力固化为一套可重复的运作流程。云朵奶茶店的店长把总控电脑变成了“运营中台”:每天早会看一眼错误预算余额,每周复盘一次SLI趋势,每月自动生成SLA合规报告;系统一旦判定预算消耗过快,自动冻结新口味上架,直到稳定性恢复。
工程实践落地包含两个层面。第一是平台架构:采集层负责SLI自动采集,计算层负责SLO聚合与错误预算核算,展示层提供看板和报告,告警层负责多级通知与发布门禁。第二是流程规范:告警要有分级响应,值班要有交接机制,SLO要定期评审优化。流程和工具缺一不可,否则再漂亮的看板也只是摆设。发布门禁的逻辑可以用一个判据表达:
SLO工程是一个不断进化的闭环:上线看板、暴露问题、改进架构、优化目标、再上线更准的看板。很多团队一开始只有“一个Grafana面板”,但坚持跑几个月后,就会自然生长出告警规范、变更审批、故障复盘等完整机制。就像奶茶店从“一块电子屏”慢慢变成“运营中台”,SLO工程实践的本质,是把可靠性从个人英雄主义变成组织能力。
- 计算当前燃烧率统计当前时间窗口内错误预算的消耗速度。
- 设定容忍乘数根据业务风险确定一个容忍系数k,通常是1到2之间。
- 比较并触发告警当燃烧率超过容忍上限时,指示函数取值为1,触发告警和发布冻结。
AI 应用场景
电商大促SLO全景看板
阶段:数据采集与可视化
解决的问题:大促期间流量是日常的10倍,传统监控只显示CPU和内存,无法反映“用户下单到底成不成功”。通过SLI自动采集下单链路的成功率与时延,构建SLO看板,让技术负责人一屏看清“错误预算还剩多少”。
具体案例:某电商平台在双11前为“下单-支付”核心链路制定了99.95%的SLO,并在可观测性平台上接入全链路埋点。大促开始后,SLI看板显示支付成功率从99.98%掉到99.90%,错误预算加速消耗,系统自动触发告警并定位到支付网关超时,运维立即扩容,半小时后指标恢复。
音视频直播卡顿SLO治理
阶段:异常检测与根因定位
解决的问题:直播业务的用户体验痛点是卡顿率,但传统监控只看服务器端码率,无法感知用户端的真实播放质量。通过端上SDK上报播放器事件,将“卡顿率”定义为SLI,并设定SLO目标。
具体案例:某直播平台在可观测性平台中集成了播放器埋点,实时计算首帧时长和卡顿时长占比。当某省用户卡顿率SLO连续10分钟超出目标时,AIOps自动识别出是该省CDN节点异常,自动切换流量到邻近节点,卡顿率恢复,SLA报告月底自动生成并提交给内容合作方。
金融支付链路发布门禁
阶段:自动化决策与流程管控
解决的问题:金融系统对稳定性要求极高,每次发版都像在刀尖上跳舞。将错误预算与CI/CD流水线集成,当错误预算消耗过快时自动阻断发布,从机制上保证“不稳不发”。
具体案例:某支付平台为核心转账链路设定99.99%的SLO,错误预算每季度约5.2分钟消耗额度。某次版本发布后错误预算燃烧率突然飙升至3倍,流水线自动回滚新版本,并通知值班SRE定位到慢SQL问题,避免了大规模故障。
Python 演示
import random class ErrorBudgetMonitor: def __init__(self, slo=0.99, total_requests=10000): self.slo = slo self.total_requests = total_requests self.error_budget = int((1 - slo) * total_requests) self.fail_count = 0 self.req_count = 0 def record(self, success): self.req_count += 1 if not success: self.fail_count += 1 return self.remaining() def remaining(self): return max(0, self.error_budget - self.fail_count) def burn_rate(self): if self.req_count == 0: return 0.0 actual_error_rate = self.fail_count / self.req_count allowed_error_rate = 1 - self.slo return actual_error_rate / allowed_error_rate def should_freeze(self): return self.remaining() == 0 def simulate(): monitor = ErrorBudgetMonitor(slo=0.99, total_requests=10000) for minute in range(30): peak = 10 <= minute <= 20 request_count = int(200 * 1.5 if peak else 200) for _ in range(request_count): success = random.random() < 0.99 monitor.record(success) freeze = "FREEZE" if monitor.should_freeze() else "OK" print("minute", minute, "remaining", monitor.remaining(), "burn_rate", round(monitor.burn_rate(), 2), freeze) if __name__ == "__main__": simulate()
self.error_budget = int((1 - slo) * total_requests)把SLO的允许错误率换算成可容忍的失败请求次数,这是整个监控器的“总钱袋子”。self.fail_count` / `self.req_count分别累计失败请求和总请求,用于实时计算当前SLI。def record(self, success)每来一个请求就记录一次,成功与否会更新内部计数器,并返回最新剩余预算。def remaining(self)用初始错误预算减去已失败数,得到当前“还能错多少次”的余额。def burn_rate(self)用当前实际错误率除以允许错误率,大于1说明错误预算消耗过快,风险极高。def should_freeze(self)余额归零时返回True,模拟发布门禁的“冻结”决策。peak = 10 <= minute <= 20模拟大促高峰,高峰期的请求量放大1.5倍,让错误预算消耗加速更加真实。random.random() < 0.99用随机数模拟每个请求是否成功,实际线上会替换为真实的SLI上报数据。
常见误区
误区把SLO定到99.999%才能体现团队水平,反正监控看板上数字越接近100%越好看,系统挂了再修复就行。
正解SLO越高,需要的冗余成本越高。从99.9%提升到99.99%,往往要付出几倍的机器和架构复杂度。就像奶茶店承诺“100%五分钟出杯”,那就得在深夜也保留5个店员——这显然不划算。SLO应该是业务成本与用户体验之间的平衡点,而不是工程师的“面子工程”。
为何常见:很多人把SLO当成一个“荣誉指标”,以为定得越高越显得可靠,却忽略了可靠性背后是实打实的成本投入。
误区SLA就是SLO,反正都是承诺服务可用性的数字,跟客户签合同的时候直接写“可用性99.9%”就行了。
正解SLA是与客户签订的合同,包含赔偿条款;SLO是团队内部给自己定的目标,通常比SLA更严格,或者与SLA挂钩但没有法律效力。一个服务可以在没有SLA的情况下运行,但内部SLO是驱动研发改进的核心机制。就像奶茶店的“免单承诺”是SLA,而店内的“95%出杯目标”是SLO,两者不能混为一谈。
为何常见:因为它们都是描述“服务可靠程度”的百分比,初学者容易把“合同”和“目标”画上等号。
误区错误预算月底看一眼就行,平时只要SLI看板还是绿色,就不用管它;反正预算没归零就能继续发版。
正解错误预算是“存量”,消耗速率才是“风险”。如果预算在一小时内烧掉了50%,即使余额还有20%,也必须立刻停止发布并排查。就像你银行卡里还有3000元,但刚买的理财产品一小时就亏了一半——正常的判断肯定是马上止损,而不是等下个月再看账单。
为何常见:人脑天然关注“还剩多少”而不是“消耗多快”,而SLO工程恰恰强调用速率类指标提前预警,不能等到归零才响应。
误区把服务日志里的所有HTTP请求都拿来做SLI统计,包括健康检查探针、爬虫流量、内部调试请求,认为这样最“全面准确”。
正解SLI的目的是反映真实用户体验,健康检查、爬虫、内网调试请求都会污染指标。正确做法是过滤掉非用户流量,从用户可感知的入口定义“好请求”。就像统计“出杯时间”时,不能把店员自己试做的奶茶也算进去,否则数据再大也不代表顾客的真实感受。
为何常见:采集日志时“全量收集”是运维习惯,但SLI是用户视角指标,需要刻意筛选,两者目标不同。
误区只要把SLO看板挂到办公室大屏幕上,团队就会自动重视稳定性,故障也没那么多了。
正解看板只是“看到问题”,SLO工程的价值在于“闭环管理”:告警响应、值班流程、发布门禁、定期复盘缺一不可。没有流程配合,看板上的红色告警只会被大家看习惯,变成“狼来了”的背景板。
为何常见:工具建设是可见的、容易的,而流程变革是缓慢的、需要组织推动的,人们倾向于用工具的努力掩盖流程的缺失。
面试题
Q1. 在SLA、SLO、SLI三者中,哪一个是对外的正式服务合同?
- A.衡量服务质量的指标
- B.服务方承诺达到的目标
- C.双方签订的服务合同← 正确答案
- D.用于计算赔偿的额度
答案:C。SLA(Service Level Agreement)是服务方与客户之间签订的合同,包含可用性要求和赔偿条款;SLO是内部目标,SLI是具体指标。故选C。
Q2. 下列哪组指标最适合作为“用户能否正常访问服务”的SLI?
- A.数据库连接池空闲数
- B.服务器CPU使用率
- C.请求成功率与时延← 正确答案
- D.磁盘剩余容量大小
答案:C。SLI应从用户体验视角定义,请求成功率反映“能用吗”,时延反映“快不快”,两者是核心。CPU、磁盘是系统内部指标,与用户体感不是直接对应关系。
Q3. 以下哪些属于Google SRE提出的“四个黄金信号”?
- A.延迟← 正确答案
- B.流量← 正确答案
- C.错误← 正确答案
- D.成本
答案:ABC。四个黄金信号是延迟、流量、错误、饱和度。成本不是黄金信号,它是成本管理范畴的指标,不直接描述系统是否健康。
Q4. 错误预算的计算方式通常是什么?
- A.总请求数乘以一减SLO← 正确答案
- B.总请求数乘上SLO值
- C.总请求数乘上SLA值
- D.失败请求数除以总请求数
答案:A。错误预算 = (1 - SLO) × 总请求数。它把“允许出错的比例”转换成“可容忍的失败次数”,是SLO管理的基础。D是SLI的公式,B和C理解有误。
Q5. 设计SLI指标时,最关键的原则是什么?
- A.优先考虑服务器视角
- B.从用户体验视角定义← 正确答案
- C.指标采集越全越好
- D.日志条数越多越好
答案:B。SLI设计的出发点必须是“用户的成功请求占比”,而不是服务器内部状态。采集全面不等于有效,指标要少而精准地反映用户体感。
Q6. 当错误预算耗尽时,团队应该采取哪些合理措施?
- A.暂时冻结新功能发布← 正确答案
- B.加大稳定性修复投入← 正确答案
- C.立即下调SLO目标
- D.忽略错误继续迭代
答案:AB。预算耗尽意味着“可靠性已经被透支”,此时应冻结发布、集中资源修复稳定性。下调SLO是“改合同”而不是“解决问题”,继续迭代会加重风险。
Q7. 当错误预算燃烧率超过SLO容忍值的多倍时,正确的操作是?
- A.继续按原计划发布版本
- B.暂停发布并优先排查根因← 正确答案
- C.只增加服务器资源数量
- D.关闭告警避免打扰值班
答案:B。燃烧率异常说明系统正以远超预期的速度消耗预算,继续发布会加速恶化。正确做法是暂停发布、查根因;只加资源可能掩盖真实问题,关闭告警更是自欺欺人。
Q8. 在可观测性平台中,SLI自动采集通常通过什么方式实现?
- A.链路追踪采样分析
- B.服务埋点加指标抓取← 正确答案
- C.人工填写Excel表格
- D.用户问卷调研反馈
答案:B。标准做法是通过埋点暴露指标,再由Prometheus等服务定期抓取。链路追踪可作为补充分析手段,不能替代标准化指标采集;问卷和手动填报无法满足实时性要求。
Q9. AIOps在SLO工程中可发挥哪些作用?
- A.自动识别告警风暴← 正确答案
- B.预测错误预算消耗← 正确答案
- C.自动定位故障根因← 正确答案
- D.完全替代人工值班
答案:ABC。AIOps可以自动识别异常模式、用时间序列模型预测预算消耗趋势、辅助根因分析。但它不能完全替代人工值班,关键决策仍需SRE确认。
Q10. 某服务SLO为99.9%,某月累计不可用时长90分钟,该月是否满足SLA要求?
- A.满足,因为仅允许43分钟
- B.不满足,因为允许约43分钟← 正确答案
- C.满足,因为尚在144分钟内
- D.无法判断,缺少请求量
答案:B。一个月按30天×1440分钟=43200分钟计算,99.9%的可用性允许43.2分钟不可用。累计90分钟远超43.2分钟,因此不满足SLA要求。D不对,因为可用性百分比本身就可以用时间推算,不需要请求量。