如何根据相似的时间戳将数据行合并到新表中?(python/MySQL/PHP)

2024-04-23 07:23:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我不确定这个标题是否是表达我实际问题的好方法,如果这个问题太笼统,我很抱歉,但我在思考如何做某事时遇到了一些麻烦。你知道吗

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

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

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

2012-05-01至2012-06-30测试检查的Pindom警报:

测试检查报告于2012年5月24日00:11:11发布 测试检查报告于2012-05-24 00:17:28发布 2012年5月24日00:25:24报告了测试检查 2012年5月24日00:25:48进行了测试检查

我想要的是这样的:

测试检查被报告了15分钟(2012-05-24 00:11:11到2012-05-24 00:25:48)(链接到对这次大修的评论)(链接到这次大修的信息)。你知道吗

在这个理想的最终结果中,将有一行包含中断ID,服务器的主机名pingdom正在报告关闭,最初向下报告该框的时间戳和再次向上报告该框的时间戳以及“注释”字段I(和其他管理员)将用于在事件发生后添加有关该特定事件的注释。我不确定在从pingdom中提取警报时是否应该尝试这样做,或者在收集警报后是否应该重新处理它们以填充新表,我也不确定如何解决这两个选项中的任何一个。你知道吗

对于如何将短时间内发生的多个停机警报合并到一个“停机”中,然后插入到现有MySQL数据库中的一个单独表中(当前存储单个停机警报),我有点不知所措。这将允许我评论和添加具体细节,以供将来参考,通常会使这个东西更有用。我不确定在从pingdom中提取警报时是否应该尝试这样做,或者在收集警报后是否应该重新处理它们以填充新表,我也不确定如何解决这两个选项中的任何一个。你知道吗

我绞尽脑汁想知道怎么做。这似乎是一个简单的概念,但我是一个有点缺乏经验的程序员(我是Linux管理员的职业),我在这一点上难住了。你知道吗

我正在寻找任何想法,建议,例子,甚至只是一个更技术性的解释,我在这里试图做什么,以帮助我在正确的方向。我希望这有道理。提前感谢您的建议:)


Tags: 方法服务器数据库表单列表链接报告时间
2条回答

对于现在的设置,最基本的解决方案是:

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

我看到的唯一复杂之处是,下次运行脚本时,需要确保继续监视上次运行脚本时仍在发生的事件。你知道吗

  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

相关问题 更多 >