본문 바로가기

데이터베이스(DA, AA, TA)/데이터처리

[ELK] 키바나 사용법 정리

키바나는 오픈소스 웹기반 분석 및 시각화 도구다. 엘라스틱서치에 저장된 데이터를 다양한 테이블과 지도, 차트 등을 사용해 시각화할 수 있다. 사용자는 간단한 인터페이스를 사용해 손쉽게 엘라스틱서치에 저장된 많은 양의 데이터를 탐색하고 실시간으로 데이터 분석을 할 수 있다.

 

키바나는 시각화 생성에 사용하는 데이터를 쿼리하기 위해 엘라스틱서치에 의존하는 시각화 도구이다. 따라서 키바나를 사용하려면 엘라스틱서치를 설치하고 실행해야 한다. 키바나는 JVM에서 실행되는 엘라스틱서치와 로그스태시와 달리 node.js로 실행하는 웹애플리케이션이다. 키바나를 실행하면 http://localhost:9200 에서 구동 중인 엘라스틱서치에 연결을 시도한다. 기본 포트는 5601로 시작하며, 웹브라우저를 사용해 접근할 수 있다. 키바나의 서버상태는 http://localhost:5601/status 에서 확인할 수 있다. 상태 페이지에서는 서버의 자원 사용률과 설치한 플러그인 정보를 확인할 수 있다.

 

키바나는 엘라스틱서치 노드와 같은 버전을 사용하도록 설정해야 한다. 키바나와 엘라스틱간에 다른 배포 버전, 즉 키바나는 6.0.0 버전을 사용하고 엘라스틱서치는 6.0.1 버전을 사용하는 것처럼 버전이 달라고 구동은 되지만, 권장사항은 아니다. 키바나 5.x와 엘라스틱서치 2.x와 같이 메이저 버전이 다른 경우와 마이너 버전이 다른 경우도 지원 대상이 아니므로 유의해 사용해야 한다.

 


키바나는 5601번 포트에서 실행하고, 시작 시점에 9200번 포트에서 실행 중인 엘라스틱서치에 연결을 시도한다. 엘라스틱서치로 색인된 로그 이벤트, 즉 도큐먼트 개수를 보려면 다음과 같이 입력하면 된다.

curl -XGET http://localhost:9200/logstash-*/_count

 

키바나를 사용자 상호 작용 관점에서 바라보면 다음과 같은 흐름을 갖는다.

  • 데이터 분석에 키바나를 사용하기 전에 사용하는 엘라스틱서치에 데이터를 올려뒀을 것이다.
  • 키바나를 사용해 데이터를 분석하려면 사용자는 키바나가 엘라스틱서치 인덱스에 저장된 데이터를 키바나가 인식할 수 있도록 해야한다. 즉, 사용자는 분석을 수행하려는 인덱스를 설정해야 한다.
  • 일단 설정을 끝마치면 사용자는 도큐먼트에 있는 필드와 타입과 같은 데이터 구조를 살펴봐야 한다. 이러한 과정을 통해 제기해야 하는 질문을 파악하고, 데이터 관점에서 해답을 찾아 이를 시각화하는 방법을 결정한다.
  • 데이터를 이해하고 나면 해답을 찾기 위한 질문을 작성하고, 대용량 데이터에서 쉽게 답을 찾는데 도움이 되는 시각화를 적절히 구성할 수 있다.
  • 사용자는 앞서 만든 시각화 집합을 사용해 대시보드를 만들고 데이터를 중심으로 이야기를 생산할 수 있다.
  • 이러한 과정은 반복적이고, 사용자는 여러 단계를 거치면서 질문에 대한 해답을 찾아 나간다. 데이터에 대한 깊은 통찰력을 얻을 수 있을 뿐 아니라 이전에는 생각조차 하지 못한 새로운 형식의 질문과 해답을 발견할 수 있다.

 

