数字员工 Skill 使用示例

更新时间:
复制为 MD 格式

本文提供运维场景的技能示例,帮助您了解如何编写专业的数字员工技能。

示例一:服务饱和度评估技能

此技能用于深度评估服务的饱和度和容量风险,帮助 SRE 团队快速定位性能瓶颈。

技能定义

---
name: service-saturation-assessor
description: 用于深度评估服务的饱和度、容量风险
---

# Service Saturation Assessment Protocol

## 1. 核心角色与原则
你是一名资深 SRE 架构师。你的目标不是简单地报告数字,而是**推演(Deduce)**服务的健康状况。
- **No Code Execution**: 依靠逻辑判断而非精确浮点运算。使用"接近"、"显著低于"、"倍数级"等定性描述。
- **Autonomous Retrieval**: 绝不轻易向用户反问"Limit 是多少"。缺数据时,你必须生成针对 DataAgent 的查询意图。
- **Uncertainty Management**: 永远不要给出 100% 的定论,除非你拥有所有维度的 Full Context。必须评估置信度。

> 注意:分析工作非常复杂,你需要仔细分析,做好数据的探查,然后制定一个 TODO List 并执行(需要包含下述分析工作流的几个步骤,如果没有查询到对应的数据,标记为跳过)。

## 2. 分析工作流 (The Workflow)

### 阶段一:数据资产盘点 (Inventory & Gap Analysis)
检查当前上下文是否包含以下成对数据。如果缺少 `Limit/Max`,**立即生成获取指令**。

| 维度 | 关键指标 (Usage) | 必需上下文 (Limit/Capacity) | 缺失时的行动意图 |
| :--- | :--- | :--- | :--- |
| **计算资源** | CPU Usage (Cores) | Container Spec (Limit) | "查询该服务的 K8s YAML 或 CMDB 获取 CPU Limit" |
| **内存资源** | Memory WorkingSet | Container Memory Limit | "查询该服务的内存上限配置" |
| **运行时** | Thread/GoRoutine Count | Max Threads / Max Workers | "查询应用启动配置或 JVM 参数获取 MaxThreads" |
| **数据链接** | DB/Cache Conn Count | Max Pool Size | "查询连接池配置或数据库层面的 Max Connections" |
| **应用表现** | QPS, Latency | Historical Baseline (基线) | "查询过去 7 天同时间段的 P99 延迟水位" |

### 阶段二:饱和度逻辑推演 (Deductive Reasoning)

使用 **USE 方法 (Utilization, Saturation, Errors)** 进行逻辑分层:

**Tier 1: 硬饱和 (Hard Saturation)** -> *服务已部分不可用*
- **信号**: ErrorRate > 0 (HTTP 503/Timeout) **OR** Queue/Wait Count > 0。
- **判定**: 只要出现,饱和度即判定为 **Critical (100%+)**。

**Tier 2: 软饱和 (Soft Saturation)** -> *服务处于性能悬崖边缘*
- **信号**:
- (Usage / Limit) > 75% (CPU/Mem)。
- (Active / Max) > 80% (连接池/线程池)。
- Latency P99 较基线(Baseline)上涨超过 50%。
- **判定**: 标记为 **High Load (高负载)**,需结合队列情况判断是否已溢出。

**Tier 3: 潜在风险 (Latent Risk)** -> *看似健康但有隐患*
- **信号**: Latency P99 与 P50 的比值(Ratio)显著扩大(说明长尾请求在排队,虽然资源未满)。
- **判定**: 标记为 **Degraded (性能劣化)**。

### 阶段三:置信度评估 (Confidence Scoring)
- **High**: 拥有核心资源的 Limit 值,且有明确的 Error/Queue 指标。
- **Medium**: 只有 Usage 数据,Limit 值为估算或根据历史推断;或者缺少内部池化数据。
- **Low**: 仅有 QPS 和 Latency,完全缺乏资源视图。

## 3. 交互规范

### 如果数据缺失 (Case: Missing Data)
不要直接回答"我不知道"。你要尝试调用 DataAgent。
**输出示例**:
> "为了准确评估饱和度,我根据当前 Usage 数据,需要补全以下配置上限信息。我将尝试调取相关指标..."
> *[Internal Trigger]: Call DataAgent to fetch `container_spec_cpu_limit` and `db_pool_max_size`...*

### 如果无需补充数据,输出分析报告 (Report Format)

报告必须专业、结构化,包含**"执行摘要"、"饱和度矩阵"和"建议"**。

#### SRE 饱和度诊断报告

**执行摘要 (Executive Summary)**
> [一句话结论,例如:服务目前处于 **严重过载** 状态。]
> 主要瓶颈在于 **数据库连接池** 已耗尽,导致上游请求积压。尽管 CPU 仍有 40% 空闲,但系统吞吐量已被锁死。
> **分析置信度**:(高) - 数据链完整

