오늘은 splunk에서 가장 많이 쓰는 시각화 명령어중의 하나인 timechart에 대해서 설명하겠다.
실제로 여러번 쓰지만, 이리 저리 조건을 넣다보면 뭔가 원하는대로 안될 때가 많아서 정리해 둘 필요가 있다고 느꼈다.
이번 포스팅은 공식 문서와, 유튜브 영상을 참고하여 작성했다.
데이터 셋은 스플렁크 공식 사이트에서 다운로드 받았다.
purchase 소스타입의 데이터와, 룩업 파일 데이터를 준비하고 다음과 같은 명령어를 입력해본다.
index=main action="purchase"
| lookup prices productId as productId outputnew product_name, sale_price
문제 없이 로드된다면 준비 완료이다.
보통 시간을 X축으로 하면서 데이터의 통계 값을 보고 싶을때 주로 사용한다. 그리고 split-by 하여 나눠지는 필드 들의 고유한 값이 차트의 Y축을 이루게 된다.
그리고 X축의 시간을 기준으로 Y축에 대한 통계함수를 적용한 결과를 그래프로 확인할 수 있다.
timechart 명령어의 형식을 보면 다음과 같은데, 굵게 표현된 부분만이 필수로 요구되는 인자이며 나머지는 옵션이다.
timechart
[sep=<string>] [format=<string>] [partial=<boolean>] [cont=<boolean>] [fixedrange=<boolean>] [limit=<int>]
[agg=<aggregation>] [<bin-options>... ]
( (<single-aggregate> [BY <split-by-clause>] ) | (<eval-expression>) BY <split-by-clause> ) ) -> 여기 부분 반드시 필요
요약 하자면, 통계함수 만을 사용하거나, 통계함수 + split-by필드는 반드시 필요하다는 의미이다.
timechart에 사용할 수 있는 함수의 종류는 여러가지 이다.
index=main action="purchase"
| lookup prices productId as productId outputnew product_name, sale_price
| timechart span=1h sum(sale_price) as total_sale_price
1시간 단위로 데이터를 나눴을 때, 시간 당 판매 총 금액
을 구하는 쿼리이다. sum함수가 사용되었다. 시간당 총계, 주당 총계와 같이 시간 단위로 데이터를 나눠서 sum, avg, 등의 통계함수를 사용한다.
다음은 주 단위로 기준을 나눴을 때의 판매 총 금액이다.
timechart를 사용할 때에 bin 옵션은 대표적으로 span을 가장 많이 사용한다. 대표적으로 3가지의 옵션이 있는데, 각각 항목에 대해 간략히 설명하겠다.
들어가기 전에 splunk의 공식 문서에서는 timechart로 데이터를 이산화 했을 때에 추출되는 하나의 데이터 항목을 bin이라고 부르는 것 같다.(쉽게 말하면 차트로 보였을때 막대기 그래프 1개)
bins 옵션은 우리가 기존에 알고있는 bin 커맨드랑은 다르다. timechart에서 bins 옵션은 주어진 데이터를 bins=n이라고 했을 때 n개에 가장 유사한 bin의 수로 이산화 해준다. 기본적으로 디폴트 값은 100개 이고, 우리가 따로 bins 옵션을 지정해주지 않으면 timechart 에서는 100개의 가까운 bin의 개수로 차트를 이산화 해준다.
span 은 말 그대로 timechart 에서 x축의 시간을 얼마만큼으로 분할 할 것인지 정해주는 옵션이다. 로그 기반의 범위이며, 이 범위를 맞춤으로써 각 bin의 시간 크기를 설정한다고 생각하면 된다.
이 minspan 옵션이 가장 헷갈렸다. 동영상을 봐도 무슨의미인지 몰랐고, 의미를 유추해서 확인해보면 전혀 다른 결과가 나왔다.
공식 문서에 있는 이 옵션의 역할을 요약하자면 다음과 같다.
데이터 검색 범위에서 가장 작은 span값의 디폴트 값을 지정해주는 옵션이다.
다음과 같은 쿼리를 확인해보자.
검색 범위는 4시간이고, span의 디폴트 옵션 테이블에 의하면 이 경우에는 디폴트 span 값이 5min이다.
그런데 minspan으로 35m을 지정했다. 이렇게 될 경우, 원래 4시간 의 검색일 경우 디폴트 스팬은 5min이다. 하지만, 35m으로 지정했기 때문에 35m의 구간에 속한 값인 1시간이 가장 작은 디폴트 스팬 값으로 수정될 것이다.
이후 minspan을 25m으로 지정하면 25m의 구간에 속한 시간인 30분이 디폴트 스팬 값으로 수정될 것 이다.
이 옵션을 해석하느라 힘들었다.
기존의 디폴트 span값이 minspan값 보다 크면, 적용되지 않는다.
일반적으로 timechart 후 span값을 지정하게 됐을 때 우리가 지정하는 time-range 구간과 span구간이 딱 맞아 떨어지지 않는 경우, 지정하는 time-range 구간 밖의 데이터도 검색하게 된다.
예를 들어 다음과 같이 5/28~5/31까지의 검색을 실행했으나, 그 범위가 벗어난 5/27 21시부터의 검색결과가 나오고 있다.
내가 원하는 것이 검색 시간 부터 정확히 timechart의 결과를 확인하고 싶다면 다음과 같이 사용하면 된다.
혹은 아래 처럼 @d+5m 하게 되면, 시작 날짜
에 5분을 더한 시간부터 12h 구간 으로 timechart 데이터가 생성된다.
다음과 같은 쿼리문이 있을 때 대부분 TOP10의 값만 차트에 표시되고, 나머지 값은 OTHER으로 처리된다. 이때, OTHER이라는 문구에 다른 문자를 넣고 싶다면 이 옵션을 사용하면 된다.
사용한 예시이다.
other 옵션을 끄는 옵션이다. 디폴트가 true이기 때문에 끌 경우에만 옵션 값을 false로 설정해주면 된다.
이렇게 될 경우 Other값이 표시되지 않는다.
만약 여기서 쿼리를 이렇게 바꾼다면, VenderId를 가지지 않은 필드밖에 없음으로. NULL인 필드(없는 값으로 시도)에 대한 집계결과가 나오게 된다. 이럴때 이 NULL을 다른 필드로 채워주는 옵션이 nullstr 이다.
옵션 적용 후 모습이다.
timechart 절 마지막에 where 옵션을 쓸 수 있다. 원래 나는 하단에 search쿼리나, where 쿼리를 또 추가해서 하곤 했는데 이런 유용한 옵션이 있는줄 몰랐다! 조건부 timechart!
그래프가 전체 구간을 채우지 못할 경우 존재하는 bin을 이용해 전체 구간을 채워주도록 그래프 두께를 늘려주고 구간을 데이터가 존재하는 구간까지 맞춰준다.
false 옵션을 지정하면, 데이터가 포함된 시간 데이터로 수정해준다.
출력되는 옵션의 필드명 포맷을 지정해줄 수 있다. 집계함수를 적용한 변수명_실제 변수 값 의 순서로 나오고 있다.