사용자가 키바나를 어떻게 사용하고 상호 작용하는지 살펴보았고, 이제 키바나의 구성요소를 알아본다. 화면 좌측에 접을 수 있는 메뉴와 사이드 바에서 볼수 있듯이 키바나 UI는 다음 구성 요소로 이뤄져 있다.

  • Discover: 엘라스틱서치 인덱스에 있는 데이터를 탐색하는데 사용한다. 데이터를 쿼리하고 필터링할 수 있고, 도큐먼트 구조를 검사할 수 있다.
  • Visualize: 해당 페이지는 시각화 구축에 사용한다. 막대 차트, 선형 차트, 지도, 태그 등 다양한 시각화 도구를 제공한다. 사용자는 데이터 분석에 필요한 적절한 시각화 도구를 선택할 수 있다.
  • Dashboard: 단일 페이지에서 여러 시각화를 표시하는데 사용하며, 이를 통해 데이터에 대한 스토리를 만들 수 있다.
  • Timelion: 간단한 표현 언어를 사용해 시계열 데이터를 시각화하고 사용자가 단일 시각화 내에서 완전히 독립적인 데이터 자원, 즉 서로 다른 인덱스 데이터를 결합할 수 있도록 도움을 준다.
  • Dev Tools: 다양한 기능을 수행하는 여러 플러그인 집합으로 구성된 페이지다. 기본적으로 콘솔이라는 단일 플러그인과 REST API를 사용해 엘라스틱서치와 상호 작용할 수 있는 UI를 제공한다.
  • Management: 인덱스 설정 및 관리를 지원하는 페이지다. 기존의 시각화, 대시보드, 검색 쿼리 관리, 즉 삭제/내보내기/가져오기 기능을 지원한다.

 


인덱스 패턴 설정

데이터 처리 및 분석을 위한 시각화를 만들기 전에 키바나에 인덱스 패턴을 설정해야 한다. 인덱스 패턴은 검색 및 분석을 실행하는 엘라스틱서치 인덱스를 식별하거나 필드를 설정하는데 사용한다. 인덱스 패턴은 여러 인덱스에 대응할 수 있는 선택적 와일드카드를 포함한 문자열이다. 일반적으로 엘라스틱서치에는 다음과 같은 두가지 타입의 인덱스가 있다.

  • 시계열 인덱스(Time-series indexes): 타임스탬프와 데이터 사이에 상관관계가 있는 경우 시계열 데이터라고 부른다. 해당 데이터는 타임스탬프 필드를 갖고 있다. 로그, 지표, 트위터 데이터를 예로 들 수 있다. 해당 데이터가 엘라스틱서치에 저장되는 시점에, 데이터는 보통 타임스탬프가 추가된 인덱스 이름과 함께 여러 인덱스에 저장된다.
  • 일반 인덱스: 데이터에 타임스탬프가 포함돼 있지 않고 시간과 상관관계가 없는 경우, 일반 데이터라고 부른다. 데이터는 일반적으로 단일 인덱스에 저장된다. 부서, 제품 카탈로그 데이터 등이 일반 데이터에 해당한다.

 


탐색

탐색 페이지를 사용하면 데이터를 대화식으로 탐색할 수 있다. 사용자는 검색 쿼리를 대화 형식으로 입력하고, 검색 결과를 필터해 도큐먼트 데이터를 볼 수 있다. 검색을 저장하거나 필터된 결과를 기반으로 시각화를 만들거나 필터 기준을 재사용할 수 있다.

  • 인덴스 패턴: 설정된 모든 인덱스 패턴이 드롭다운에 표시된다. 기본값은 자동으로 선택되며, 사용자는 데이터 탐색에 적합한 인덱스 패턴을 선택할 수 있다.
  • 필드 목록: 도큐먼트의 일부인 모든 필드가 표시된다. 필드를 선택하면 도큐먼트 테이블에 있는 도큐먼트가 얼마나 많은 특정 필드를 포함하는지 볼 수 있는 Quick Count가 나온다.
  • 도큐먼트 테이블: 실제 도큐먼트 데이터를 보여준다. 테이블은 사용자 입력 쿼리 또는 필터와 일치하는 가장 최근 도큐먼트 500개를 보여주고, 타임스탬프 필드가 있다면 해당 필드를 기준으로 정렬된다. 도큐먼트 테이블 항목 왼쪽에 있는 Expand 버튼을 선택하면 데이터를 테이블이나 JSON 형식으로 볼 수 있다.
  • 쿼리 막대: 사용자는 쿼리 막대와 검색 막대를 사용해 검색 결과를 필터링할 수 있다. 검색 요청을 제출하면 막대그래프(시간 필드가 선택된 인덱스 패턴에 설정된 경우), 도큐먼트 테이블, 필드 목록, 조회 수가 검색 결과를 반영한다. 일치하는 검색어는 도큐먼트 테이블에서 강조 표시된다. 데이터를 검색하려면 검색 기준을 쿼리 막대에 입력하고 Enter 또는 검색 아이콘을 선택하면 된다. 

    루씬 쿼리 기반의 엘라스틱서치 쿼리 문자열: https://lucene.apache.org/core/2_9_4/queryparsersyntax.html
    전체 JSON 기반의 DSL 쿼리: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/query-dsl.html

 


엘라스틱 쿼리 문자열

전문 검색