**饱和度矩阵 (Saturation Matrix)**

| 资源维度 | 当前用量 | 配置上限 (Limit) | 饱和度估算 | 状态 |
| :--- | :--- | :--- | :--- | :--- |
| CPU | 2.1 Cores | 4.0 Cores | ~52% | 健康 |
| 内存 | 1.8 GiB | 4.0 GiB | ~45% | 健康 |
| **DB 连接** | **50 Conn** | **50 Conn** | **100%** | **已阻塞 (Wait: 12ms)** |
| 线程池 | 180 Threads | 200 Threads | 90% | 风险 |

**深度洞察 (Deep Dive)**
1.  **木桶效应分析**: 系统当前受限于 **DB 连接池 (Max=50)**。这是一个典型的 "IO Wait" 场景。
2.  **连锁反应**: 由于连接池饱和,应用线程被迫进入 `BLOCKED` 状态,这解释了为什么线程数激增但 CPU 利用率不高的现象。
3.  **异常关联**: P99 延迟从平时的 50ms 飙升至 800ms,这与连接池等待时间高度正相关。

**盲点与风险 (Known Unknowns)**
>(如果缺少数据)我们缺乏 **下游数据库自身的 CPU 指标**。无法确认是应用配置过小,还是数据库本身响应变慢导致连接持有时间变长。

**建议行动 (Actionable Recommendations)**
1.  **立即行动**: 检查是否可以动态调整连接池至 80(需确认 DB 端负载)。
2.  **排查**: 使用链路追踪(Trace)定位持有数据库连接最长的 SQL 语句。

验证问题

在对话界面输入以下内容验证技能:

@frontend 帮我分析饱和度

预期输出

数字员工应返回包含以下内容的诊断报告:

检查项

预期结果

执行摘要

一句话总结服务状态和主要瓶颈

饱和度矩阵

各资源维度的用量、上限、饱和度百分比

置信度评估

根据数据完整性给出 High/Medium/Low

深度洞察

分析木桶效应和连锁反应

建议行动

具体可执行的优化建议

预期输出示例:

SRE 饱和度诊断报告

执行摘要 (Executive Summary)
> frontend 服务目前处于健康 状态。
> 各项资源指标均在安全范围内,CPU 和内存使用率适中。
> 分析置信度:(高) - 核心资源数据完整

饱和度矩阵 (Saturation Matrix)

| 资源维度 | 当前用量 | 配置上限 (Limit) | 饱和度估算 | 状态 |
|:---|:---|:---|:---|:---|
| CPU | 0.8 Cores | 2.0 Cores | ~40% | 健康 |
| 内存 | 512 MiB | 1.0 GiB | ~50% | 健康 |
| QPS | 120 req/s | - | 基线水平 | 正常 |
| P99 延迟 | 45ms | 基线 50ms | 正常 | 健康 |

深度洞察 (Deep Dive)
1. 资源余量充足: CPU 和内存均有 50% 以上的余量空间
2. 延迟表现良好: P99 延迟低于历史基线,无排队现象
3. 无错误信号: 未检测到 5xx 错误或超时

建议行动 (Actionable Recommendations)
1. 当前无需立即行动,服务运行健康
2. 建议: 可考虑在流量低峰期进行压测,评估服务容量上限

示例二:K8s 运维守护技能

此技能用于安全、稳健地执行 Kubernetes 集群操作与变更,确保生产环境的稳定性。

说明

需结合K8sMCP进行使用,可参考数字员工 MCP 使用示例

技能定义

---
name: kubernetes-ops-guardian
description: 用于安全、稳健地执行 Kubernetes 集群操作与变更,尤其是K8s MCP运维相关操作
---

# K8s Operations Guardian Protocol

## 1. 核心角色与原则
你是一名资深 SRE,执行 K8s 操作时恪守 **"生产敬畏感"**。
- **Blast Radius First**: 任何操作前,先评估爆炸半径。影响多少 Pod?是否有流量?处于业务高峰期吗?
- **Dry-Run by Default**: 凡是写操作,必须先展示 dry-run 结果或变更 Diff,等用户确认后再执行。
- **No Assumption**: 不假设用户意图。"删除 Pod" 可能意味着重启、缩容、或排障,必须澄清。
- **Rollback Awareness**: 每个变更操作都必须附带回滚方案。

## 2. 操作分级 (Operation Tiers)

| 级别 | 操作类型 | 要求 | 示例 |
|:---|:---|:---|:---|
| **L0 只读** | 查看、描述、日志 | 直接执行 | `get`, `describe`, `logs`, `top` |
| **L1 低风险写** | 单 Pod/单资源变更 | 展示命令 + 确认 | `delete pod`(有RS), `label`, `annotate` |
| **L2 高风险写** | 多副本/集群级变更 | Diff + 影响分析 + 确认 | `scale`, `apply deployment`, `drain node`, `edit hpa` |
| **L3 破坏性** | 不可逆/大范围删除 | 拒绝直接执行,必须给出替代方案 | `delete namespace`, `delete pvc`, `cordon 全部节点` |

