2. 服务画像基础概念
2.1 什么是服务画像?
服务画像(Service Profiling)是对一个微服务或应用系统进行多维度、结构化、可量化的描述与建模过程。它类似于“用户画像”之于产品运营,服务画像为 SRE 和 DevOps 团队提供了一份关于服务“是谁、长什么样、如何运行”的标准化快照。
在 DORA 度量体系中,服务画像是定义 SLI(Service Level Indicator)口径的前置条件。没有准确的服务画像,SLI 的采集范围、聚合粒度、阈值设定都会失去依据,导致度量结果无法真实反映服务的健康状态。
核心认知: 服务画像不是静态的文档,而是持续演进的元数据模型。每次架构变更、部署模式调整、流量特征变化,都应触发服务画像的更新。
2.2 服务画像的核心维度
一个完整的服务画像由以下五个核心维度构成,它们共同决定了 SLI 的采集策略与计算口径:
| 维度 | 定义 | 对 SLI 口径的影响 |
|---|---|---|
| 业务属性 | 服务所属业务域、服务等级(Critical / Important / Best Effort)、SLA 承诺 | 决定 SLI 的 SLO 目标值、告警优先级、降级策略 |
| 技术栈 | 编程语言、框架、中间件、数据库、协议栈 | 决定可观测性数据采集方式(Agent / SDK / Sidecar)、指标暴露格式 |
| 部署模式 | 容器化 / 虚拟机 / 裸金属、K8s / 自建、多 AZ / 多 Region | 决定 SLI 的聚合粒度(Pod / Node / Cluster)、可用性计算模型 |
| 流量特征 | QPS 基线、请求类型(同步 / 异步 / 流式)、峰值模式、调用链深度 | 决定 SLI 的采样率、百分位计算方式、异常检测基线 |
| 团队结构 | Owner 团队、On-Call 轮值、变更审批流程、发布频率 | 决定 SLI 的变更失败率计算口径、MTTR 的计时起点 |
2.3 服务画像五维关系图
下图展示了五个核心维度之间的依赖与影响关系,以及它们如何共同作用于 SLI 口径的定义:
2.4 各维度详解
2.4.1 业务属性
业务属性是服务画像的顶层维度,它定义了服务的商业价值和运营等级。常见的业务属性分类包括:
- 服务等级:Critical(核心交易链路)、Important(重要支撑服务)、Best Effort(非关键辅助服务)
- SLA 承诺:99.99% / 99.9% / 99% 等不同级别的可用性目标
- 业务域:支付域、用户域、商品域、订单域等
- 合规要求:数据主权、审计日志保留周期、加密标准
SLI 口径影响: Critical 服务的 SLI 必须采用 99.9 百分位延迟,且告警阈值更严格;Best Effort 服务可采用 95 百分位,告警响应时间可放宽。
2.4.2 技术栈
技术栈决定了可观测性数据的采集可行性和指标暴露格式。不同技术栈的 SLI 采集方式差异显著:
| 技术栈类型 | 典型代表 | SLI 采集方式 |
|---|---|---|
| JVM 生态 | Spring Boot / Micrometer | JMX Exporter / Micrometer Registry |
| Go 生态 | Gin / gRPC | Prometheus Client SDK / OpenTelemetry SDK |
| Node.js 生态 | Express / Koa | OpenTelemetry JS SDK / Prometheus Client |
| Mesh 代理 | Envoy / Istio | Sidecar 自动注入,零代码采集 |
2.4.3 部署模式
部署模式直接影响 SLI 的聚合粒度和可用性计算模型。以下是三种主流部署模式下的 SLI 口径差异:
- K8s 容器化:SLI 按 Pod 粒度采集,可用性 = 就绪 Pod 数 / 期望 Pod 数,支持 HPA 自动扩缩容场景
- 虚拟机 / 裸金属:SLI 按主机粒度采集,可用性 = 健康实例数 / 总实例数,需考虑蓝绿部署时的流量切换
- Serverless:SLI 按函数调用粒度采集,可用性 = 成功调用次数 / 总调用次数,冷启动延迟需单独建模
2.4.4 流量特征
流量特征决定了 SLI 的采样策略和百分位计算方式。不同流量模式下的 SLI 口径差异:
| 流量特征 | 典型场景 | SLI 口径建议 |
|---|---|---|
| 高 QPS 同步 | API Gateway、用户查询 | 1% 采样 + HDR Histogram,99 百分位延迟 |
| 异步消息 | 事件驱动、消息队列 | 端到端延迟(生产-消费),P99 延迟 |
| 流式处理 | 实时计算、日志管道 | 吞吐量(records/sec)+ 处理延迟(P50) |
| 批处理 | 离线报表、数据同步 | 完成率 + 总耗时(非百分位) |
2.4.5 团队结构
团队结构影响 SLI 中变更失败率和MTTR 的计算口径:
- Owner 团队:明确 SLI 的负责人,变更失败率按团队维度聚合
- On-Call 轮值:MTTR 的计时起点从 On-Call 工程师确认告警开始,而非告警触发时间
- 变更审批流程:需要审批的变更,失败率计算应排除“因审批延迟导致的回滚”场景
- 发布频率:高频发布团队(每日多次)的变更失败率 SLI 应采用滚动窗口(如 7 天),而非固定周期
常见误区: 团队结构维度常被忽略,导致 MTTR 计算口径不一致。例如,A 团队从告警触发开始计时,B 团队从 On-Call 确认开始计时,两个团队的 MTTR 数据无法直接对比。
2.5 服务画像与 SLI 口径的映射关系
以下表格总结了五个维度如何具体影响 SLI 的采集、聚合、计算、阈值四个环节:
| SLI 环节 | 业务属性 | 技术栈 | 部署模式 | 流量特征 | 团队结构 |
|---|---|---|---|---|---|
| 采集 | 等级决定采集频率 | 决定采集工具 | 决定采集粒度 | 决定采样率 | — |
| 聚合 | 按业务域聚合 | 按技术栈分组 | 按集群/命名空间 | 按请求类型 | 按团队分组 |
| 计算 | SLO 目标值 | 指标计算公式 | 可用性模型 | 百分位选择 | MTTR 计时起点 |
| 阈值 | 告警优先级 | 错误码映射 | 扩缩容触发条件 | 异常检测基线 | 变更失败率窗口 |
2.6 服务画像的实践要点
- 标准化模板:团队应建立统一的服务画像模板,确保所有服务都按相同维度描述,避免口径不一致
- 自动化采集:通过 CMDB、服务注册中心、K8s 标签等基础设施自动填充画像信息,减少人工维护成本
- 版本化管理:服务画像应纳入版本控制(如 Git),每次架构变更都需更新画像并触发 SLI 口径重新评估
- 定期审计:每季度对服务画像进行审计,确保画像与实际运行状态一致,避免“画像漂移”
- 与 SLI 联动:服务画像的变更应自动触发 SLI 口径的重新计算,形成“画像变更 → 口径更新 → 度量生效”的闭环
最佳实践: 在服务上线流程中增加“服务画像注册”环节,将画像信息作为服务发布的必要条件。未完成画像注册的服务,不允许接入生产流量。