3. SLO 作业模板概述

SLO 作业模板是平台工程团队将服务等级目标(SLO)从抽象概念转化为可执行、可审计、可协作的标准化载体。它并非简单的“填空表格”,而是一套包含元数据、指标定义、合规规则与权限锚点的结构化文档。本节将系统阐述模板的核心作用、通用结构以及元数据字段的设计原则。

3.1 模板的核心作用

在平台工程实践中,SLO 作业模板承担着三重关键职能:

  • 标准化对齐:消除不同业务线对 SLO 理解的歧义,确保所有团队使用统一的格式、指标和评级标准。
  • 自动化驱动:模板中的结构化字段可直接被 CI/CD 流水线、监控系统和审批引擎解析,实现 SLO 的自动注册、校验与告警。
  • 权限锚定:每个模板字段都对应一个权限控制点,平台管理员通过模板定义“谁可以编辑指标阈值”“谁可以修改合规窗口”等细粒度规则。
实践要点:模板设计应遵循“一次定义,多处复用”原则。一个设计良好的 SLO 作业模板,通常能覆盖 80% 以上的通用服务场景,剩余 20% 通过模板继承与字段覆盖机制处理。

3.2 通用结构

一个完整的 SLO 作业模板由四个逻辑层构成,各层之间通过元数据字段建立关联。下图展示了模板的通用结构及其与权限模型的映射关系:

SLO 作业模板通用结构 元数据层 模板ID · 版本号 · 所有者 · 创建时间 · 标签 · 合规等级 指标定义层 SLI 名称 · 数据源 · 聚合方式 · 测量窗口 · 阈值(目标值/预警值) 合规与窗口层 合规窗口类型(滚动/日历) · 错误预算 · 燃烧速率告警 · 排除窗口 权限与审批层 编辑者角色 · 审批流定义 · 审计日志 · 权限继承策略 各层之间的数据流方向:元数据 → 指标定义 → 合规窗口 → 权限审批,下层继承上层的字段约束。

下表详细说明了每个逻辑层包含的核心组件及其在权限模型中的角色:

逻辑层 核心组件 权限控制点 典型角色
元数据层 模板 ID、版本号、所有者、标签 模板创建、版本发布、标签管理 平台管理员、SRE 负责人
指标定义层 SLI 名称、数据源、聚合方式、阈值 指标注册、阈值修改、数据源变更 SRE、服务 Owner
合规与窗口层 合规窗口、错误预算、燃烧速率 窗口配置、预算调整、告警规则 SRE、值班负责人
权限与审批层 编辑者角色、审批流、审计日志 角色绑定、审批节点配置、日志查询 平台管理员、安全审计

3.3 元数据字段设计

元数据字段是模板的“身份证”与“索引键”,直接影响模板的检索效率、版本追溯和权限继承。设计时应遵循以下原则:

  • 唯一性:每个模板必须拥有全局唯一的 ID(如 slo-tpl-{team}-{service}-{version}),避免命名冲突。
  • 可追溯:包含创建者、创建时间、最后修改者、修改原因等审计字段。
  • 可分类:通过标签(Tags)实现多维度分类,例如 tier=critical、team=payment、region=cn。
  • 权限锚定:每个元数据字段都应映射到一个权限资源路径,例如 /templates/{id}/metadata/owner。

元数据字段设计示例(JSON Schema 片段)

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "SLO作业模板元数据",
  "type": "object",
  "required": ["templateId", "version", "owner", "complianceLevel"],
  "properties": {
    "templateId": {
      "type": "string",
      "pattern": "^slo-tpl-[a-z0-9-]+-[0-9]+$",
      "description": "全局唯一模板ID"
    },
    "version": {
      "type": "string",
      "pattern": "^\\d+\\.\\d+\\.\\d+$",
      "description": "语义化版本号"
    },
    "owner": {
      "type": "string",
      "description": "模板所有者(团队或用户ID)"
    },
    "tags": {
      "type": "array",
      "items": { "type": "string" },
      "description": "分类标签,用于权限继承与检索"
    },
    "complianceLevel": {
      "type": "string",
      "enum": ["gold", "silver", "bronze"],
      "description": "合规等级,决定审批流的严格程度"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}

元数据字段与权限模型的映射关系可以通过下图进一步理解:

元数据字段 → 权限资源映射 元数据字段 • templateId • version • owner • tags • complianceLevel • createdAt 权限资源路径 /templates/{id} /templates/{id}/version /templates/{id}/owner /templates/{id}/tags /templates/{id}/compliance /templates/{id}/audit 每个元数据字段对应一个独立的权限资源路径,支持细粒度 ACL 控制
常见设计误区:将元数据字段与权限资源混为一谈。例如,将 owner 字段直接作为权限判断的唯一依据,而忽略了标签继承、合规等级等更细粒度的控制点。正确的做法是:元数据字段只负责描述,权限模型通过独立的资源路径进行判断。

3.4 模板版本与继承策略

SLO 作业模板需要支持版本迭代与模板继承,以适应不同团队和服务的差异化需求。设计时应考虑:

  • 版本管理:采用语义化版本(SemVer),主版本号变更表示不兼容的字段结构调整,次版本号表示新增可选字段,补丁版本表示字段描述或默认值修正。
  • 模板继承:子模板可以继承父模板的元数据字段,并允许覆盖特定字段(如阈值、合规窗口)。继承关系应记录在元数据的 parentTemplateId 字段中。
  • 权限继承:子模板默认继承父模板的权限策略,但平台管理员可以为子模板单独绑定角色,实现“基础权限统一,特殊权限例外”的管控模式。

下表总结了不同版本变更类型对权限模型的影响:

版本变更类型 示例 权限影响 审批要求
主版本(Major) 字段结构调整,如删除 SLI 数据源字段 所有关联作业的权限资源路径可能失效 需平台管理员 + 安全审计双重审批
次版本(Minor) 新增可选字段,如添加“排除窗口” 新增权限资源路径,不影响现有权限 需 SRE 负责人审批
补丁(Patch) 修正字段描述或默认值 无权限影响 无需审批,自动生效

模板继承示例:

// 父模板:基础 SLO 模板
{
  "templateId": "slo-tpl-base-1.0.0",
  "owner": "platform-sre",
  "complianceLevel": "silver",
  "tags": ["tier=standard"]
}

// 子模板:支付服务专用模板,继承父模板并覆盖阈值
{
  "templateId": "slo-tpl-payment-1.0.0",
  "parentTemplateId": "slo-tpl-base-1.0.0",
  "owner": "payment-sre",
  "complianceLevel": "gold",
  "tags": ["tier=critical", "team=payment"],
  "overrides": {
    "thresholds": {
      "latency_p99": { "target": 200, "warning": 150 }
    }
  }
}