Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020
本文提供 Azure DevOps 服务挂钩的常规故障排除指南。 它还提供常见问题解答(FAQ)。
查看活动和调试问题
Web 访问管理中的“服务挂钩”页面汇总了每个订阅过去七天内的活动。 该页还显示每个订阅是启用、禁用还是受限。
对于每个订阅,可以访问包含每个事件的完整请求和响应数据的详细历史记录。 此信息可帮助你调试有问题的服务或订阅。
订阅失败和试用期(受限)
如果对通知请求的 HTTP 响应指示错误,则失败的严重性决定了 Azure DevOps 的响应方式。 某些类型的故障可能会禁用订阅或将其置于暂挂状态。
失败类型
服务挂钩通知的失败情况分为以下类别:
- 终端故障
- 暂时性故障
- 持续失败
HTTP 响应中的错误代码确定 Azure DevOps 如何对失败进行分类。
终端故障
分类为终端故障的唯一 HTTP 状态代码为 410(已消失)。
当订阅中出现终端故障时,无论其以前的状态如何,订阅都会自动禁用。
暂时性故障
具有以下状态代码的 HTTP 响应归类为暂时性故障:
- 408(请求超时)
- 502(错误的网关)
- 503(服务不可用)
- 504(网关超时)
当订阅中发生暂时性故障时,Azure DevOps 会尝试重新发送通知最多 8 次,每次尝试之间的延迟增加。
下表列出了有关在发生暂时性故障后尝试的重试的信息。 包括近似 退避 时间,或尝试重新发送通知之前等待的时间。 最长退避时间为 60 秒。 该表还显示每次重试的总延迟。
| 重试次数 | 退避时间(以秒为单位) | 总延迟(以秒为单位) |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | 3 |
| 3 | 4 | 7 |
| 4 | 8 | 15 |
| 5 | 16 | 31 |
| 6 | 32 | 63 |
| 7 | 六十 | 123 |
| 8 | 六十 | 183 |
如果通知的所有重试都用尽,并且每次尝试都会导致暂时性失败,则不再发送通知。 相反,它被归类为持久的失败。
持续失败
所有其他 HTTP 故障代码(例如,404(找不到)和 500(内部服务器错误)都会导致持久失败。
当订阅中发生持久失败时,订阅将置于 观察期状态。
试用期
当订阅处于试用期时,任何新事件都将丢失。 系统尝试重新发送失败的通知次数有限。
下表列出了在试用期内尝试重试的近似退避时间和总试用时间。 最多尝试 7 次重试,缓刑重试的最大退避时间为 15 小时。
| 重试次数 | 退避时间 | 总缓刑时间(以小时为单位) |
|---|---|---|
| 1 | 20 分钟 | 0.33 |
| 2 | 40 分钟 | 1 |
| 3 | 1 小时 20 分钟 | 2.33 |
| 4 | 2 小时 40 分钟 | 5 |
| 5 | 5 小时 20 分钟 | 10.33 |
| 6 | 10 小时 40 分钟 | 21 |
| 7 | 15小时 | 36 |
如果订阅在试用期内收到成功的响应,它将被恢复到完全启用的状态,并重新发布事件。 如果所有七次重试失败,订阅状态将设置为 DisabledBySystem。
使用 AI 排查服务钩子问题
以下示例提示 Copilot Chat 可帮助 Copilot 排查错误代码和消息。 将此提示复制并粘贴到 Copilot Chat 中,将占位符替换为特定的错误消息。
I'm getting this Azure DevOps service hook error: [PASTE YOUR ERROR MESSAGE HERE]
Can you help me troubleshoot this issue? Please provide step-by-step instructions to:
1. Identify the root cause
2. Fix the issue
3. Verify the solution works
Context: This is for a service hook in Azure DevOps.
常见问题解答
问:服务挂钩的有效负载限制是多少?
A: 有效负载限制为 2 MB。 更大的有效负载会导致性能和可靠性下降。 最佳做法是,服务挂钩应将有效负载限制为 2 MB。
问:“已启用”状态(受限)的含义是什么?
A: 如果发生过多故障,订阅将受到限制。 处于 “已启用”(受限) 状态与处于缓刑状态相同。
问:“已禁用”状态(由于失败)的含义是什么?
A: 在以下情况下,订阅会自动被禁用:
- 遇到终端故障。
- 在较长时间内发生一系列连续失败。
在被认定为持久性故障之前,针对导致短暂性故障的通知会进行多次重试。 在试用期期间,持久失败通知的重试次数是有限的。 如果所有试用期重试失败,则会禁用订阅。
以下状态代码提供了每种故障类型的示例:
- 暂时性:408(请求超时)、502(错误的网关)、503(服务不可用)、504(网关超时)
- 终端:410(消失)
- 持续:所有不是暂时或致命的故障
问:“已禁用”状态(用户离开项目)的含义是什么?
一个: 创建订阅的用户不再是团队成员。
问:如果服务钩子不起作用,我该尝试什么?
A: 检查以下项目:
- 确认订阅已启用。
- 确认订阅设置正确。 检查事件筛选器和操作。
- 查看历史记录,尤其是在发生故障时。
问:是否可以授予常规项目用户查看和管理项目的服务挂钩订阅的能力?
一个: 默认情况下,只有项目管理员才拥有这些权限。 若要直接向其他用户授予他们,可以使用 命令行工具 或 安全 REST API。
问:是否可以以编程方式创建订阅?
A: 是的,请使用 REST APIs。