eventstats, streamstats에 관해 설명한다.
stats를 이용해 그룹화 하여 나온 결과를 다시 컬럼으로 사용할 수 있는 기능이다.
말 그대로 stats를 이벤트 성으로 사용하겠다는 의미이다.
다음과 같은 데이터 셋이 있다고 하자.
_time age city count
2020-02-05 18:32:07 25 San Francisco 1
2020-02-05 18:32:07 39 Seattle 2
2020-02-05 18:32:07 31 San Francisco 3
2020-02-05 18:32:07 Seattle 4
이때, 다음과 같은 쿼리를 사용한다.
| makeresults count=4
| streamstats count
| eval age = case(count=1, 25, count=2, 39, count=3, 31, count=4, null())
| eval city = case(count=1 OR count=3, "San Francisco", count=2 OR count=4, "Seattle")
| stats avg(age) BY city
그럼 원래는 이러한 결과가 나와야 한다.
avg(age) city
25 San Francisco
39 Seattle
31 San Francisco
22 Seattle
그런데, 이 평균 나이를 기존 테이블이 가지고 있던 행 옆에 바로 붙이고 싶다면?
즉, 새로운 컬럼으로 추가하고 싶다면 stats를 eventstats로 바꾸면 된다.
| makeresults count=4
| streamstats count
| eval age = case(count=1, 25, count=2, 39, count=3, 31, count=4, null())
| eval city = case(count=1 OR count=3, "San Francisco", count=2 OR count=4, "Seattle")
| eventstats avg(age) BY city
이렇게 하면 아래와 같은 결과가 나온다.
_time age avg(age) city count
2020-02-05 18:32:07 25 28 San Francisco 1
2020-02-05 18:32:07 39 39 Seattle 2
2020-02-05 18:32:07 31 28 San Francisco 3
2020-02-05 18:32:07 39 Seattle 4
streamstats 명령어가 이해하기 참 난해했다. 번호를 메기는 건지..? 뭐 하는 건지..? 증가하는 수 같은데 unix time처럼 pk와 같은 형태의 값을 만드는 용도인지...
일단 splunk 공식 문서로 이해한 내용은 다음과 같다. stats지만, stream이라는 의미가 계속해서 이어진다는 의미를 지닌다. 그래서 우리가 스트리밍한다. 스트리밍할 예정이다 라는 의미도 끊기지 않고 계속한다는 의미이다.
고로 이러한 끊기지 않도록 계속 stats연산을 해준다는 의미이다.
예시로 확인해보면 다음과 같다.
host _time
x 2019-07-16T00:00:00.000Z
y 2019-07-15T00:00:00.000Z
x 2019-07-14T00:00:00.000Z
x 2019-07-13T00:00:00.000Z
y 2019-07-12T00:00:00.000Z
The output would look like this:
host _time count
x 2019-07-16T00:00:00.000Z 1
y 2019-07-15T00:00:00.000Z 2
x 2019-07-14T00:00:00.000Z 3
x 2019-07-13T00:00:00.000Z 4
y 2019-07-12T00:00:00.000Z 5
명령어는 이렇게 사용했다. host별로 count를 적용하겠다는 의미
| from <dataset> | streamstats count() BY host
For example, if your data looks like this:
host _time
x 2019-07-16T00:00:00.000Z
y 2019-07-15T00:00:00.000Z
x 2019-07-14T00:00:00.000Z
x 2019-07-13T00:00:00.000Z
y 2019-07-12T00:00:00.000Z
The output would look like this:
host _time count
x 2019-07-16T00:00:00.000Z 1
y 2019-07-15T00:00:00.000Z 1
x 2019-07-14T00:00:00.000Z 2
x 2019-07-13T00:00:00.000Z 3
y 2019-07-12T00:00:00.000Z 2
데이터 셋은 다음과 같다.
host bytes action
x 100 LOGON
y 200 APP_START
x 400 FILE_DOWNLOAD
x 50 REBOOT
y 150 LOGON
x 100 LOGON
이때, streamstats를 사용해서 host별로 sum연산을 수행한다. 이때 reset조건이 걸리는데 action값이 REBOOT이후에는 기존에 수행했던 sum값을 리셋하라는 의미이다.
| streamstats sum(bytes) AS total_bytes BY host reset after action="REBOOT"
host bytes action total_bytes
x 100 LOGON 100
y 200 APP_START 200
x 400 FILE_DOWNLOAD 500
x 50 REBOOT 550
y 150 LOGON 150
x 100 LOGON 100
reset before을 사용하면 다음과 같은 결과가 나온다.
host bytes action total_bytes
x 100 LOGON 100
y 200 APP_START 200
x 400 FILE_DOWNLOAD 500
x 50 REBOOT 50
y 150 LOGON 150
x 100 LOGON 150