问题描述
想要在公司中监控最近失败的应用程序作业的情况。作业状态存储在MySQL表中。公司有大约50种不同类型的作业,有时其中一个作业会因为代码或合同的更改而开始失败。在生产环境中,我们希望能够可视化失败的激增并进行警报。我们拥有ELK、Grafana、Opsgenie和Python、Bash脚本的能力。ELK似乎不适用,因为它解析日志,而我们的日志没有很好地标准化,无法检测到失败的激增。Grafana似乎更适合用于CPU和内存等指标。我们过去曾通过脚本进行监控,但肯定有更好的方法。在我们知道问题之前,客户已经受到了影响。ELK、Grafana或其他开源工具中是否有可以帮助我们的解决方案?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
可以通过以下多种方式来解决这个问题:
1. 创建一个基于Python的定时任务,每隔T秒(抓取间隔)查询数据库,获取最近T秒(时间差)内失败的作业。将相关数据推送到ES中的特定索引(如failed-job
),然后在Grafana/Opsgenie中设置警报。(你也可以在这里使用watcher)不需要读取日志。
2. 如果已经使用了Prometheus,可以使用Prometheus,创建一个新的自定义Prometheus exporter。Exporter是一个Flask Web服务器,提供一个端点来对数据库运行查询并以Prometheus兼容格式返回结果。在Prometheus中配置作业以每隔T秒抓取此端点。同样,使用Grafana进行可视化。
3. 如果可能,使用名为Prometheus Pushgateway的组件,可以使用Python脚本将作业状态推送到该组件,就像方案1中一样。或者修改作业本身以直接推送数据。同样,可以连接到Prometheus/Grafana。
如果你只是想解决这里描述的单个用例,方案1可能是更好的选择。对于涵盖许多其他用例的更大更复杂的设置,值得考虑Prometheus。
另外,你可以使用相同的设计将指标推送到任何数据源(如存储CPU/内存指标的数据源)。
方案2
Rundeck是一个非常适合作业的界面,它可以提供作业的界面,如果作业失败,它会向你发出警报,并提供作业的快速摘要。你可以在这里查看详细信息。
方案3
也许你可以将Grafana连接到MySQL数据库,并查询失败的次数?Grafana还具有基本的警报功能,因此您可以向相关方发送警报。在我们公司,我们对作业的处理方式类似于您的情况-状态保存在数据库中。我们使用Nagios和自定义查询来检查问题并发送警报,但您可能希望继续使用Grafana而不安装另一个工具。