按HTTP状态分组时,错误率未返回任何数据

时间:2019-02-20 17:55:04

标签: grafana prometheus

我在Grafana中有一个使用Prometheus数据源的图形,用于显示我的API的错误率。此查询可以很好地工作:

sum(rate(va_request_response_code{endpoint="api", statusCode!="200"}[5m])) by (exported_endpoint, statusCode)

我从我的API获取非200响应代码的比率,然后将这些比率相加,因为我有3个正在运行的API实例。然后,我将它们按照exported_endpoint(用户请求的实际路径)和statusCode分组,这是返回的确切HTTP状态代码。

尽管这作为原始数字有点有用,但并没有帮助。每100个请求中每秒有100个错误是非常糟糕的,而在1,000,000个请求中有100个错误则不是一个问题。因此,我想除以请求总数,但仍在努力。如果我这样做:

(sum(rate(va_request_response_code{endpoint="api", statusCode!="200"}[5m])) by (exported_endpoint, statusCode))/(sum(rate(va_request_response_code{endpoint="api"}[5m])) by (exported_endpoint))

然后它仅显示No data points,这很有意义,因为在第一种情况下,它是按statusCode在除数中而不是在除数中进行分组,因此它必须表示它试图在除法之前找到匹配项。相反,这样做确实可行:

(sum(rate(va_request_response_code{endpoint="api", statusCode!="200"}[5m])) by (exported_endpoint))/(sum(rate(va_request_response_code{endpoint="api"}[5m])) by (exported_endpoint))

但是我然后丢失了想要的状态码分组。理想情况下,我想知道x%的请求返回404,而y%的返回500。这可能吗?

1 个答案:

答案 0 :(得分:1)

您需要这样写:

sum by (exported_endpoint, statusCode) (rate(va_request_response_code{endpoint="api", statusCode!="200"}[5m]))
  / ignoring(statusCode) group_left
sum by (exported_endpoint) (rate(va_request_response_code{endpoint="api"}[5m]))

即取两个向量,左边一个带有statusCode标签,右边一个不带;忽略它们而忽略statusCode标签;然后将左向量的标签应用于结果。

此处the link是PromethQs文档中PromQL中多对一和一对多匹配的结果。