如何通过迭代每秒来计算业务/ SLA小时数?

时间:2016-03-03 13:59:02

标签: perl

在我花费大量时间编写我能想到的唯一解决方案之前,我想知道我是否采用效率低下的方式。

关闭支持服务单后,会触发一个脚本,脚本会传递一系列状态更改事件'从打开到关闭发生的事情。所以你可能有5个变化:新的,开放的,活跃的,停滞的,已经解决的。这些事件中的每一个都有一个与之关联的时间戳。

我需要做的是计算通话给我们的时间(新的,开放的,有效的)以及与客户的停留时间(停滞)。我还需要弄清楚我们有多少' us'时间是在核心时间08:00 - 18:00(有多少是非核心的),周末/银行假日计入非核心时间。

我目前的想法是针对每个状态更改,迭代发生的每一秒并检查核心/非核心,并记录它。

这里有一些伪代码:

time_since_last = ticket->creation_date

foreach events as event {
    time_now = time_since_last

    while (time_now < ticket->event_date) {

        if ticket->status = stalled {

            customer_fault_stalled++

        } else {

            work out if it was our fault or not
            add to the appropriate counter etc

        }

        time_now++
    }
}

道歉,如果它有点不清楚,这是一个相当漫长的问题。我也知道这可能略微偏离了SO问题指南,但我无法想出一个更好的措辞方法,我需要一些建议才能用这种方式写几天。

3 个答案:

答案 0 :(得分:2)

我认为你有正确的想法,但每隔一段时间重新计算每张票的状态将需要大量的处理,而且这些间隔的绝大多数都没有任何改变

事件模拟的工作方式以及我认为您应该编写应用程序的方式是创建状态可能发生变化的所有事件的列表。因此,您需要为每个故障单包含所有状态更改事件以及所有非银行假日工作日的核心时间的开始和结束

事件列表按时间戳排序,之后您可以像处理每秒计数器一样处理每个事件。不同之处在于,您不再需要计算没有任何变化的许多中间秒,并且最终应该使用更高效的应用程序

我希望这很清楚。您可能会发现单独处理每个票证更容易,但最大收益将通过同时处理所有票证来实现。您仍然需要处理已排序的事件序列,但您将避免不得不一遍又一遍地重新处理相同的核心时间开始和结束事件

我注意到的另一件事是您可能会忽略任何open状态更改事件。我猜这些门票要么从newopen再到active,要么直接从newresolved。因此,与您的公司与客户之间的切换永远不会在open事件中进行,因此可以忽略它们。请检查一下,因为我只是根据自己的直觉说话,并且清楚地知道你的票务系统是如何设计的

答案 1 :(得分:1)

我不会迭代秒。取决于您的计算成本可能非常昂贵。计算核心/外核之间的边界会更好。

use strict;
use warnings;

my $customer_time;
my $our_time_outside;
my $our_time_core;

foreach my $event ($ticket->events) {
    my $current_ts = $event->start_ts;
    while ($current_ts < $event->end_ts) {
        if ($event->status eq 'stalled') {
            $customer_time += $event->end_ts - $current_ts;
            $current_ts = $event->end_ts;
        }
        elsif (is_core_hours($current_ts)) {
            my $next_ts = min(end_of_core_hours($current_ts), $event->end_ts);
            $our_time_core += $next_ts - $current_ts;
            $current_ts = $next_ts;
        }
        else {
            my $next_ts = min(start_of_core_hours($current_ts), $event->end_ts);
            $our_time_outside += $next_ts - $current_ts;
            $current_ts = $next_ts;
        }

    }
}

答案 2 :(得分:0)

我不明白为什么你想要每秒迭代一次。这似乎非常浪费。

  • 获取给定故障单的所有事件的列表。
  • 将核心和非核心时间之间的任何边界添加到列表中。
  • 按时间顺序对此列表进行排序。
  • 对于列表中的每个连续事件对,从较早的事件中减去较晚的事件以获得持续时间。
  • 将该持续时间添加到相应的存储桶中。

处理日期和时间的常见警告适用于此:

  • 使用图书馆(我建议DateTimeDateTime::Duration
  • 获取后立即将所有时间戳转换为UTC。只有在将它们显示给用户之前才转换回本地时间。