服务挂钩疑难解答

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

本文提供 Azure DevOps 服务挂钩的常规故障排除指南。 它还提供常见问题解答(FAQ)。

查看活动和调试问题

Web 访问管理中的“服务挂钩”页面汇总了每个订阅过去七天内的活动。 该页还显示每个订阅是启用、禁用还是受限。

对于每个订阅,可以访问包含每个事件的完整请求和响应数据的详细历史记录。 此信息可帮助你调试有问题的服务或订阅。

  1. 若要查看订阅的活动和状态,请转到 “服务挂钩 ”页。

    “服务挂钩”页的屏幕截图,其中显示了订阅的状态、状态和其他数据。突出显示项目设置和服务挂钩。

  2. 若要查看订阅的详细活动(包括完整请求、响应和事件有效负载数据),请在表中选择订阅,然后选择 “历史记录”。

    显示订阅历史记录的屏幕截图,其中包含失败事件的详细信息,例如状态、消息和错误消息。

订阅失败和试用期(受限)

如果对通知请求的 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