我在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
。这可能吗?
答案 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中多对一和一对多匹配的结果。