Architecture/ELK

Elastic Stack 아주 조금만 알아보자 - Kibana

KOOCCI 2019. 12. 5. 02:14

Kibana

Kibana는 이전 포스팅에도 말했지만, Elastic Search 데이터를 시각화하고, Elastic Stack을 탐색하여 쿼리 부하 추적부터 앱을 통해 요청이 흐르는 방식 등을 진행할 수 있도록 만들어진, 데이터 시각화 플랫폼이다.

 

 바로 설치부터 시작해보도록 하자.

 

가장 쉽게 설치하는 방법은 DEB 파일을 받아서, 설치하는 것이다. (Ubuntu 기준이며, 운영체제에 따라 차이가 있을 수 있다)

 

https://www.elastic.co/kr/downloads/kibana

 

Download Kibana Free | Get Started Now | Elastic | Elastic

Want it hosted? Deploy on Elastic Cloud. Get Started »

www.elastic.co

위 링크에서 운영체제에 맞게 쉽게 다운받을 수 있다.

나의 경우는 7.4.2 버전을 다운 받아서 실행할 것이다. 그 이유는 설치된 Elastic Search와 버전을 맞추기 위함이다.

 

sudo dpkg -i kibana-7.4.2-amd64.deb

인스톨 후, 아래 위치에서 다음 2가지를 확인한다.

/etc/kibana/kibana.yml
#server.host: "localhost"
#elasticsearch.hosts: ["http://localhost:9200"]

현재 Kibana와 ElasticSearch가 같은 위치에 있기 때문에 위와 같이 설정한 것이다.

 

그럼 아래 명령어로 실행시키자.

sudo /usr/share/kibana/bin/kibana --allow-root

참고로, Kibana는 루트 권한이 없어도 되며, 최소 권한으로 실행하는 것을 권장한다.

나는 실습차원에서 진행중이므로, 뒤에 --allow-root를 넣어 주었다.

 

정상적으로 실행되었다면, http://localhost:5601 로 접속하여, 확인해보자.

 

Kibana Category

Kibana의 카테고리를 보면 매우 많은 내용들이 나올 것이다.

 

카테고리 설명
Discover Elastic Search index에 있는 데이터를 탐색하는 데 사용. 데이터를 쿼리하고 필터링할 수 있으며, 도큐먼트 구조를 검사할 수 있다.
Visualize 시각화하는 데 사용하며 막대차트, 선형차트, 지도 등 다양한 시각화 도구를 제공한다. 사용자는 데이터 분석에 필요한 적절한 시각화 도구를 선택 할 수 있다.
Dashboard 시각화 도구를 조합하여 대시보드를 구성할 수 있다.
Canvas Kibana에 내장된 Presentation Tool 이며, 사용자는 Elastic Search에서 직접 라이브 데이터를 가져오는 프레젠테이션 및 슬라이드를 만들 수 있다.
Maps 지리적 데이터를 신속하고 실시간으로 대규모로 파싱 할 수 있다.  
Machine Learning 이상 감지 및 이상치 감지와 같은 탄력적 인 머신 러닝 기능을 사용하면 사람의 간섭을 최소화하면서 의심스러운 활동을 쉽게 알 수 있다.
다만, basic licence에서는 Data Visualizer만 쓸 수 있으며, 이는 로그 파일 또는 기존 Elastic Search index의 Metric과 필드를 분석해 데이터를 이해하는 데 도움을 준다.
Metrics 인프라를 모니터링하고 실시간으로 문제를 식별 할 수 있다. 공통 서버, 컨테이너 및 서비스에 대한 기본 메트릭을 볼 수있는 인프라의 시각적 Summery와 자세한 내용을 추가로 볼 수 있다.
Logs 일반적인 서버, 컨테이너 및 서비스에 대한 로그를 탐색할 수 있게 한다.
APM Elastic Application Performance Monitoring으로, 애플리케이션 내부에서 심도있는 성능 지표 및 오류를 자동으로 수집한다.
Uptime Http / s, TCP 및 ICMP를 통해 네트워크 엔드 포인트의 상태를 모니터링 할 수 있다.
SIEM (7.5기준 베타서비스)
보안 팀이 이벤트를 심사하고 초기 조사를 수행 할 수 있는 대화식 작업 공간을 제공한다.
Dev Tools 다양한 기능을 수행하는 여러 플러그인 집합으로 구성된 페이지. 콘솔이라는 단일 플러그인과 REST API를 사용해 ES와 상호작용할 수 있는 UI 제공
Stack Monitoring Elastic Stack에서 모니터링 데이터를 시각화
Elastic Search, Logstash, Beats의 상태 및 성능 데이터를 실시간으로 보고 과거 성능을 분석
Kibana 자체를 모니터링하고 해당 데이터를 모니터링 클러스터로 라우팅
Management 인덱스 설정 및 관리를 지원. 기존 시각화, 대시보드 등의 삭제, 내보내기, 가져오기 등 지원

