본문 바로가기

Splunk Tip

Splunk로 한 달 전 통계값과 지금 통계값을 비교하기

보안 업무든, 경제 업무든,
스플렁크의 stats 기능은 이 프로그램의 알파이자 오메가이다.

하지만 Splunk의 쿼리 언어인 SPL 을 포함한 SQL등의 대부분의 PL은 윗 항의 데이터와 아랫 항의 데이터를 직접적으로 비교하지 못한다.

프로그램 언어가

IF (DATA[n] > DATA[n-1])
    DO ACTION();

같은 로직으로 간단하게 전 후 데이터를 비교 할 수 있지만,

SPL 언어는 (논리적으로) 한 데이터 결과 행마다 한 번씩 쿼리가 실행되는 구조다.
그러므로 1번째 행과 2번째 행은 서로 교류하지 못한다.

하지만 어떻게든 해야한다면 어거지로 만들어낼 수 있다.
아주 간단한 예를 들어 스플렁크가 2달동안 수집한 로그 수를 비교한 뒤,
몇 %가 증감 했는지 계산하는 간단한 쿼리를 써보자

|tstats count by _time span=1mon


위와 같은 쿼리를 2달의 기간을 설정하여 검색하면
월 별로 몇 개의 쿼리를 수집했는지 2개의 결과 행이 출력된다.

하지만 아까 언급했듯이 윗항의 데이터와 아랫 항의 데이터를 직접적으로 비교하지  못하기 때문에
이 두개를 하나의 행으로 합쳐줘야 한다.
일단 이 검색 구문으로는 2개의 행만 나오기 때문에 따로 필터링을 해줄 필요는 없지만,
실무에선 이보다 많은 행 중에서 2개를 골라야 하기 때문에 필터링 구문을 포함하여 작성한다.

|tstats count by _time span=1mon
|top limit=2 _time count


top 명령어는 단독 명령어로 매우 드물게 쓰이긴 한다.
칼럼 명을 n개 (여기선 _time과 count 2개) 적을 경우, 가장 앞에 있는 칼럼인 _time을 내림차 순으로 정렬하여 2개 행만 표시한다.
그러므로 맨 윗행이 최신 달, 아랫행이 그 이전 달로 정렬된다.

이 상태에서 stats 명령어를 한번 더 쓴다.

|tstats count by _time span=1mon
|top limit=2 _time count
|stats first(count) as 이번달로그수 last(count) as 저번달로그수


이렇게 되면  count 칼럼의 가장 첫번째 값을 표시하여 최근 달의 count 값을 표시하고,
last는 이름에서 유추할 수 있듯이 가장 마지막이다.
그렇게 2개 행의 값을 하나의 행으로 합친다.

|tstats count by _time span=1mon
|top limit=2 _time count
|stats first(count) as 이번달로그수 last(count) as 저번달로그수
|eval 증감률=abs(round(1-이번달로그수/저번달로그수,2))*100


그 후 eval 구문을 통해 간단히 증감률을 계산해주면 원하는 결과를 뽑아낼 수 있다.