我应该使用哪个HTTP状态代码进行运行状况检查失败?

Pau*_*ley 21 monitoring web-applications http

我正在实现一个/_status/端点,它对我们数据库中的数据进行一些健全性检查.

例如,我们正在收集测量结果,如果最新测量值超过一小时,状态将变为"不良".

我想指出Pingdom在这个URL上利用他们的警报基础设施并告诉我们什么时候出错了.

在"良好"状态下,我将提供具有HTTP 200 OK状态的HTML页面.但是,对于"坏",适当的HTTP状态代码是什么?或者更正确的是不通过状态代码传递这些信息,而是通过HTML内容?

谢谢!

Pao*_*olo 24

嗯......这是一个老问题,但我最终到了这里,所以我想我会在这里给我两分钱:如果一切都好的话,很明显应该返回2xx

如果健康状况不好,我认为它应该返回5xx结果(4xx说明客户端在请求中有错; 2xx和3xx在某种程度上都是成功的).

我认为5xx是正确的,因为这是一个特殊的请求,它回答整个服务的状态.此外,因为大多数负载均衡器提供基于响应代码的活跃度检查,并非所有负载均衡器都提供了解析更复杂的有效负载的方法(除了可能使检查变得脆弱的RegExp匹配).

我同意@Julien认为500(具体)似乎不合适,我们已决定503服务不可用.

503似乎适合几个原因:

  • 这是一个5xx系列结果代码,表示服务器端正在进行某些操作.
  • 它具有临时性质,表明它可能会恢复.


bri*_*rns 14

我们刚刚在小组中进行了类似的讨论.为了我们的目的,我们决定HTTP响应代码应该报告服务器成功或失败以满足请求.对于GET,这将意味着您是否可以使用所请求的资源进行响应.在这种情况下,请求的资源是健康报告,因此只要您成功返回,它应该是200响应.

我们正在为健康检查返回JSON,顶级"isHealthy"字段设置为true或false.我们的负载均衡器和其他监视器将解析JSON并使用此字段来确定系统是否健康.

如果您不想在监视器中解析JSON,可以尝试使用自定义响应标头来指示系统的二进制运行状况,例如,System-Health: trueSystem-Health: false.你可能有更好的运气获得可以检查的显示器.

如果你真的想要使用响应代码,我会推荐一个名为"health" 的额外端点,健康时返回"204 No Content",不健康时返回"404 Not Found".在这种情况下,URL定义的资源象征性地是系统的运行状况,因此如果它是健康的,您可以返回成功的响应.如果它不健康,那么它的健康就无法找到,因此404.

  • 有一些关于此的后续讨论,我们认为4xx错误实际上并不合适,因为它们是为了表示客户端错误,这不是这里的情况.5xx错误更适合表示不健康.这可能仍然与尝试提供运行状况检查的错误混淆,但这可能没问题,因为它仍然表明服务器上存在问题.我认为理想情况是JSON(或其他结构化数据)中的健康报告,无论是否健康,都是200响应,并依赖健康报告的内容来指示系统的健康状况. (8认同)
  • 这种推理是不正确的。HTTP 状态代码与服务器是否能够处理请求无关。发送回响应这一事实就表明服务器能够处理该请求。HTTP 状态代码用于指示处理的结果。处理健康检查的结果要么健康,要么不健康。健康的结果可以通过 2xx 状态代码来指示。不健康的结果可以用 5xx 表示。不健康的服务器无法处理未来的请求以提供正确的结果。因此,5xx。 (4认同)