Linux Opensource
이번 글에서는 InfluxDB와 Grafana를 이용해서 ElasticSearch 모니터링 대시보드를 만드는 방법에 대해 이야기해 보겠습니다. 두 막강한 오픈 소스를 이용해서 어떻게 데이터를 수집하고 효과적으로 보여줄 수 있는지 살펴보겠습니다.
InfluxDB는 시계열 데이터베이스의 한 종류입니다. 시계열 데이터베이스란 시간을 기반으로 지표를 쌓을 수 있게 해주는 데이터베이스입니다. 특별할 건 없고 mysql을 예로 든다면 time이라는 칼럼이 기본으로 탑재되어 있는 데이터베이스라고 생각하면 됩니다. InfluxDB는 설치 방법도 간단하고 사용법도 간단하며 특히 HTTP 기반의 Rest API를 제공하기 때문에 손쉽게 지표를 쌓을 수 있습니다. 설치에 대한 방법은 https://docs.influxdata.com/influxdb/v1.0/ 이곳을 참고하면 됩니다.
Grafana는 시각화 도구의 한 종류입니다. 쌓여 있는 데이터를 효과적으로 시각화할 수 있도록 해 주는 오픈소스입니다. 과거에는 mysql에 칼럼을 만들어서 데이터를 쌓고 D3나 ChartJS와 같은 스크립트를 이용해서 그려주어야 했었다면, Grafana는 데이터를 가져오는 쿼리를 쉽게 만들어서 그대로 시각화 해 주기 때문에 모니터링 대시보드를 만드는데 많이 사용되고 있습니다. 설치에 대한 방법은 http://grafana.org/ 이곳을 참고하면 됩니다.
간단하게 두 오픈소스에 대한 소개를 마치고 본격적으로 데이터를 쌓고 시각화해 보겠습니다. 두 시스템 모두 설치가 매우 간단하기 때문에 예제를 보면서 직접 해보시면 어렵지 않게 할 수 있을 겁니다. 이 글에서는 설치 과정은 다루지 않습니다.
우선 대시보드를 만들기 전에 어떤 데이터를 쌓을지에 대한 이야기를 먼저 해 보겠습니다. ES를 모니터링하는 툴들은 많이 있지만 역시 그중에서 가장 강력한 건 marvel 일 겁니다. 하지만 marvel은 치명적인 단점이 있죠. 네. 유료입니다. 그래서 오늘은 marvel에 견줄 수 있는 대시보드를 만들려고 합니다. 특히 marvel에서 볼 수 있는 다양한 지표 중에 엔지니어로서 가장 관심을 가질 만한 부분인 Rate와 Latency를 보여주는 대시보드를 만들어 보겠습니다.
그래서 아래의 항목들을 수집해 보려고 합니다.
search rate : 초당 search 건 수
search - query latency : search 중에서도 query 에 걸린 시간
get rate : 초당 get 건 수
get latency : get에 대한 응답 시간
indexing rate : 초당 indexing 건 수
indexing latency : indexing 하는데 소요되는 시간
데이터 수집은 ES에서 제공해 주는 stats 정보를 활용하겠습니다. http://es_url/_nodes/stats? pretty를 통해 확인하면 아래와 같은 JSON 형태의 응답을 볼 수 있습니다. 이 응답이 ES의 각 노드들의 현재 stats 정보입니다.
우리가 대시보드에 그리려는 값과 stats에서 확인한 값들의 관계는 아래와 같습니다.
search rate : search.query_total의 변화량
search - query latency : search.query_time_in_millis의 변화량 / search.query_total의 변화량
get rate : get.total의 변화량
get latency : get.time_in_millis의 변화량 / get.total의 변화량
indexing rate : indexing.index_total의 변화량
indexing latency : indexing.index_time_in_millis의 변화량 / indexing.index_total의 변화량
HQ plugin에서는 Search Latency를 search.query_time_in_millis / search.query_tatal로 나눈 값으로 표현하고 있는데요, 이 값들은 처음 구동 시부터 현재까지의 누적 값을 의미합니다. 그렇기 때문에 전체적인 평균값이 나오는 거지 특정 시간 동안의 값이 나오는 게 아닙니다. 성능은 Document가 늘어나고 Index가 늘어나면서 점차 느려지기 때문에 평균값은 현재의 성능을 희석시킬 수 있습니다. 그래서 특정 시간 동안의 변화량을 기준으로 삼아야 합니다.
위의 stats 링크를 통해 확인한 정보들을 바탕으로 아래와 같이 넣어 줍니다. Java를 이용해서 만든 예제 소스 코드의 일부입니다. (기회가 된다면 오픈소스화 해 보고 싶긴 합니다~)
InfluxDB에 쌓을 DB 이름은 es_monitoring_info, 그리고 measurements들은 docs-count, docs-deleted, get-time, indexing-time, search-time입니다. 그리고 그중에서도 get-time, indexing-time, search-time은 total과 time_in_millis라는 두 가지 항목을 수집합니다. 수집한 항목들이 잘 저장되는지는 InfluxDB의 웹 인터페이스를 통해서 확인해 보면 됩니다.
자.. 여기까지 되었다면 이제 항목을 수집하고 저장하는 것까진 된 상태입니다. 이제 본격적으로 Grafana를 이용해서 이 데이터들을 시각화해 보겠습니다.
기본적인 DataSource 설정 등은 생략하고 본론으로 들어가 보겠습니다. Get Latency를 그리는 방법입니다.
우선 Add Panel - Graph를 통해 새로운 그래프를 추가합니다.
그럼 아래와 같이 더미 형태의 그래프가 추가됩니다. General 탭에서 이름을 Get Latency로 바꿔 줍니다.
Metrics 탭에 가서 더미 형태의 그래프를 삭제한 후에 Panel data source를 ES Monitoring Info로 설정한 후 Add query 버튼을 클릭해서 쿼리의 바탕을 만들어 줍니다.
우리가 그리려는 값은 특정 시간 동안의 time_in_millis 변화량을 total의 변화량으로 나눠줘야 합니다. 그래야 그 시간 동안의 Get Latency를 정확하게 측정할 수 있기 때문입니다. 하지만 Grafana의 기본 UI로는 저렇게 복잡한 값을 표현할 수 없습니다. 그래서 모드를 우측 버튼에서 Toggle Edit Mode를 눌러서 아래와 같이 쿼리를 직접 수정할 수 있도록 변경합니다.
그리고 아래 쿼리를 입력해 줍니다. ES-URL과 NODE-NAME은 자신의 환경에 맞게 넣어 줍니다.
SELECT difference(max("millis"))/difference(max("total")) FROM "get-time" WHERE "clusterName" = 'ES-URL' AND "nodeName" = 'NODE-NAME' AND $timeFilter GROUP BY time($interval) fill(null)
그렇게 노드를 하나하나 넣어 주면 아래와 같은 그래프를 얻을 수 있습니다.
이와 같은 방식으로 Search Latency, Indexing Latency를 그릴 수 있습니다. 그리고 추가로, total의 변화량만을 그리게 되면 아래와 같이 초당 들어오는 Get, Search, Indexing의 개수를 확인할 수 있게 됩니다. 이는 웹 서버에서의 TPS와 같은 의미로 클러스터가 초당 처리하는 사용자의 요청수를 나타낼 수 있습니다.
위 예제에서 60으로 나눈 이유는 값을 수집하는 주기가 1분 단위이기 때문입니다.
이런 방식으로 그래프를 하나하나 그리게 되면 최종적으로는 아래와 같은 대시보드를 만들 수 있습니다.
총 Documents의 변화량과 삭제되는 현황, 디스크의 사용률, Get Latency, Get TPS 등등 Marvel 못지않은 훌륭한 대시보드를 가질 수 있습니다.
지금까지 InfluxDB와 Grafana를 통해서 상용 툴 못지않은 모니터링 대시보드를 만드는 방법을 다뤘습니다. 이렇게 우리 주변에는 다양한 오픈소스들이 있고 이 오픈소스들을 조합하면 좋은 모니터링 시스템을 만들 수 있습니다. 모니터링 대시보드를 만드는 데에 어려움을 겪고 계신 분들이 있다면 이 글이 도움이 되었으면 좋겠습니다.