あとで、コマンドの詳細をまとめるかもしれないけど、暫定として
検証
_timeなし.spl
| makeresults
| eval _raw="name
John
John
John
Jack
Jack
Jack
James
James
James"
| multikv forceheader=1
| table name
| stats first(name) last(name) min(name) max(name) earliest(name) latest(name)
| name |
|---|
| John |
| John |
| John |
| Jack |
| Jack |
| Jack |
| James |
| James |
| James |
の表をfirst() last() min() max() earliest() latest()で集計してみる |
結果
| first(name) | last(name) | min(name) | max(name) | earliest(name) | latest(name) |
|---|---|---|---|---|---|
| John | James | Jack | John |
reverseしてみる
| first(name) | last(name) | min(name) | max(name) | earliest(name) | latest(name) |
|---|---|---|---|---|---|
| James | John | Jack | John |
時間をつけてみる
time_add.spl
....
| streamstats count
| eval _time = _time + count
| table _time name
| stats first(name) last(name) min(name) max(name) earliest(name) latest(name)
結果
| first(name) | last(name) | min(name) | max(name) | earliest(name) | latest(name) |
|---|---|---|---|---|---|
| John | James | Jack | John | John | John |
reverseしてみる
| first(name) | last(name) | min(name) | max(name) | earliest(name) | latest(name) |
|---|---|---|---|---|---|
| James | John | Jack | John | James | James |
検証結果
- first() 一番上の値
- last() 一番下の値
- min() 文字列の場合アルファベット順[A-Za-z]の小さい値
- max() 文字列の場合アルファベット順[A-Za-z]の小さい値
ASCIIコード順
- earliest() 時間フィールドがある場合、一番上の値
- latest() 時間フィールドがある場合、一番上の値
流石にlatest()がおかしい、表にしてからだとearliestとlatestはうまく動かないようだ。
別な検証
internal.spl
index=_internal sourcetype=splunkd earliest=-2m@m latest=@m
| stats earliest(_time) AS A earliest(component) as A_1 latest(_time) AS B latest(component) as B_1
| convert ctime(A) ctime(B)
| append [search index=_internal sourcetype=splunkd earliest=-2m@m latest=@m
| table _time component
| stats earliest(_time) AS A latest(_time) AS B by component
| convert ctime(A) ctime(B) ]
| A | A_1 | B | B_1 | component |
|---|---|---|---|---|
| 03/22/2020 09:34:00.221 | ExecProcessor | 03/22/2020 09:35:55.611 | PeriodicHealthReporter | |
| 03/22/2020 09:34:00.221 | 03/22/2020 09:35:31.872 | ExecProcessor | ||
| 03/22/2020 09:34:06.626 | 03/22/2020 09:35:54.608 | LMStackMgr | ||
| 03/22/2020 09:34:36.608 | 03/22/2020 09:35:37.607 | LicenseUsage | ||
| 03/22/2020 09:34:06.604 | 03/22/2020 09:35:39.628 | Metrics | ||
| 03/22/2020 09:34:25.604 | 03/22/2020 09:35:55.611 | PeriodicHealthReporter | ||
ログから検索するとearliestもlatestもキチンと動いていいる。 |
remove_time.spl
index=_internal sourcetype=splunkd earliest=-2m@m latest=@m
| fields - _time
| stats earliest(_time) AS A earliest(component) as A_1 latest(_time) AS B latest(component) as B_1
とすると結果がでない。
earliest_time()とlatest_time()
est_time.spl
index=_internal sourcetype=splunkd earliest=-2m@m latest=@m
| stats earliest_time(component) as A earliest_time(_time) as A1 latest_time(component) as B latest_time(_time) as B1
| convert ctime(A1) ctime(B1)
| A | A1 | B | B1 |
|---|---|---|---|
| 1584837660.445000 | 03/22/2020 09:41:00.445000 | 1584837775.623000 | 03/22/2020 09:42:55.623000 |
時間_timeがあれば、キチンと動いている。 |
時間で確認
time_check.spl
index=_internal sourcetype=splunkd earliest=-2m@m latest=@m
| stats first(_time) as FIRST min(_time) as MIN earliest_time(_time) as EARLIEST latest_time(_time) as LATEST last(_time) as LAST max(_time) as MAX
| convert ctime(FIRST) ctime(MIN) ctime(EARLIEST) ctime(LATEST) ctime(LAST) ctime(MAX)
| FIRST | MIN | EARLIEST | LATEST | LAST | MAX |
|---|---|---|---|---|---|
| 03/22/2020 09:51:09.659 | 03/22/2020 09:50:00.376 | 03/22/2020 09:50:00.376000 | 03/22/2020 09:51:55.640000 | 03/22/2020 09:51:55.638 | 03/22/2020 09:51:55.640 |
first()とlast()の結果が微妙な値になっている。
小数点以下の桁が違うことから、minと違ってearliest_timeは新たに時間の数字を作っているようだ。
まとめ
表にしてからだとearliest()やlatest()といった時間関連の集計はうまく動かない可能性がある。
逆にfirst() last()はログからだと期待した値にならない場合がある。
tableとか使った後は、latest()じゃなく、別な方法を考えてみよう。