InfluxDB计算点之间的经过时间

时间:2018-03-26 13:35:49

标签: influxdb

我有一系列值来指定作业的状态,无论是成功还是失败。

系列中的每个项目都有一个类型,也有一个分组ID。它是一个依赖序列,因此如果作业bar成功,将会运行ID A的作业foo

idx time                    id     type    status
1   2018-01-01T00:00:00     A      foo     success
2   2018-01-01T01:00:00     A      bar     success
3   2018-01-02T00:00:00     B      foo     success
4   2018-01-02T02:00:00     B      bar     success
5   2018-01-03T00:00:00     C      foo     success
6   2018-01-03T03:00:00     C      bar     success
7   2018-01-04T00:00:00     D      foo     success
8   2018-01-04T01:00:00     D      bar     success
9   2018-01-05T00:00:00     E      foo     success
10  2018-01-05T01:00:00     E      bar     success
11  2018-01-06T00:00:00     F      foo     failure
12  2018-01-07T00:00:00     G      foo     failure
13  2018-01-08T00:00:00     H      foo     recovery
14  2018-01-08T03:00:00     H      bar     success
15  2018-01-09T00:00:00     I      foo     failure
16  2018-01-10T00:00:00     J      foo     failure
17  2018-01-11T00:00:00     K      foo     recovery
18  2018-01-11T03:00:00     K      bar     success

我需要计算每个作业类型的依赖作业和恢复时间之间的时间。

对于上述数据,依赖作业系列之间的时间将为:

  • 已过去(1,2)(A组)
  • 过去了(3,4)(B组)
  • 已过去(5,6)(C组)
  • 已过去(7,8)(D组)
  • 已过去(9,10)(E组)
  • 已过去(13,14)(H组)

恢复时间系列将是:

  • 已过去(11,13)(在组F和H之间)
  • 已过去(15,17)(在组I和组K之间)

我已经使用elapsed()difference()聚合来获得我需要的东西,但它似乎不够优雅。

有关恢复时间系列:

我添加了成功"值为我的点,整数指定为"成功"或"恢复",0为"失败"。

我在其上使用difference()来确定该点是新故障(-1),重复先前状态(0)还是恢复(+1)。过滤掉零值会给我带来失败和恢复。

这些点上的

elapsed()给出了故障和恢复之间的时间,以及恢复和下一次故障。这些可以通过将cumulative_sum()差异成功添加到最终系列来区分(-1是失败; 0是恢复)然后仅过滤恢复。

SELECT elapsed FROM (
    SELECT elapsed(diff) as elapsed, cumulative_sum(diff) as csum FROM (
        SELECT diff from (
            SELECT difference(success) AS diff FROM test WHERE type = 'foo'
        ) WHERE diff != 0
    )
) WHERE csum = 0

上述数据集的结果:

time                 elapsed
----                 -------
2018-01-08T00:00:00Z 172800000000000
2018-01-11T00:00:00Z 172800000000000

关于从属工作系列之间的时间:

这可以通过相同的技巧完成,添加一个指定作业类型的整数值。如果bar,则type = 'bar'下面的值为1,否则为0。

SELECT elapsed FROM (
    SELECT elapsed(success) as elapsed, difference(bar) as diff
        FROM test WHERE type='bar' OR (type='foo' AND success=1)
) WHERE diff = 1

上述数据集的结果:

time                 elapsed
----                 -------
2018-01-01T01:00:00Z 3600000000000
2018-01-02T02:00:00Z 7200000000000
2018-01-03T03:00:00Z 10800000000000
2018-01-04T01:00:00Z 3600000000000
2018-01-05T01:00:00Z 3600000000000
2018-01-08T03:00:00Z 10800000000000
2018-01-11T03:00:00Z 10800000000000

有更好的方法吗?要么完全不同的策略,要么不必将所有这些整数值添加到我的点,例如将difference()应用于计算字段?

大多数复杂性来自于尝试从系列中选择其他所有点。有没有更好的方法呢?

0 个答案:

没有答案