임의 필드에 있는 텍스트를 검색하려면 단순히 쿼리 막대에서 텍스트 문자열을 입력한다. 검색할 단어 그룹을 입력할때, 도유컨트가 단어의 전부 또는 일부를 순서에 상관없이 포함하고 있으면 도큐먼트는 검색 결과에 포함된다.

files logstash

 

필드 검색

특정 필드에서 값을 검색하려면 sytax 필드에서 value를 사용하면 된다.

geoip.city_name: Amsterdam

 

Boolean 검색

AND OR 연산자, 일치하지 않는다는 의미인 - 연산자를 나타내는 불린 검색을 사용해 복잡한 쿼리를 작성할 수 있다. 불린 연산을 사용하려면 value 필드와 텍스트를 결합할 수 있다.

geoip.city_name: Abingdon AND response:301
geoip.city_name: Abingdon -reponse: 200
geoip.city_name: Abingdon: -301

 

그룹 검색

복잡한 쿼리를 작성하려면 검색 기준을 그룹화해야 한다. 다음 예제와 같이 필드와 값 모두 그룹으로 사용할 수 있다.

(geoip.city_name: Abingdon OR geoip.city_name: Abinsk) AND response:(301 OR 404)

 

범위 검색

범위를 지정해 값을 검색할 수 있다. 포괄 범위는 [시작값 TO 종료값]과 같이 대괄호를 지정하고, 배타 범위는 {시작값 TO 종료값}과 같이 중괄호로 묶을 수 있다. 범위는 날짜와 숫자 또는 문자열 필드에 지정할 수 있다.

response:[301 TO 500]

 

와일드카드 및 정규식 검색

* 및 ? 값과 같이 검색 문자열에 와일드카드를 사용해 쿼리를 실행할 수 있다. *는 일치하는 값이 0개 이상, ?는 일치하는 값이 0개 또는 1개를 의미한다. 와일드카드 검색은 계산 비용이 많이 든다. 따라서 와일드카드를 검색어에서 사용할 때 접두사보다 접미사에 추가하는 것이 바람직하다.

geoip.city_name: S?n*

 

와일드카드와 마찬가지로 정규식 쿼리도 지원한다. 슬래시와 대괄호를 사용하면 정규식 패턴을 지정할 수 있다. 하지만 정규식 쿼리는 계산 비용이 매우 많이 들기 때문에 주의해 사용해야 한다. 다음은 g, b, a로 시작하는 도시를 검색하는 정규식이다.

geoip.city_name: /[gab].*/

 

엘라스틱서치 DSL 쿼리

DSL 쿼리를 사용해 쿼리 막대에서 쿼리를 수애할 수 있다. DSL 쿼리의 일부분이 검색을 수행하는데 사용된다. 다음은 useragent.name 필드에 IE 값, geoip.region_name 필드에 Washington 값이 있는 도큐먼트를 검색하는 예제다.

