跳转到主要内容
导入排班… 能读 Opsgenie 和 PagerDuty REST API 返回的排班,迁过来的团队不用手工重建轮值。脚本用来源的 API Key 把排班取到一个文件里,这个文件再走和包一样的导入流程:先预演,再一次写入。MoleSignal 不保存这个 Key,也不向来源发请求。导入需要 schedules.create。 能带过来什么由一条规则决定:从现在起,任何时刻谁值班都不变。这里的排班表达不了、又会改变结果的内容会挡住导入;不影响现在往后值班结果的内容会跳过,并在结果里说明。

步骤

1

加人

把轮值上的人都加进工作区,邮箱和来源里一样,见成员。成员按邮箱对上,不分大小写。
2

取排班

在装有 curl 和 jq 的机器上运行 Opsgenie 或 PagerDuty 的脚本,它写出一个文件。
3

预演

打开 告警 → 值班排班,选择 导入导出 → 导入排班…,再选择 选择文件 和 预演。每个排班会列出将发生什么,见读懂结果。
4

解决挡住导入的问题

改来源后重新取,或者编辑文件。有排班出错时什么都不写。
5

导入

选择 导入,打开导入的排班核对谁在值班。把升级策略指向它,通知就开始走这个排班。

Opsgenie

设置一个能读排班的 API Key,再运行脚本。EU 账号用 api.eu.opsgenie.com。
文件的 data 里是每个排班的 GET /v2/schedules/{id},timelines 里是它的 GET /v2/schedules/{id}/timeline。DAYS 决定时间线往后取多久。 下面这些内容在轮换还生效时会挡住导入: 临时替班、转发规则、升级策略和路由不导入。

PagerDuty

设置一个能读排班和用户的 API Key,再运行脚本。EU 账号用 api.eu.pagerduty.com。
文件的 schedules 里是每个排班的 GET /schedules/{id} 和 GET /v3/schedules/{id},users 里是 GET /users 的邮箱(排班里的人不带邮箱),shift_based_schedules 里是 GET /v3/schedules 的列表。since 和 until 是 PagerDuty 渲染的范围,DAYS 决定往后取多久。 排班要逐个取,不传 time_zone。GET /schedules 按调用者的时区渲染时段限制,而不是排班的时区;导入认得出按别的时区渲染的排班,会拒绝它。

分层排班

shift-based 排班

PagerDuty 的 V3 API 返回的排班由事件组成。事件之间没有优先级:时间上重叠时,这些事件里的人同时值班。 事件还在生效时,下面这些会挡住导入: 文件里只在 shift_based_schedules 下有名字的 shift-based 排班(例如脚本没取到的)会被跳过,并列在结果里。重新运行脚本就能带过来。文件里其余的排班照常导入。 临时替班、升级策略和服务不导入。

读懂结果

排班下面的其他几行说明跳过了什么,以及和来源对照的结果。

和来源对照

文件里带着来源自己排出来的值班表:PagerDuty 的 final_schedule 和 Opsgenie 的时间线。预演算出这段时间谁值班,从现在起和它比。有不同就报错,写明时间和两边的人,什么都不写。
  • 临时替班不导入,它占的时段不比。
  • shift-based 排班的 final_schedule 里同一时刻有几个人值班时,即使事件之间不重叠,也会挡住导入。
  • Opsgenie 里已停用的排班带过来也是暂停的,不做对照。
  • 对照范围没跨过有夏令时的时区的切换时,结果会说明。这里的交接保持本地时间不变;调大 DAYS 可以把下一次切换也比上。
  • 文件里没有渲染结果时,结果会说明没有对照,导入继续。从文件里去掉 final_schedule 或 timelines,就能导入有意不一样的排班。

限制

一个文件最多 4 MiB、500 个排班,一个排班最多 60 条还在生效的轮值。文件太大时调小 DAYS。

再次导入

排班按名称对上,再次导入会更新来源里变过的轮值,其余保持不变。这里做的临时替班和换班会保留,文件里没有的设置也保留,例如团队和 换班需要批准。
最后修改于 2026年11月1日