Splunk eventstats streamstats

Munang·2022년 2월 15일
2

splunk

목록 보기
1/57

eventstats, streamstats에 관해 설명한다.

1. eventstats

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

2. streamstats

streamstats 명령어가 이해하기 참 난해했다. 번호를 메기는 건지..? 뭐 하는 건지..? 증가하는 수 같은데 unix time처럼 pk와 같은 형태의 값을 만드는 용도인지...

일단 splunk 공식 문서로 이해한 내용은 다음과 같다. stats지만, stream이라는 의미가 계속해서 이어진다는 의미를 지닌다. 그래서 우리가 스트리밍한다. 스트리밍할 예정이다 라는 의미도 끊기지 않고 계속한다는 의미이다.

고로 이러한 끊기지 않도록 계속 stats연산을 해준다는 의미이다.

예시로 확인해보면 다음과 같다.

1) 단순 streamstats

  • 단순히 각 이벤트의 실행 횟수를 추가해준다. 무슨소리냐고? 그냥 순차적으로 넘버를 메겨준다는 의미이다.
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

2) stats 함수를 사용한 streamstats

명령어는 이렇게 사용했다. 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

3) 조건에 따라 reboot 하는 방식의 streamstats

데이터 셋은 다음과 같다.

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

0개의 댓글