{"bool": {"must":[{"match": {"useragent.name": "IE"}}, {"match": {"geoip.region_name": "Washington"}}]}

 

  • 툴바: 사용자가 입력한 검색어와 적용된 필터를 저장해 재사용하거나 필터링된 검색 결과를 바탕으로 시각화를 구축하는데 사용할 수 있다. 툴바는 검색 쿼리를 저장하고 재사용, 공유하는 옵션을 제공한다. 사용자는 기존에 저장된 검색을 참조할 수도 있고, 쿼리를 수정하고 기존 검색을 덮어쓰거나 새로운 검색으로 저장할 수도 있다. 기존에 저장된 검색을 기반으로 새로운 검색을 만들려면, Save 탭에서 Save as new search 체크박스를 선택하면 된다.
  • 필터: positive filter를 사용해 필드에 특정 값을 포함하는 도큐먼트만 표시하도록 검색 결과를 수정할 수 있다. 또한 특정 필드 값을 포함하는 도큐먼트를 제외하는 negative filter를 만들 수도 있다. 수동 혹은 필드 목록이나 도큐먼트 테이블에서 필드 필터를 추가할 수 있다. 게다가 positive 혹은 negative 필터 생성 외에도 도큐먼트 테이블을 사용해 필드 존재 여부를 필터링할 수 있다. positive 또는 negative 필터를 추가하려면 필드 목록이나 도큐먼트 테이블에서 + 또는 - 아이콘을 선택하면 된다. 마찬가지로 필드 유무를 통해 검색을 필터링하려면 * 아이콘을 선택하면 된다.

    쿼리 막대 아래에 있는 Add a Filter 버튼을 선택해 수동으로 필터를 추가할 수도 있다. 적용한 필터는 쿼리 막대 아래에 표시된다. 부정 필터는 빨간색으로 표시된다. 여러 필터를 추가할 수 있으며, 필터는 지정한 순서대로 적용된다. 

 


키바나 집계

키바나는 1.버킷 집계, 2.메트릭 집계 두가지 타입의 집계를 제공한다. 집계 개념은 시각화를 구축하는 방법을 이해하는데 중요하다.

 

버킷 집계

공통 기준에 따라 도큐먼트를 그룹화하는 것을 버킷팅이라고 한다. 버킷팅은 SQL의 GROUP BY 기능과 유사하다. 집계 타입에 따라 각 버킷은 현재 컨텍스트에 있는 도큐먼트가 버킷에 속하는지 아닌지를 결정하는 기준과 연결된다. 각 버킷은 포함된 총 도큐먼트 갯수에 대한 정보를 제공한다.

 

버킷 집계는 하위 집계를 지원한다. 즉, 버킷이 있으면 모든 도큐먼트는 기준에 따라 그룹화해 버킷으로 묶을 수 있다. 예를 들어, 국가별 그리고 도시별 404 응답 개수를 검색할 수 있다. 또한 버킷 집계의 타입에 따라 단일 버킷 또는 여러 버킷의 고정된 갯수를 정의하거나 동적으로 집계 처리 중에 버킷을 만들 수 있다. 버킷 집계는 메트릭 집계와 결합해 사용할 수 있다.

 

 


타임라이온

타임라이온(Timelion)은 키바나에서 시계열 데이터를 분석하기 위한 시각화 도구다. 같은 시각화에서 독립적인 데이터 자원을 완벽히 결합할 수 있다. 간단한 표현식 언어를 사용해 수학 계산을 실행할 수 있다. 메트릭 나눗셈 및 뺄셈, 미분 계산 및 이동 평균 계산 등에 활용할 수 있다.

 

타임라이온 표현식

그래프 생성에 사용하는 가장 간단한 타임라온 표현식은 다음과 같다.

.es(*)

타임라이온 표현식은 항상 점과 함수 이름으로 시작하고, 여러 매개변수를 허용한다. .es(*) 표현식은 엘라스틱서치에 있는 모든 인덱스 데이터를 쿼리한다. 기본적으로 도큐먼트 수를 계산하므로 시간 경과에 따른 도큐먼트 갯수가 그래프에 표시된다. 타임라이온을 특정 인덱스 내의 데이터, 예를 들어 logstash-*로 제한하려면 다음과 같이 함수 내에서 인덱스를 지정하면 된다.

.es(index=logstash-*)

타임라이온은 시계열로 시각화로, 인덱스에 있는 @timestamp 필드를 X축 값을 그리는 시간 필드로 사용한다. timefield 매개변수에 적절한 값을 지정하면 해당 값을 변경할 수 있다.

 

미국에서 시간 경과에 따른 평균 바이트 사용량을 알아보는 표현식은 다음과 같다.

.es(q='geoip.country_code3:US', metric='avg:bytes')

 

타임라이온을 사용하면 같은 차트에서 여러 그래프를 그릴 수 있다. 그래프를 여러개로 그래러면 표현식을 쉼표로 구분하면 된다. 미국과 중국의 평균 바이트 사용량을 시간별로 조회한 표현식은 다음과 같다.

.es(q='geoip.country_code3:US', metric='avg:bytes'),
.es(q='geoip.country_code3:CN', metric='avg:bytes')

 

타임라이온은 함수도 연결할 수 있다. 그래프의 라벨과 색상을 변경할 수도 있다. 표현식은 다음과 같다.

.es(q='geoip.country_code3:US', metric='avg:bytes').label('United States').color('yellow'),
.es(q='geoip.country_code3:CN', metric='avg:bytes').label('China').color('red')

 

타임라이온에서 데이터를 분석할때 오프셋을 사용하면 유용하다. 오프셋은 그래프의 추세를 비교할때 활용할 수 있다. 미국에서 지난 한 주 동안 사용한 바이트 합계를 계산한 표현식은 다음과 같다.

.es(q='geoip.country_code3:US', metric='sum:bytes').label('Current Week'),
.es(q='geoip.country_code3:US', metric='sum:bytes', offset=-1w).label('Previous Week')

 

타임라이온은 Public API를 사용하여 외부 데이터 자원에서 데이터 가져오기를 지원하기도 한다. 타임라이온 표현식을 지원하는 함수는 약 50개 정도 되는데, https://github.com/elastic/timelion/blob/master/FUNCTIONS.md 를 참고해 표현식을 작성할 수 있다.