Kibana Management

그럼 이제 Kibana Management 를 시작할 것이다.

 

그전에 ES에 데이터를 넣을 예정인데, 이전 실습이 남아있다면, 모두 삭제하고 생성하도록 하자.

 

curl -XDELETE http://localhost:9200/basketball
{"acknowledged":true}
curl -XPUT http://localhost:9200/basketball
{"acknowledged":true,"shards_acknowledged":true,"index":"basketball"}

다음은 mapping과 bulk data를 삽입하자.

{
	"record" : {
		"properties" : {
			"team" : {
				"type" : "string",
				"fielddata" : true
			},
			"name" : {
				"type" : "string",
				"fielddata" : true
			},
			"points" : {
				"type" : "long"
			},
			"rebounds" : {
				"type" : "long"
			},
			"assists" : {
				"type" : "long"
			},
			"blocks" : {
				"type" : "long"
			},
			"submit_date" : {
				"type" : "date",
				"format" : "yyyy-MM-dd"
			}
		}
	}
}
curl -XPUT 'http://localhost:9200/basketball/record/_mappin?pretty' -H'Content-Type: application/json' -d @basketball_mapping.json
{
  "_index" : "basketball",
  "_type" : "record",
  "_id" : "_mappin",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

삽입할 데이터는 다음과 같다. (bulk_basketball.json)

{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "1" } }
{"team" : "Golden States Warriors","name" : "Stephen Curry", "points" : 30,"rebounds" : 3,"assists" : 4, "blocks" : 5, "submit_date" : "2016-10-11"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "2" } }
{"team" : "Golden States Warriors","name" : "Stephen Curry","points" : 32,"rebounds" : 5,"assists" : 8, "blocks" : 5, "submit_date" : "2016-10-13"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "3" } }
{"team" : "Golden States Warriors","name" : "Stephen Curry","points" : 28,"rebounds" : 2,"assists" : 3, "blocks" : 1, "submit_date" : "2016-10-17"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "4" } }
{"team" : "Golden States Warriors","name" : "Stephen Curry","points" : 36,"rebounds" : 1,"assists" : 2, "blocks" : 1, "submit_date" : "2016-11-20"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "5" } }
{"team" : "Golden States Warriors","name" : "Stephen Curry","points" : 36,"rebounds" : 1,"assists" : 2, "blocks" : 1, "submit_date" : "2016-11-25"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "6" } }
{"team" : "Golden States Warriors","name" : "Stephen Curry","points" : 32,"rebounds" : 1,"assists" : 4, "blocks" : 1, "submit_date" : "2016-11-28"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "7" } }
{"team" : "Utah Jazz","name" : "Rudy Gobert", "points" : 3,"rebounds" : 11,"assists" : 4, "blocks" : 7, "submit_date" : "2016-10-12"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "8" } }
{"team" : "Utah Jazz","name" : "Rudy Gobert","points" : 4,"rebounds" : 13,"assists" : 8, "blocks" : 5, "submit_date" : "2016-10-14"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "9" } }
{"team" : "Utah Jazz","name" : "Rudy Gobert","points" : 8,"rebounds" : 10,"assists" : 3, "blocks" : 6, "submit_date" : "2016-10-18"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "10" } }
{"team" : "Utah Jazz","name" : "Rudy Gobert","points" : 12,"rebounds" : 9,"assists" : 2, "blocks" : 6, "submit_date" : "2016-11-10"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "11" } }
{"team" : "Utah Jazz","name" : "Rudy Gobert","points" : 12,"rebounds" : 14,"assists" : 2, "blocks" : 7, "submit_date" : "2016-11-22"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "12" } }
{"team" : "Utah Jazz","name" : "Rudy Gobert","points" : 8,"rebounds" : 10,"assists" : 4, "blocks" : 5, "submit_date" : "2016-11-27"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "13" } }
{"team" : "Washington Wizards","name" : "John Wall","points" : 8,"rebounds" : 1,"assists" : 13, "blocks" : 2, "submit_date" : "2016-10-18"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "14" } }
{"team" : "Washington Wizards","name" : "John Wall","points" : 13,"rebounds" : 2,"assists" : 12, "blocks" : 3, "submit_date" : "2016-11-10"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "15" } }
{"team" : "Washington Wizards","name" : "John Wall","points" : 15,"rebounds" : 3,"assists" : 12, "blocks" : 3, "submit_date" : "2016-11-22"}
{ "index" : { "_index" : "basketball", "_type" : "record", "_id" : "16" } }
{"team" : "Washington Wizards","name" : "John Wall","points" : 22,"rebounds" : 4,"assists" : 14, "blocks" : 3, "submit_date" : "2016-11-27"}

 그럼 아래 문장으로 삽입해보자.

