0

不确定标题是否是表达我的实际问题的好方法,如果这个问题过于笼统,我深表歉意,但我在思考如何做某事时遇到了一些麻烦。

我正在尝试做的事情:这个想法是为我负责监控的数千台服务器创建一个“中断”的 MySQL 数据库。这将提供停机时间的历史记录,并提供一种简单的方法来追溯发生的事情。该数据库将通过一个相当简单的 PHP 表单进行查询,您可以在其中按日期或服务器主机名等浏览这些中断。

到目前为止我所拥有的:我有一个 python 脚本,它定期作为 cron 运行,以调用 Pingdom API 以获取 pingdom 服务报告的当前停机警报列表。对于每个停机警报,将一行插入包含主机名、时间戳、pingdom 检查 ID 等的数据库中。然后我有一个简单的 php 表单,可以很好地查询停机警报。

问题:我现在所拥有的缺少一些重要的功能,并不是我想要的。目前,查询这个数据库会给我一个简单的向下警报列表,如下所示:

从 2012-05-01 到 2012-06-30 的 Test_Check 的 Pindom 警报:

test_check 在 2012-05-24 00:11:11 报告为 DOWN test_check 在 2012-05-24 00:17:28 报告为 DOWN test_check 在 2012-05-24 00:25:24 报告为 DOWN test_check 在2012-05-24 00:25:48

我想要的是这样的:

test_check 被报告了 15 分钟(2012-05-24 00:11:11 到 2012-05-24 00:25:48)(链接到此中断的评论)(链接到有关此中断的信息)。

在这个理想的最终结果中,将有一行包含中断 ID、服务器 pingdom 的主机名报告故障、该框最初报告故障的时间戳和再次报告故障的时间戳以及“注释” ' 我(和其他管理员)在事后将使用该字段添加有关此特定事件的注释。我不确定在从 pingdom 中提取警报时是否应该尝试执行此操作,或者是否应该在收集警报以填充新表后重新处理它们,我也不太确定我会如何解决这些选项中。

我对如何将在短时间内发生的多个停机警报组合成一个“中断”感到有点迷茫被存储。这将允许我评论并添加具体细节以供将来参考,并且通常会使这个东西更有用。我不确定在从 pingdom 中提取警报时是否应该尝试执行此操作,或者是否应该在收集警报以填充新表后重新处理它们,我也不太确定我会如何解决这些选项中。

我一直在绞尽脑汁想弄清楚如何做到这一点。这似乎是一个简单的概念,但我是一个有点缺乏经验的程序员(我是一名专业的 Linux 管理员),在这一点上我很难过。

我正在寻找任何想法、建议、示例,甚至只是对我在这里尝试做的更技术性的解释,以帮助我指明正确的方向。我希望这是有道理的。提前感谢您的任何建议:)

4

2 回答 2

0
  1. 从存储和查询中断数据的角度定义您最喜欢的数据库模式。(基于间隔。)
  2. 从记录 Pindom 事件的角度定义您最喜欢的存储过程签名(参数)。(基于事件。)一定要记录成功的 ping,这样您就可以从两个短的中断中分辨出长时间的中断。
  3. 按规定实施程序。
  4. 每次 ping 后调用该过程。

该过程的主体可能大致如下(伪代码):

-- First, select the last interval as o1, and update it if the status is unchanged
UPDATE Interval SET ended = CURRENT_TIMESTAMP
FROM Interval AS o1 LEFT JOIN Interval o2 ON o2.ended > o1.ended
WHERE o2 IS NULL AND o1.status = @currentStatus

-- If the status changed, insert a new interval with the current status
IF ROW_COUNT() = 0 THEN
    INSERT INTO Interval VALUES (...) 
END IF
于 2012-07-04T13:14:16.850 回答
0

您现在拥有的设置的最基本解决方案是:

  • 获取所有事件的列表,按服务器 ID 排序,然后按事件时间排序
  • 循环遍历该列表并在以下情况下为新数据库记录新事件的开始/旧事件的结束:
    1. 服务器 ID 更改
    2. 当前事件与来自同一服务器的上一个事件之间的时间大于您设置的某个阈值。
    3. 将您正在监视的旧事件存储在新数据库中

我看到的唯一复杂情况是,下次运行脚本时,您需要确保继续监视上次运行脚本时仍在发生的事件。

于 2012-07-04T13:09:14.090 回答