data engineering
elastic kibana basic visualization
qkqhxla1
2021. 3. 3. 21:32
kibana에 대해서는 qkqhxla1.tistory.com/1024 에서 정리를 가볍게 했었는데... 저 글에서도 적었지만 겨우 한 글에 너무 전반적인 내용을 다 적으려고 하다가 이도 저도 아닌 글이 되버렸다.
이번에는 실제로 사용하는 데이터를 이용하여 가장 헷갈리는 부분인 키바나 gui를 이용해 시각화하는 부분만 다룰 예정이다.키바나 gui를 사용해서도 만들 수 있는 그래프가 상당히 많은데, 그중에 많이 사용하는, 간단한 패턴만 몇개 적는다. 다른 복잡한 작업들도 할수 있을건데 내 입장에서는 대충 아래 패턴정도로 키바나 파악이 끝나면 대충 이리저리 만져서 만들어낼 수 있다고 생각한다. '이렇게 넣으면 이렇게 그려지겠지' 감을 잡는게 가장 어려웠다.
1. 실시간 데이터의 카운트를 그래프로 모니터링하는 경우.
우선 넣는 데이터의 포맷을 살펴보면 아래와 같다.
{ "_index": "test_to_kafka-2021.03", "_type": "document", "_id": "kIws-3XXisdHi-5qTu82", "_version": 1, "_score": null, "_source": { "time": "2021-03-04T23:36:07.735612+09:00", "a_count": 1853, "all_count": 13570, "b_count": 11695, "c_count": 22 }, "fields": { "time": [ "2021-03-04T14:36:07.735Z" ] }, "sort": [ 1614868567735 ] }
es로 매분 이 포맷의 데이터를 쏜다. a_count, b_count, c_count는 매분 내가 카프카로 프로듀싱하는 데이터의 카운트이다. 이 카운트들이 높아지거나, 낮아지거나, 또는 특정 시간에 몇개가 수집되는지를 모니터링하고 싶다. 대충 아래와 같은 캡쳐화면이 결과적으로 나오게 된다.
현재 위의 캡쳐는 6시~22시쯤으로 필터링을 해서 보여준건데, 자동으로 왼쪽에 필터링된 시간동안의 총 a, b, c 카운트가 보인다. 중간의 그래프는 적당히 시간을 보기좋게 나눠서 그 시간대쯤에 쏘아진 양을 뭉쳐서 보여주는데, 아래에 캡션으로 카운트가 나온다. 그래프 중간에 마우스가 올라간 곳의 total produced는 저 검은 시간대(15:40)쯤의 기록들을 모아서 보여준다.
15:40에 정확히 349,546개가 프로듀싱된게 아니라, 대충 저 근처 시간대의 카운트들을 취합한 값이 저거다. 시간 필터를 저해서 그렇지, 최근 15분 등 좁은 시간을 보게 되면 total produced값은 뭉쳐서 보여주는게 아니라 촘촘히 보여주기 때문에 작아질 것이다. 이해를 위해서 위 캡쳐에서 빨간색 상자로 표시된 시간인 12:00~14:00으로 필터건 결과를 가져왔다.
보기좋게 그래프가 변화한 것을 알 수 있다. 다시 만들걸 해석해보자면.
total a count는 필터링된 시간(12:00~14:00)사이의 총 들어간 a count값이다. 오른쪽의 total produced는 total c count + total b count + total c count의 값이다. 그리고 현재 마우스가 있는 c count가 34,683인 시간대(12:10쯤)에는 b count가 한개도 들어오지 않았다. 이런식으로 만들어놓으면 특정 분이나 시간동안의 카운트를 눈으로 보기 쉽고, 언제 뭐가 튀었거나 안 돌았는지 확인하기가 편하다.
첫번째로 만들건 위의 대시보드에서 중간의 그래프다. Visualize탭에서 +를 눌러 새로 탭 하나를 만들고 Visual builder를 선택한다.
Panel options탭에서는 위처럼 설정해준다.
Index pattern에 위에서 보이는 인덱스인 test_to_kafka-2021.02를 가져오기 위해 test_to_kafka-*로 패턴을 잡는다. 인덱스 이름의 포스트픽스로 현재 년-월을 붙이는게 나중에 관리상 편하다. Time field에는 내가 현재 시간을 넣어준 필드인 time을 적는다. Interval은 나중에 다시 설명할건데 auto면 키바나가 알아서 적당한 범위로 잡아서 걸러준다는 말이다.
현재 나는 1분단위로 데이터를 쏘느라 1m처럼 해도 되지만 저거로 한 이유는 그래프가 너무 촘촘히 그려지기 때문이다. 밑 캡쳐화면을 보면 auto여서 점간의 간격이 보기에 좋은데, 1m으로 하면 실제 1분마다 점을 찍게 해서 더 정교하게 보일순 있어도 그리 보기좋지는 않다.
Data탭에서는 이처럼 넣어준다. 파란색 말고 원하는 색을 지정해도 좋으며, Data -> Metrics의 Aggregation에는 집계 함수인 Max, Min, Sum등등을 쓸 수 있는데 그래프를 그릴때는 어차피 한 도큐먼트에 하나의 값이 들어가 있어서 그런지 몰라도 Max, Min, Sum의 차이가 없다.
여기서 Aggregation의 Max함수는 위에서 말했듯이 키바나는 적당한 시간대로 뭉쳐서 그래프를 그려주는데, Max이면 적당한 시간대중의 Max값만 점을 찍어서 그리는게 아니라 내가 매분 쏜 데이터의 Max값들의 합을 보여준다.
Sum이면? 내가 매분 쏜 데이터의 Sum값들의 합을 시간대로 뭉쳐서 보여준다. 근데 나는 한 도큐먼트에 하나의 a count만 넣어서 보내서 그런지 몰라도 Max, Min, Sum값이 다 동일하게 나온다.(값이 하나면 Max, Min, Sum이 동일한 값일것이므로인듯 싶음.) 근데 es로 데이터를 쏠때 파이썬 딕셔너리로 만들어서 보내느라 동일한 두개의 키가 들어갈 수가 없다.(???) 이건 아직 잘 모르겠는 부분인데 그러면 Max, Min, Sum은 키바나에서는 어떻게 써야 다르지.. 하는 고민이 있다.
만약 내가 어떤 값에 대해서 Max, Min 이 필요하면 es로 쏘기 전에 미리 데이터를 만들어서 Max_val이런식으로 만들어서 보낼 것 같다.
어쨌든 셋중 아무거나 하나를 선택해주고 난 파란색으로 a count의 값을 표시할 것임으로 a count를 선택해준다.
그리고 Data -> Options탭에서는 더 예쁘게 그리는 옵션을 추가할 수 있다.
예로 몇개만 보자면 Fill값은 내부를 파란색으로 얼만큼 채울건지,(현재는 0.5지만 위에는 0.2였음.) Line width는 선의 굵기, Point size는 그래프에서 점의 크기이다. 가장 눈에 확 들어오는 옵션이어서 바꿔봤고, 이거말고도 축이 두개면 축을 왼쪽 오른쪽으로 분리한다던지 등등을 바꿀수 있다. 바꿔가면서 가장 예쁜 옵션으로 커스터마이징하자.
그리고 빨간 네모로 표시된 clone series 를 눌러 하나를 더 만들고 동일하게 만들면 된다. 이런식으로 여러개를 만들어서 저장하면 끝난다. 키바나의 visualize에서 저장한 것들을 새 Dashboard를 만든 다음 Add로 탭 하나를 가져올 수 있다. 처음에는 위의 그래프만 있으므로 위의 그래프만 가져다가 붙여놓고 드래그로 적당히 탭의 크기를 조절해준다.
이번엔 필터링된 시간내에서 집계한 a count의 총 카운트 숫자만 보여주는 탭을 만들거다.
이번에도 Visualize탭에서 +를 눌러 새로 탭 하나를 만들고 Visual builder를 선택한다.
처음에 만들면 기본적으로 Time Series가 선택되는데, 이번에는 Metric탭을 선택한다.(왼쪽위 빨간색 상자) 그리고 Panel options에서 위에 그래프만들때와 동일하게 입력한다.
그리고 Data탭에서는 위처럼 입력한다. 기본적으로 Metric탭의 카운트는 현재 시간대의 카운트만 보여준다. 아래의 Data탭에서는 이번엔 Aggregation이 탭 하나에 두개인데, 이뜻은
첫번째 Aggregation에서는 a count의 Sum을 기준으로 그래프를 그릴거다.(그러니까 그래프로 따지면 각각의 점 하나임.) 두번째 Aggregation에서는 첫번째 Aggregation의 결과값들을 전부 Sum한 값을 보여줄거다.(Overall Sum)라는 의미이다.
결국 위에 보이는 숫자인 4,737,971은 '현재 필터링된 최근 12시간동안(위 캡쳐의 오른쪽 위에 시간) elasticsearch에 들어온 a count의 총합'이 나온다. 내 a count는 매분마다 카프카의 a토픽으로 프로듀싱된 갯수이므로 12시간동안 a토픽으로 프로듀싱된 총 갯수가 나온다.
저것도 따로 저장하고 Dashboard에서 Add해서 드래그로 크기 조절을 잘 하면 맨 첫번째의 캡쳐화면이 나온다. 그런데 첫번째 캡쳐의 오른쪽 위의 총 프로듀싱된 카운트는 어떻게 한걸까? 아래처럼 복잡하게 하면 된다.
a count, b count, c count의 각각 합을 구하고 Math로 모든 집계를 받아서 합을 구해준다.
근데 이렇게까지되면 복잡해지니까 elasticsearch로 값을 넣기 전에 미리 프로그래밍으로 가공해서 넣어두는것도 좋은 방법이다. 사실 맨 처음에 넣은 es데이터를 다시 보면 알겠지만 데이터 내의 all_count가 모든 카운트를 더한 값이어서 그거 가져다가 써도 된다.
2. 파이, 막대 그래프, 데이터 테이블 등
비율을 눈으로 보고 싶을때 주로 만드는 그래프이다. es로 쏘는 데이터의 포맷부터 보자.
{ "_index": "test2-2021.03.04", "_type": "fluentd", "_id": "pgw3_XcbZiIqZLsOSGe", "_version": 1, "_score": null, "_source": { "option": "0", "@timestamp": "2021-03-04T14:39:33.743248", "module": "a module", "file": "test.py", "request": { "data_size": 64489 } }, "fields": { "@timestamp": [ "2021-03-04T14:39:33.743Z" ] }, "sort": [ 1614868773743 ] }