curl -XPOST 'http://localhost:9200/basketball/record/_bulk?pretty' -H'Content-Type: application/json' --data-binary @bulk_basketball.json

이제 자료가 있으니, Kibana에서 자료를 보도록 하자.

 

Kibana

왼쪽 아래 Management가 있는 걸 볼 수 있다.

 

그 중, Index Patterns 를 누르면 다음과 같이 화면이 나온다.

index pattern

Create index pattern을 누르면 아래와 같이, 아직 indexing이 안된 패턴이 보이며, index pattern을 입력받고자 하는 창이 나온다.

index pattern에 basketball을 넣으면 다음 스텝으로 갈 수 있다.

 

그러면 Time Filter를 선택하는 창이 나오고 최종 생성이 가능하다.

 

time filter

생성이 완료되면, 다음과 같이 결과 값이 나온다.

 

basketball index

그럼 name은 String, assists 는 number 등 지정했던 Mapping내용을 Kibana가 정상적으로 인식하는 것을 볼 수 있다.

 

Kibana Discover

Discover 탭으로 이동해보자.

Discover

아마 No results match your search criteria 라고 나올 것이다.

데이터가 지난 15분간 없었기 때문이다. (넣은 데이터가 2016년도 데이터다)

따라서 난 Absolute 값으로 2016년 9월부터 2017년 2월까지로 변경하였다.

Discover

하단에는 테이블에서 Information이 나오는 것을 볼 수 있다.

차트에 마우스 오버를 해보면 그 갯수도 나온다.

 

table

또한, 아래 Table을 JSON으로 보거나 위와 같이 정보성 데이터를 볼 수 있다.

filter

또한 해당 컬럼에 마우스 오버하면 돋보기가 나오는데, 위와 같이 filter를 걸 수도 있다.

 

돋보기 옆에는 toggle 버튼도 있으며 아주 유용하게 쓸 수 있다.

 

Kibana Visualize

그럼 이제 대망의 Visualize를 진행해 보겠다.

 

Visualization

많은 차트가 나오고, 다양하게 활용할 수 있다.

이 중에서 Vertical Bar Chart, Pie Chart 정도 써볼 것이다.

 

먼저 Vertical Bar Chart를 진행해보겠다.

Vertical Bar Chart > basketball을 선택하면 다음과 같이 나온다.

vertical bar chart

 

XY settings

우리는 Points의 평균을 구할 것이다. 이를 위해 Y-axis 에 Count는 삭제하고, 위와 같이 셋팅한다.

X축도 Buckets에 이름(name-keyword), Terms Aggregation으로 세팅한다.

 

