Prometheus - 使用 telegraf http_response 插件在出现 http 错误时创建警报
Prometheus - Creating an alert in case of http errors using the telegraf http_response plugin
我正在使用 Telegraf 和 Prometheus 来监控我的本地服务,例如 OpenHab 和我的 Grafana 实例。
http_response 插件可能会产生以下结果:
http_response_http_response_code{host="master-pi",instance="192.168.2.15:9126",job="telegraf-master-pi",method="GET",result="success",result_type="success",server="http://www.grafana.local",status_code="200"} 200
http_response_http_response_code{host="master-pi",instance="192.168.2.15:9126",job="telegraf-master-pi",method="GET",result="success",result_type="success",server="http://www.grafana.local",status_code="502"} 502
http_response_http_response_code{host="master-pi",instance="192.168.2.15:9126",job="telegraf-master-pi",method="GET",result="success",result_type="success",server="http://www.thuis.local/start/index",status_code="200"} 200
现在我想要一个警报,它会在过去 30 分钟的 !200 status_code 计数高于 200 status_code 计数时通知我。
我从简单的开始:
alert: service_down_external
expr: http_response_http_response_code{status_code!~"200|302"}
for: 35m
labels:
severity: high
这很好用,但问题是这对我的服务不起作用,我不是每 10 秒监控一次,而是每 5 到 30 分钟监控一次(因为我想减少某些 API).
所以我想,让我们换一种方式试试:
expr: count_over_time(http_response_http_response_code{status_code!~"200|302"}[30m]) > on(job, instance, method, server) count_over_time(http_response_http_response_code{status_code=~"200|302"}[30m])
这看起来很有希望,但不幸的是,如果根本没有 200/302 响应,则将无法工作,在这种情况下会返回 "no data"。
不过,我还是把它除以总量:
count_over_time(http_response_http_response_code{status_code!~"200|302"}[300m]) > on(job, instance, method, server) count_over_time(http_response_http_response_code[300m])
但是,结果是:
Error executing query: found duplicate series for the match group {instance="192.168.2.15:9126", job="telegraf-master-pi", method="GET", server="http://www.grafana.local/series"} on the right hand-side of the operation: [{host="master-pi", instance="192.168.2.15:9126", job="telegraf-master-pi", method="GET", result="success", result_type="success", server="http://www.grafana.local/series", status_code="502"}, {host="master-pi", instance="192.168.2.15:9126", job="telegraf-master-pi", method="GET", result="success", result_type="success", server="http://www.grafana.local/series", status_code="200"}];many-to-many matching not allowed: matching labels must be unique on one side
同样在尝试忽略时:
count_over_time(http_response_http_response_code{status_code!~"200|302"}[30m]) >ignoring(status_code) count_over_time(http_response_http_response_code[30m])
出现同样的错误。
是否有其他方法可以在过去 30 分钟内 http 响应 returns 只有 5xx 错误时提醒我?
6 个月后,又一次尝试解决这个问题,我终于想出了一个查询,它给了我预期的结果:
count_over_time(http_response_result_code{result!~"success"}[2h]) / on(job, instance, method, server, type) group_left() sum by(job, instance, method, server, type) (count_over_time(http_response_result_code[2h])) >= 0.5
部分求和解决了“找到匹配组的重复序列”,因为它将对所有重复序列求和(例如所有结果为“response_string_mismatch”和“成功”)
group_left 选择查询的左侧部分,因此我仍然可以在警报中使用 result_type 标签。右边部分只包含sum by.
中提到的5个字段
最后,查询会告诉我过去 2 小时内未成功的呼叫百分比,这正是我所需要的。
我正在使用 Telegraf 和 Prometheus 来监控我的本地服务,例如 OpenHab 和我的 Grafana 实例。
http_response 插件可能会产生以下结果:
http_response_http_response_code{host="master-pi",instance="192.168.2.15:9126",job="telegraf-master-pi",method="GET",result="success",result_type="success",server="http://www.grafana.local",status_code="200"} 200
http_response_http_response_code{host="master-pi",instance="192.168.2.15:9126",job="telegraf-master-pi",method="GET",result="success",result_type="success",server="http://www.grafana.local",status_code="502"} 502
http_response_http_response_code{host="master-pi",instance="192.168.2.15:9126",job="telegraf-master-pi",method="GET",result="success",result_type="success",server="http://www.thuis.local/start/index",status_code="200"} 200
现在我想要一个警报,它会在过去 30 分钟的 !200 status_code 计数高于 200 status_code 计数时通知我。
我从简单的开始:
alert: service_down_external
expr: http_response_http_response_code{status_code!~"200|302"}
for: 35m
labels:
severity: high
这很好用,但问题是这对我的服务不起作用,我不是每 10 秒监控一次,而是每 5 到 30 分钟监控一次(因为我想减少某些 API).
所以我想,让我们换一种方式试试:
expr: count_over_time(http_response_http_response_code{status_code!~"200|302"}[30m]) > on(job, instance, method, server) count_over_time(http_response_http_response_code{status_code=~"200|302"}[30m])
这看起来很有希望,但不幸的是,如果根本没有 200/302 响应,则将无法工作,在这种情况下会返回 "no data"。
不过,我还是把它除以总量:
count_over_time(http_response_http_response_code{status_code!~"200|302"}[300m]) > on(job, instance, method, server) count_over_time(http_response_http_response_code[300m])
但是,结果是:
Error executing query: found duplicate series for the match group {instance="192.168.2.15:9126", job="telegraf-master-pi", method="GET", server="http://www.grafana.local/series"} on the right hand-side of the operation: [{host="master-pi", instance="192.168.2.15:9126", job="telegraf-master-pi", method="GET", result="success", result_type="success", server="http://www.grafana.local/series", status_code="502"}, {host="master-pi", instance="192.168.2.15:9126", job="telegraf-master-pi", method="GET", result="success", result_type="success", server="http://www.grafana.local/series", status_code="200"}];many-to-many matching not allowed: matching labels must be unique on one side
同样在尝试忽略时:
count_over_time(http_response_http_response_code{status_code!~"200|302"}[30m]) >ignoring(status_code) count_over_time(http_response_http_response_code[30m])
出现同样的错误。
是否有其他方法可以在过去 30 分钟内 http 响应 returns 只有 5xx 错误时提醒我?
6 个月后,又一次尝试解决这个问题,我终于想出了一个查询,它给了我预期的结果:
count_over_time(http_response_result_code{result!~"success"}[2h]) / on(job, instance, method, server, type) group_left() sum by(job, instance, method, server, type) (count_over_time(http_response_result_code[2h])) >= 0.5
部分求和解决了“找到匹配组的重复序列”,因为它将对所有重复序列求和(例如所有结果为“response_string_mismatch”和“成功”)
group_left 选择查询的左侧部分,因此我仍然可以在警报中使用 result_type 标签。右边部分只包含sum by.
中提到的5个字段最后,查询会告诉我过去 2 小时内未成功的呼叫百分比,这正是我所需要的。