(以下是一个可以更轻松地演示我的需求的示例)
我有一个数据库,可以在其中找到我的客户(是独立公司)的查询执行时间。由于每个公司的数据,客户之间的查询时间预计会有很大差异。当客户的查询时间比过去的某个中间值高出%时,并且要将星期一的数据与以前的星期一的数据进行比较时,我想发出警报(我很难进行演示)。
我想避免为每个公司客户定义一个单独的警报。
我想避免为我要监视的每种查询定义一个单独的警报。
我希望避免将每个源都将数据预先推送到一个中央位置。
我想监视与数据库无关的其他事情,并希望将完全不同的逻辑应用于我的警报-例如对某些其他系统的一些REST api调用,或一些ELK或时间序列数据,或一些硬件监视数据。
我正在考虑定制解决方案,但想看看那里是否已有解决方案可以满足我的一些或更多需求。我已经看到/使用过一些监视解决方案,例如Nagios,尽管不是专家。将不胜感激任何指针或建议。
#1 楼
考虑使用诸如nagios或Zabbix之类的东西。尽管最好避免自定义查询和警报,但这是不可能的。有人在您的配置中使用您的特定工具套件的可能性很小,而在该特定配置中对该套件进行预先监控的可能性甚至很小。简而言之,无法避免这种自定义监视。尽管监视,警报和报告的管理和配置可能很繁琐,但是没有适当的捷径可做,正确地完成它可能会花费更多的时间,精力和资源,这超出了您的想象。在我广泛使用的4个监视系统中,我必须推荐nagios-它似乎最适合配置管理系统,并且与DevOps原理最兼容。
有时使用系统,例如elastalert或类似的系统,作为用于警报/监视/报告的中间件,但是您将必须根据案例来判断每种情况/监视,但是您会发现这些工具(和大多数监视系统)都有一些SDK ,能够帮助您进行监控自定义的API或工具。只需选择投资回报率和支持成本最低的最容易配置的系统,并确保坚持下去,并按照您的监控迁移项目完成即可。如果可能的话,请务必考虑专门的资源/人员来完成此任务。
#2 楼
将砖添加到此处的列表中,到了不断更新监视系统以添加新实例并清理旧实例的地步。因此,我转向了适用的prometeus通过简单的合同,出口商可以执行收集工作(可以是AWS上的cloudwatch_exporter,也可以是使用netdata对其进行查询时(可以是一个中心,也可以分别使用,但是后者失去了自动发现的优势))
prometheus的主要优点是使用数学函数并按度量标准名称的标签将警报定义分组。通过各种方式,对于我的基础架构监视,我使用标准偏差或标准方差来避免有关CPU使用率的固定警报,它会在stddev上升20%时向我发出警报。可以导出您的数据库或将指标推至prometeus并假设客户端名称为标签
client_queries
的度量标准名称client
,您可以按照以下步骤进行操作(当然,这只是未经说明的用途,仅用于说明):ALERT ClientQueryDriftUp
IF avg(client_queries[5m]) > avg(client_queries[5m] offset 1w) * 1.2
ANNOTATIONS {
summary = "{{ $labels.client }} query has gone up over 20% of last week",
description = "{{ $labels.client}} query average is high ! (current average value: {{ $value }}s)",
}
如果平均值之间的差异超过1秒(假设值以毫秒为单位),则只需要发出警报即可使用此IF条件:
abs(avg(client_queries[5m]) - avg(client_queries[5m] offset 1w)) > 1000
当然,这个答案只是有关如何解决您的问题的概述,但还远远不够。
#3 楼
我建议elastalert作为Elasticsearch的警报系统,它具有惊人的功能,您可以在elasticsearch上执行任何查询并根据响应定义警报,并且它支持多种警报方式,例如发送电子邮件,闲置或电报,甚至执行特定命令。对于已经在使用ELK的Elasticsearch中的监视数据,您可以使用Kibana进行监视,不仅用于进行Elasticsearch查询并创建非常有价值的仪表板
用于硬件和服务我认为Nagios在那里做得很好,但是对于更简单的解决方案,您可以使用Monit,它非常易于使用和配置,并且可以完成许多工作和服务管理,但是与您已经在使用ELK一样,您可以配置metricbeat监视服务器(CPU,RAM,磁盘使用情况等)
对我来说,最好的方法是将ELK与所有需要的集成一起使用,这将使您拥有更多专注于并集中您的监视和警报系统
评论
您可能会看一下普罗米修斯,它能够发出标准偏差警报,您仍然必须为数据创建一个导出器,但这只是您的查询并相应地返回列表的问题,然后普罗米修斯可以从此列表,并将自己发现新条目。TICK堆栈真的很好。实际上,T I G(grafana)堆栈要好得多。