그 결과는 다음과 같다.

result point/name avg

이렇게 아주 손쉽게 Field를 바꾸어 가며 세팅할 수 있다.

 

다음은 다시 돌아와서, Pie Chart를 진행해보자.

이번엔 팀별 총 점수를 비교하는 차트를 진행할 예정이다.

위와 동일하므로, 아래 이미지로 확인만 진행하자.

pie chart

Kibana Visualize (Map)

이번에는 지도에 표시하는 법을 알아보자.

 

예제는 Classes를 사용할 것이므로, 위와 달리 새롭게 index부터 만들도록 하자.

curl -XPUT http://localhost:9200/classes

그 다음은 Mapping을 할 것이다.

여기서 지도에 표시할 때는 Mapping이 매우 중요하다.

Geo_point라는 부분이 있는데, 지도에 표시하기 위해서는 이 부분이 명확히 표현되어야 하기 때문이다. 

{
	"class" : {
		"properties" : {
			"title" : {
				"type" : "text"
			},
			"professor" : {
				"type" : "text"
			},
			"major" : {
				"type" : "text"
			},
			"semester" : {
				"type" : "text"
			},
			"student_count" : {
				"type" : "integer"
			},
			"unit" : {
				"type" : "integer"
			},
			"rating" : {
				"type" : "integer"
			},
			"submit_date" : {
				"type" : "date",
				"format" : "yyyy-MM-dd"
			},
			"school_location" : {
				"type" : "geo_point"
			}
		}
	}
}
curl -H 'Content-Type:application/json' -XPUT 'http://localhost:9200/classes/class/_mapping?include_type_name=true&pretty' -d @classesRating_mapping.json
curl -XPOST http://localhost:9200/_bulk?pretty -H'Content-Type: application/json' --data-binary @classes.json

Document를 한번 확인해보면 다음과 같다.

curl -XGET http://localhost:9200/classes/class/1/?pretty
{
  "_index" : "classes",
  "_type" : "class",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "title" : "Machine Learning",
    "Professor" : "Minsuk Heo",
    "major" : "Computer Science",
    "semester" : [
      "spring",
      "fall"
    ],
    "student_count" : 100,
    "unit" : 3,
    "rating" : 5,
    "submit_date" : "2016-01-02",
    "school_location" : {
      "lat" : 36.0,
      "lon" : -120.0
    }
  }
}

그럼 위 순서대로 Management에서 classes 를 등록하고, Visualize에서 Map을 선택하자. (혹은 최 상위 탭에도 Map이 존재한다)

Map

우측에 Grid aggregation을 선택하면, 둥근 점이 생기며, 이를 커스터마이즈 할 수 있게 된다.

 

classes

Kibana Dashboard

Visualize

앞서 했던 예제에서 Visualize를 Save하도록 하자.

 

Save를 하게되면, 차트들은 DashBoard에서 재사용이 가능해진다.

 

그럼 DashBoard 를 시작하고, 차트를 Add 해보자.

DashBoard

 

Add

하나를 Add 해보니 다음과 같았다.

 

이외에도 여러 차트를 만들어 넣어보도록 하자.

Pie Chart add

그러면 각각의 차트의 크기를 수정할 수 있다.

 

이번 포스팅은 여기까지 하고, 다음은 LogStash에 대해 알아보도록 하자.


※ Inflearn 강의, Naver D2 블로그 등을 참고해 정리한 내용입니다.

 

1편 > Elastic Stack 아주 조금만 알아보자 - Elastic Stack 이란?

2편 > Elastic Stack 아주 조금만 알아보자 - ElasticSearch 기본 실습

3편 > Elastic Stack 아주 조금만 알아보자 - ElasticSearch Mapping/Search

4편 > Elastic Stack 아주 조금만 알아보자 - ElasticSearch 구조

5편 > Elastic Stack 아주 조금만 알아보자 - Aggregation

6편 > 현재 Post

7편 > Elastic Stack 아주 조금만 알아보자 - LogStash

8편 > Elastic Stack 아주 조금만 알아보자 - LogStash 실습 1