我有一个索引,其中列出(其中包括)设备,事件日期和级别(1-4)。设备以随机间隔更改级别。我需要进行一次搜索,以显示特定设备在特定级别上运行了多长时间,但是我无法简单地进行计数。如果设备处于级别1的三天,进入级别2的五天,然后回到级别1的两天,则计数将显示五天,这显然是不正确的。如何生成“当前级别的连续天数”字段?
我需要一个查询,报告当前级别的设备,日期,级别和天数。谢谢!
答案 0 :(得分:0)
我怀疑您正在寻找transaction。这会将事件与匹配(或其他条件)的字段进行分组,并报告事件的数量和持续时间。
不幸的是,目前还不清楚您的数据是什么样子。...起初,我认为这可能是您的数据的近似值...设备在随机时间检入,并提供有关它们恰好处于什么级别的报告当时:
| makeresults count=100
| eval decrementsecs=random()%10, decrementday=random()%2,state=random()%4+1,device=random()%10+1,device=case(device=1,"A",device=2,"B",device=3,"C",device=4,"D",device=5,"E",device=6,"F",device=7,"G",device=8,"H",device=9,"I",device=10,"J")
| streamstats sum(decrementday) as days sum(decrementsecs) as secs
| eval _time=_time-secs-(24*60*60*days)
| fields - days secs decrement*
在这个采样世界中,您正在寻找自设备报告状态不同于最近报告的状态以来经过的时间...
<base search>
| streamstats current=f global=f window=2 last(state) as last by device
| where isnull(last) OR last!=state
| dedup 2 device
| transaction device
| eval days_at_current_level=if(eventcount=2,round(duration/(24*60*60)),"unknown")
但是,如果这些样本不是样本,而实际上是过渡本身,则:
<base search>
| stats max(_time) as _time latest(state) as level by device
| eval days_at_current_level=round((now()-_time)/(24*60*60))
但是从您的描述方式来看,好像您有X台设备,每台设备每天都会报告其状态……在这种情况下,您的数据可能看起来像这样:
| makeresults count=10
| streamstats count
| eval _time=_time-(24*60*60*(count-1)), device=split("A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P",",")
| mvexpand device
| eval level=random()%4+1
在这种情况下,由于我不担心几天之内的变化,我的搜索可能看起来很简单:
<base search>
| transaction device level
(请谨慎处理事务,了解所需的数据,并限制进入事务的数据以提高性能...如果只需要_time,设备和级别,请使用字段来除掉其他所有内容在事务之前。...例如... | fields - _raw | fields _time device level
通过限制事务之前的数据,可以限制从索引器返回的数据,并限制事务命令需要保持在一起/跟踪的数据量。从而获得更好的性能)