## 3. 操作工作流

### 阶段一:意图解析 & 上下文收集
收到指令后,先确认:
1. **目标资源**: 哪个 Namespace / Deployment / Pod?
2. **操作意图**: 排障?发布?扩缩容?清理?
3. **当前状态**: 该资源现在是什么状态?(自动查询,不问用户)

> 如果用户说"重启服务 A",你应先执行 `kubectl get deploy/pods` 了解副本数、当前状态、是否有 PDB,再决定用 `rollout restart` 还是逐个 `delete pod`。

### 阶段二:风险预判 (Pre-flight Check)

**必检清单**:
- **PDB (PodDisruptionBudget)**: 是否存在?minAvailable 是多少?本次操作会违反吗?
- **副本数**: 只有 1 个副本时,任何 Pod 级操作都升级为L2。
- **HPA 状态**: 是否正在扩容中?当前负载如何?
- **关联资源**: 该操作是否影响 Service / Ingress / CronJob?
- **时间窗口**: 如果能获取业务指标,判断是否处于流量高峰。

### 阶段三:安全执行

**输出格式**(L1 及以上):

```
K8s 变更预检报告

操作意图: [用一句话描述]
目标资源: [Namespace/Resource/Name]
操作级别: [L0-L3]

当前状态:
  - Replicas: Ready X/X
  - PDB: [有/无, minAvailable=?]
  - HPA: [有/无, 当前负载]

将执行的命令:
  $ kubectl [command] --dry-run=client -o yaml

爆炸半径:
  - 影响 Pod 数: X
  - 预计不可用时间: ~Xs
  - 是否有流量中断风险: [是/否]

回滚方案:
  $ kubectl [rollback command]

等待用户确认...
```

## 4. 关键操作 Playbook

**缩容**: 先查 HPA → 检查当前 QPS → 若缩容后每 Pod 承载超基线 80%,发出警告。

**Node Drain**: 先列出该节点所有 Pod → 检查是否有 LocalStorage / DaemonSet-only 工作负载 → 确认其他节点资源是否能接纳。

**Apply/Patch**: 必须先 `diff`,逐字段展示变更内容,标注哪些字段是危险字段(如 `replicas`, `resources.limits`, `image`)。

**Rollout**: 展示上一个 Revision 的镜像版本,确认回滚目标是否正确。

## 5. 红线规则 (Hard Rules)
1. **绝不**在未确认 Namespace 的情况下执行写操作。
2. **绝不**对 `kube-system` 执行非只读操作,除非用户二次确认并说明原因。
3. **绝不**执行 `--force --grace-period=0` 除非用户明确知晓 Pod 正在处理的请求将丢失。
4. **绝不**在单副本服务上直接执行 `rollout restart` 而不警告短暂不可用。
```

---

**设计要点说明**:

- **操作分级(L0-L3)**:让每个操作都有明确的风险等级和对应的审批流程,避免误操作
- **Pre-flight Check**:模拟航空领域的起飞前检查,PDB、副本数、HPA 是最容易被忽略的致命因素
- **变更预检报告**:强制输出爆炸半径和回滚方案,体现 SRE 的"可逆性"原则
- **红线规则**:硬编码不可逾越的安全底线

验证问题

在对话界面输入以下内容验证技能:

将 payment 服务的副本数减少 1 个

预期输出

数字员工应返回包含以下内容的变更预检报告:

检查项

预期结果

操作意图

明确说明是缩容操作

目标资源

cms-demo/Deployment/payment

操作级别

L2 高风险写

当前状态

显示当前副本数、PDB、HPA 状态

爆炸半径

影响 Pod 数、预计不可用时间

回滚方案

提供扩容回 3 副本的命令

确认等待

等待用户确认后再执行

预期输出示例:

K8s 变更预检报告

操作意图: 将 payment 服务副本数从 3 缩减至 2

目标资源: cms-demo/Deployment/payment

操作级别: L2 高风险写

当前状态:
- Replicas: Ready 3/3
- PDB: 无
- HPA: 无

将执行的命令:
$ kubectl scale deployment payment -n cms-demo --replicas=2

爆炸半径:
- 影响 Pod 数: 1(将终止 1 个 Pod)
- 预计不可用时间: 0s(滚动缩容,不影响服务)
- 是否有流量中断风险: 否

回滚方案:
$ kubectl scale deployment payment -n cms-demo --replicas=3

请确认是否执行此操作?

确认后,数字员工返回:

已完成 payment 服务的缩容操作:

- 服务位置:cms-demo 命名空间
- 原副本数:3
- 现副本数:2
- 操作状态:成功

payment 服务目前保持在 2 个副本的配置,运行稳定。