kibana kql을 이용한 filter 사용법을 익혀봅시다.

ELK 2022. 11. 10. 23:55

 제가 생각했을 때, kibana에서 discovery를 볼 때의 핵심은 filter를 잘 거는 것입니다. 예를 들자면, 우리는 status가 4xx 대인 것만 필요로 합니다. 그런데 2xx인 것까지 볼 필요가 전혀 없을 것입니다. 이는 visualize 할 때도 마찬가지입니다. KQL을 이용해서 필터를 걸어보겠습니다.

 

 여기서 KQL은 Kibana Query Language를 의미합니다. 8.5.0 버전을 기준으로 작성되었으니 참고 부탁드립니다.

 


 Sample data중 하나인 항공 데이터입니다. 각 항공편에 대해 여러 유용한 정보들이 있는데요. 비행 거리가 얼마인지, 비행 시간이 어느 정도인지 등을 얻어올 수 있습니다. 저는 비행 거리가 10000km 이상인 항공편만 뽑아오고 싶습니다.

 

   

 비행 거리 (km)는 DistanceKilometers에 있습니다. 이것이 10000보다 크면 되므로, DistanceKilometers >= 10000을 입력하면 됩니다. 그러면, 해당 수치가 10000 이상인 것만 뽑아져서 나옵니다.

 

 몇 개의 필드들을 추가해서 보니, OriginAirportID랑 DestAirportID가 있네요. 출발 공항과 도착 공항에 대한 정보도 들어가 있습니다. 인천공항의 코드는 "ICN"입니다. 이제, 비행 거리가 10000km 이상이면서, 출발 공항이 인천공항인 것을 뽑아보겠습니다.

 

 

 A이면서 B이다. and 조건으로 연결됩니다. KQL에서도 이렇게 and 조건으로 연결되면 and로 이어줍니다. DistanceKilometers >= 10000이 제 1조건, OriginAirportID : "ICN"이 제 2조건입니다. 이 두 조건을 동시에 만족한 것만 나타냅니다. 9개네요.

 

 

 ICN에서 JFK로 날라가는 항공편이 11113km입니다. ICN에서 출발했으니, 2조건도 만족합니다. 그리고, 10000km도 넘었으니 1조건도 만족합니다.

 

 Documents에서, 어떤 필드를 기준으로 sort 할 것인지 보는 방법이 있습니다. Documents 밑에 있는 Columns 옆에 있는 메뉴를 누르시면, 어떤 필드를 정렬할 것인지 선택하는 창이 나오는데요. DistanceKilometers를 선택하고 정렬 기준을 선택해 보겠습니다.

 

 

 그러면 비행 거리가 낮은 순에서 높은 순으로 정렬됩니다.

 


 이제, 비행 거리가 1만 km 이상이거나, 평균 티켓 가격이 1000달러 이상인 것을 찾아봅시다. A이거나 B이거나. or 조건입니다. KQL에서도, or 조건으로 연결해 주면 됩니다.

 

 1조건은 비행 거리가 10000km 이상이고, 2조건은 평균 티켓 가격이 1000달러 이상인 것입니다. or로 연결했으니, 1조건과 2조건 중 하나만 만족해도 결과에 뜨게 됩니다.

 

 

 1번째 줄에 있는 문서는 티켓 가격이 251달러입니다. 그렇지만 비행 거리가 10000km를 넘어갑니다. 2조건을 만족하지 않지만, 1조건을 만족하기 때문에, 결과에 뜨게 됩니다.

 

 

 이제 NOT을 알아봅시다. NOT A가 참이 되려면, A가 거짓이여야 합니다. 즉, 어떤 조건이 거짓인 경우에만 결과에 뜨게 하려면, 앞에 NOT을 붙여주면 됩니다. OriginCountry는 출발 나라, DestCountry는 도착 나라입니다. 우리는 한국에서 출발하지만, 일본이 아닌 다른 나라에 도착하는 항공편에 대한 정보들을 얻어오려고 합니다. 어떻게 하면 좋을까요? 일단 조건 1은 한국에서 출발한다. 이고, 조건 2는 일본에 도착하지 않는다입니다. 즉, 일본에 도착한다의 NOT이 되겠습니다.

 

 일단, 한국에서 출발하는 항공편 수가 101개입니다.

 

 

 그리고 위 스크린샷의 쿼리는 출발 나라가 한국이고, 도착 나라가 일본입니다. 11 hits입니다. 그러면, 한국에서 출발했지만, 일본에 도착하지 않는 항공편의 수는 101에서 11을 뺀 90이 될 겁니다.

 

 

 2조건의 맨 앞에 NOT을 붙인 것을 보시면 됩니다. NOT (DestCountry : "JP")는 DestCountry : "JP"가 거짓인 것만 뽑아냅니다. 즉, 일본에 도착하지 않는 조건을 만족하는 문서만 뽑아냅니다.

 


 *도 있습니다. *은 어떠한 캐릭터 0개 이상을 의미합니다. 간단하게 어떻게 쓰는지만 예제만 보고 가겠습니다.

 

 OriginCountry : A*입니다. A 다음에 0개 이상의 문자가 오면 됩니다. 즉, OriginCountry가 A라는 문자로 시작하는 것만 뽑아옵니다.

 

 

 이번에는 OriginAirportID : *C*입니다. C 앞에도 0개 이상의 문자가, 뒤에도 0개 이상의 문자가 옵니다. 즉, OriginAirportID가 C라는 문자를 포함하면 됩니다. 조금 더 자세한 내용은 문서를 참고하시면 되겠습니다.