1

想知道是否有人处理过此类问题并可以提供任何建议:

我正在解析一个日志文件以查看主机是否/何时出现故障以及它们的总停机时间是多少。我的问题是我不确定如何确定主机是否在另一台倒下的主机的时间范围内(我不想计算两次)

例子:

主机A在14:15-14:18下降

主机B在14:16-14:21下降

主机C在14:17-14:20下降

这将导致

Host A 造成 3 分钟宕机

主持人B 3分钟

主机 C 为 0(其他主机当时已经关闭)

现在,我正在推动一个数组 upTime:downTime - 我认为一个数组将是最容易遍历和比较的。虽然不确定解决这个问题的最佳方法是什么..

                push(@arr, "$tempdown:$upTime"); 
        }
    }
}   
}


#temp vars x and y rep downtime and uptime
#count from x..y and see if any other service has fallen within x-y
for my $index (@arr) {
my $tempx;
my $tempy;
if ($index=~/(.*):/ && /($index=~(.*:(.*)/) {
    $tempx = $1;
    $tempy = $2;
}
for ($tempx..$tempy) {
.
.
.
4

2 回答 2

1

在我看来,您希望将数据组织为:

  • T s——一段停机时间的开始时间。
  • T e — 一段停机时间的结束时间。
  • H t — 主机“负责”一段停机时间。

您将能够按 T s的顺序对停机时间段进行排序。您将需要一种机制来解决两台(或更多)机器同时启动一段停机时间的关系(根据记录时间的分辨率)。再往下,我建议二级键是 latest T e,然后三级键是主机名的字母。

然后,您可以按 T s逐步浏览停机时间段的有序列表。

对于每个停机时间段:

  • H t在它停机的整个过程中都受到了责备。
  • 对于在 T e之前开始的每个停机时间段:
    • 从另一台主机的停机时间中减去周期 T s .. T e 。
  • 为下一次迭代重新排序数据。

给定您的样本数据,我们得到:

  • T s = 14:15,T e = 14:18,H t = A
  • T s = 14:16,T e = 14:21,H t = B
  • T s = 14:17,T e = 14:20,H t = C

这是正确的排序顺序。我们将假设同时停机的主机按字母顺序排序。

算法选择 A:

  • 主持人 A 被指责为 14:15-14:18(3 分钟)。

调整其他主机的时段:

  • T s = 14:18,T e = 14:21,H t = B
  • T s = 14:18,T e = 14:20,H t = C

该算法现在选择 B

  • 主持人 B 被指责为 14:18-14:21(3 分钟)。

其他主机的周期被调整,主机C的记录被擦除,因为它剩下的时间完全被主机B的停机时间覆盖了。

您可以看到决胜局排序非常重要;在第二次迭代中,系统 B 和 C 都停机了,一旦 A 恢复,必须有一种方法来确定哪个是停机时间。您很可能会决定其中一个标准是“最初哪个主机首先宕机”,因此您保留 T d的记录,即服务器首次宕机的时间。这在算法期间不会改变,但 T s会随着算法的进行而调整。您可能还决定订购的一部分是“最新的 T e' 这样在任何给定时间停机时间最长的机器都会在停机时为停机负责,而之前停机的系统仍然没有停机。这意味着如果 A 也从 14:19-14:30 下降,它不会因 14:18-14:21 而受到指责,但会因 14:21-14:30 而受到指责。

于 2012-07-01T22:36:20.113 回答
1

当只有小时:分钟而不是像 YYYY-MM-DD HH:MM 这样的时间时,代码很棘手。这在当时可以被毫不含糊地解析。如果您可以更改记录器输出以提供完全限定的日期,那么您的工作会变得更加简单。下面的代码可以做到这一点。(免责声明:开始时间必须按时间顺序排列,否则有必要先对它们进行排序)。

(注意:对于此数据,我将时间分隔符从“-”更改为“\t”)

#!/usr/bin/perl
use strict;
use warnings;
use DateTime::Format::Strptime;

my $re = '(\S{10}\s\S{5})\t(\S{10}\s\S{5})$';
my $max;
my $parser = DateTime::Format::Strptime->new(pattern => '%F %H:%M');

while (<DATA>) {
    chomp;
    my ($start, $stop) = /$re/ or die $!;

    $_ = $parser->parse_datetime($_) for $start, $stop;

    # one time initialization of $max for first record
    $max //= $start;

    # when there are breaks in the continuity
    $max = $start if $max < $start;

    my $minutes = $stop <= $max ? 0 : $max->delta_ms($stop)->in_units('minutes');

    printf "$_ %2d minutes\n", $minutes;
    $max = $stop if $max < $stop; # stop is the new max if stop > max
}

__DATA__
Host A fails at 2012-07-03 14:15    2012-07-03 14:18
Host B fails at 2012-07-03 14:16    2012-07-03 14:21
Host C fails at 2012-07-03 14:17    2012-07-03 14:20
Host D fails at 2012-07-03 23:57    2012-07-04 00:05
Host E fails at 2012-07-03 23:58    2012-07-04 00:07
Host F fails at 2012-07-04 00:00    2012-07-04 00:08
Host G fails at 2012-07-04 00:01    2012-07-04 00:09
Host H fails at 2012-07-04 00:02    2012-07-04 00:08
Host I fails at 2012-07-04 14:17    2012-07-04 14:20
Host J fails at 2012-07-04 23:57    2012-07-04 23:59
Host K fails at 2012-07-05 00:00    2012-07-05 00:10
Host L fails at 2012-07-05 00:02    2012-07-05 00:09
Host M fails at 2012-07-05 00:02    2012-07-05 00:11
Host N fails at 2012-07-05 00:02    2012-07-05 00:10

它产生了以下输出:

Host A fails at 2012-07-03 14:15        2012-07-03 14:18  3 minutes
Host B fails at 2012-07-03 14:16        2012-07-03 14:21  3 minutes
Host C fails at 2012-07-03 14:17        2012-07-03 14:20  0 minutes
Host D fails at 2012-07-03 23:57        2012-07-04 00:05  8 minutes
Host E fails at 2012-07-03 23:58        2012-07-04 00:07  2 minutes
Host F fails at 2012-07-04 00:00        2012-07-04 00:08  1 minutes
Host G fails at 2012-07-04 00:01        2012-07-04 00:09  1 minutes
Host H fails at 2012-07-04 00:02        2012-07-04 00:08  0 minutes
Host I fails at 2012-07-04 14:17        2012-07-04 14:20  3 minutes
Host J fails at 2012-07-04 23:57        2012-07-04 23:59  2 minutes
Host K fails at 2012-07-05 00:00        2012-07-05 00:10 10 minutes
Host L fails at 2012-07-05 00:02        2012-07-05 00:09  0 minutes
Host M fails at 2012-07-05 00:02        2012-07-05 00:11  1 minutes
Host N fails at 2012-07-05 00:02        2012-07-05 00:10  0 minutes

希望这有帮助,

克里斯

于 2012-07-04T16:02:31.253 回答