InfluxDB, Telegraf, Grafana 를 활용한 Monitoring System 만들기(3)

저장소 설치메트릭 수집에 이어서 세번째로 Grafana를 이용하여 대시보드를 디자인하고 시각화하는 부분에 대한 포스팅입니다. Grafana는 인기가 많은 툴이라 들어보셨거나 이미 쓰고 있는 분들도 많을 듯 한데요. InfluxDB와 마찬가지로 Grafana 또한 사용자의 니즈를 적극 반영하면서 활발히 성장하고 있고 최근에는 3.0으로 업데이트 되었습니다. 

3.0으로 업데이트 되면서 큰 변화가 있었는데 grafana.net 이라는 플랫폼 형태로 서비스가 진화한 것입니다. 그동안 사용자들이 열열히 요구하던 파이차트와 히스토그램 같은 다양한 panel 및 ElasticSearch, CloudWatch, Prometheus 와 같은 data source 를 플러그인 형태로 grafana.net 에서 제공하는데 필요하면 다운 받아 설치하여 사용할 수 있습니다. 뿐만 아니라 app 이라는 형태로 특정 용도에 맞게 제작된 대시보드들을 공유하고 다운받아 사용할 수도 있습니다. 예를 들면 mysql 모니터링을 위해 Percona 에서 app(대시보드집합)을 만들어 올려두었는데 힘들게 디자인할 필요 없이 percona-app을 내려받아 사용할 수도 있습니다.  (다만 data source가 Prometheus 라서 여기서 설명하는 InfluxDB와는 아직은 사용할 수 없습니다.)

여기서는 3.0 버전을 기준으로 app 다운 방법이 아닌 직접 대시보드를 디자인하는 과정을 설명합니다.  보고싶은 대로 디자인하는 재미도 쏠쏠하고 모니터링 지표를 공부하고 효율적인 모니터링 방법을 생각하는 계기도 될 수 있어서 개인적으로는 직접 만들어 보는 것을 권고합니다. app의 경우 너무 세세하거나 장황하기도 하고 사용성이 높지 않을 것 같은 부분도 있어서 저 같은 경우는 app을 설치해보고 괜찮은 디자인 일부만 참고하여 비슷하게 만드는 식으로 사용하고 있습니다. 이처럼 업무환경에 맞게 직접 디자인하고 다른 대시보드의 좋은점도 참고한다면 편리하고 능동적인 모니터링이 될 수 있을 것 같습니다. 데이터소스 연동 및 기본적인 Panel 몇가지와 template 기능 정도만 익히면 손쉽게 멋진 스타일의 모니터링 툴을 디자인할 수 있습니다. 캡쳐 이미지가 많아서 내용이 좀 많아 보이는데 직접 설치하여 몇번 만져보면 쉽게 알 수 있는 내용들입니다.

Installation

InfluxDB, Telegraf 와 마찬가지로 설치가 매우 간단합니다. 

Redhat 계열은 아래와 같이 설치하면되고 타 플랫폼은 온라인 매뉴얼을 참고하면 됩니다.

1
2
3
4
5
6
7
8
9
$ sudo yum install https://grafanarel.s3.amazonaws.com/builds/grafana-3.1.1-1470047149.x86_64.rpm
$ sudo service grafana-server start
.. 또는 ..
$ wget https://grafanarel.s3.amazonaws.com/builds/grafana-3.1.1-1470047149.x86_64.rpm
$ sudo rpm -Uvh grafana-3.1.1-1470047149.x86_64.rpm
$
$ # grafana 서버 구동
$ sudo service grafana-server start
$

브라우저에서 3000 포트로 접속하여 홈화면에 제대로 뜨는지 확인 합니다. 포트를 변경하고 싶으면 /etc/grafana/grafana.ini 에서 설정을 변경한다음 grafana-server를 재시작 하면 됩니다.

최초 접속 시 User/Password 는 admin/admin 이고 사용자 관리 페이지에서 패스워드 변경가능 합니다.

Data Source

InfluxDB를 데이터소스로 사용하는 예시 입니다.

홈화면의 좌측 상단의 메뉴를 클릭하면 Data Sources 를 선택하고 아래와 같이 입력합니다. Type란에 앞서 말한 ElasticSearch, CloudWatch, Prometheus 등 다양한 데이테 소스를 지정할 수도 있는데 선택한 데이터소스에 맞게 설정 화면도 바뀝니다.

Type 을 InfluxDB로 선택하고 접속정보를 정확하게 입력해 줍니다.

그림과 같이 하단에 녹색으로 "Data source is working" 이라고 나오면 정상적으로 연동이 된 것입니다.

DB명은 두번째 포스팅에서 Telegraf 설치 시 지정했던 my_telegraf_test 로 하였습니다.

InfluxDB 접속 유저 및 패스워드는 아래와 같이 influxdb 에 접속하여 미리 유저를 생성해 놓은 정보로 입력해줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 [root@devdb:/root]# influx
Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:8086 version 0.10.0
InfluxDB shell 0.10.0
>
> show users
user admin
>
> CREATE USER smyoo WITH PASSWORD 'p@$$w0rd' WITH ALL PRIVILEGES;
>
> show users
user admin
smyoo true
>
>

Dashboard Design

좌측 상단의 메뉴에서 New Dashboard 를 생성합니다.  대시보드는 내부에 Row 로 구분되고 Row에 Panel이 들어가는 구조 입니다. (Dashboard > Row > Panel) 대시보드를 생성하면 기본적으로 하나의 Row가 있는데 왼편 측면에 숨어있는 녹색버튼이 Row 컨트롤러 입니다.

 Panel은 기본적으로 Dashboard list, Graph, Plugin list, Singlestat, Table, Text 를 지원하는데 나머지들은 플러그인을 설치하면 사용할 수 있습니다.

기본적으로 가장 많이 사용되는 Graph Panel 을 하나 추가 합니다. 

Penel 디자인은 Metric 탭에서 시작하는데 데이터 소스로부터 어떤 데이터를 쿼리할 지 설정하는 곳입니다.

하단의 Panel data source 란에 처음에 연동한 data source 이름을 지정하면 InfluxDB에 맞게 InfluxQL문법으로 쿼리란이 바뀌는데 다른 데이터 소스는 그에 맞게 쿼리창이 바뀝니다. InfluxDB는 다른 데이터소스와 달리 일반 SQL과 문법이 매우 비슷하여 기본적인 SQL문법에 어느정도 익숙하다면 따로 문법을 공부하지 않아도 설정하는데 무리가 없을 것입니다. 또한 타이핑하지 않고 클릭만으로도 대부분의 문법이 완성되도록 UI가 잘 만들어져 있어서 어렵지 않게 설정할 수 있습니다.

 select 절의 mean() 함수는 집계함수로서 평균을 의미하며 표준SQL에서의 avg() 함수로 보면 됩니다. alias()는 범례에 표시되는 글자를 설정하는 함수로서 표준 SQL의 AS 문법으로 보면 됩니다. alias를 지정하지 않으면 filed명이 범례로 표시 되는데 field명이 길 경우에는 alias를 적절히 사용하면 좋습니다.

 group by time() 는  Continuous Query(CQ)라는 InfluxQL의 문법인데 지정한 시간간격만큼 downsampling 하겠다는 의미 입니다. 예를 들어  SELECT mean(AAA) FROM BBB WHERE time < now() - 30d GROUP BY time(1m) 이라고 한다면 BBB 로부터 최근 30일 전(time < now-30d)의 AAA 값을 1분간격(group by time(1m))으로 다운샘플링하여 평균(mean)을 조회하라는 뜻입니다.

  •  select mean(aaa) from bbb where time < now() - 30d group by time(10s)
  •  select mean(aaa) from bbb where time < now() - 30d group by time(5m)
  •  select mean(aaa) from bbb where time < now() - 30d group by time(1h)

이러한 3가지 경우를 비교 했을 때 InfluxDB에서의 탐색 시간은 동일합니다. (time < now() - 30d 만큼의 데이터를 모두 탐색) 다만 10s --> 5m --> 1h 로 다운샘플링 시간 간격이 커질 수록 결과 건수는 줄어들기 때문에 InfluxDB 에서 grafana로 전송하는 시간과 grafna에서 그래프로 그리는 시간은 줄어들게 됩니다. 즉, CQ를 잘 활용하면 넓은 범위의 데이터 조회 시 대시보드 그리는 속도를 향상 시킬 수 있습니다. 사실 수십일 또는 수개월 정도 되는 장기간의 변화량추이를 보는데 굳이 초단위로 수집한걸 모두 가져와서 그래프로 그릴 필요는 없겠지요. 반대로 최근 몇분간 실시간 모니터링이나 특정 시점의 상세한 상태를 보려면 다운 샘플링 주기를 작게 해야 정확한 측정이 가능할 것입니다.

처음에는 기본적으로 group by time($interval)로 되어 있는데 조회하는 기간에 따라 grafana가 자동으로 $interval 값을 적절하게 지정해 줍니다. 따라서 주로 실시간 모니터링이나 며칠 정도 되는 기간의 데이터를 본다면 이 부분은 굳이 건드릴 필요가 없습니다. 그러나 장기간 추이 분석이 필요한 메트릭 대상이 많고 자주 사용한다면 InfluxDB의 Continuous Query (CQ)와 Retention Policy(RP)를 조합하여 탐색시간까지 줄여서 큰 효과를 볼 수 있습니다. 위 캡쳐 이미지의 쿼리에서 default라고 되어 있는 부분이 Retention Policy(RP)의 이름인데 CQ 와 RP에 대한 자세한 내용은 링크로 대신하겠습니다.  https://docs.influxdata.com/influxdb/v0.10/guides/downsampling_and_retention/

그리고 fill() 부분은 중간에 비는 곳이 있으면 뭘로 채울지 의미하는 것인데 none, null, 0, previous(이전 값) 중에 선택할 수 있습니다.

다음으로 Axes 탭은 축(axis)에 대한 설정입니다.

왼쪽 Y축이 기본적으로 활성화 되어 있고 필요할 경우 데이터타입과 최소/최대값등을 지정할 수 있습니다.

여기서는 CPU사용량을 예시로 하여 단위는 percent(0-100)을 선택하였고 최소값은 0, 최대값은 100으로 지정하였습니다.

Y축은 오른쪽에도 설정할 수도 있고 오른쪽 왼쪽 다 보이게 할 수도 있습니다.

범례의 색깔 부분을 클릭하면 좌/우 Y축 중에 선택할 수 있고 색도 선택할 수 있습니다.

범례를 디자인하는 탭입니다.

테이블 형태를 선택할 수도 있고 범례의 위치 및 최대/최소/평균/총합/현재 값 등을 볼 수 있게 지정할 수 있습니다.

Display 는 그래프 형태를 디자인하는 탭으로 Line, Bar, Point 형태로 선택할 수 있고 Line & Point 와 같이 같이 동시에 지정할 수도 있습니다. 또한 그래프의 색상 채움 농도(Fill), 라인 두께(Line Width)도 선택할 수 있습니다.

그리고 여기서 중요한 것이 stack 인데 여러가지 값들을 충첩해서 누적형태로 보여줄 경우 stack을 선택합니다. stack을 선택하면 Hover Info 항목에 stacked value 가 생기는데 그래프에 마우스 오버 했을 시 나오는 범례값을 누적(cumulative)해서 보여줄 지 각각(individual) 보여줄 지 선택할 수 있습니다. 여기서는 CPU 사용량을 예로 들었고 sys, iowait, user, idle 값이 모두 누적해서 총 100%가 되어야 하므로 stack을 선택하고 stacked value는 individual 을 선택 하였습니다.

Derivative()

InfluxDB에 쿼리할 때 중요한 기능중에 하나인 Derivative() 함수에 대한 설명입니다.

수집하는 메트릭 중에는 변화량이 아닌 계속해서 누적해서 증가하는 값이 있습니다. 예를 들면 MySQL status 의 대부분의 값들이 그러한데 그중 Com_select 값으로 설명하겠습니다. 하단의 이미지와 같이 단순히 Com_select 값을 선택하면 우상향으로 계속 증가하고 누적값이라 값이 Y축 값이 상당히 큰 것을 볼 수 있습니다.

이 경우 Transformations > derivative() 함수를 사용하면 됩니다. 

QPS(Query Per Second)를 모니터링할 목적이라면 derivative(1s) 로 하면 1초간 변화량을 그려줍니다. 1분사이의 변화량은 derivative(60s)으로 할수 있고 이걸로 대략적으로 QPS를 환산한다면 Derivative(60s)/60 과 같은 식으로 응용할 수도 있습니다.

원하는 모습의 그래프가 그려진 것을 볼 수 있습니다.

한가지 주의할 점은 fill(none) 부분 인데 디폴트로 fill(null)이 되어 있는 것을 none으로 변경해 줍니다. 이렇게 하는 이유는 그래프를 확대/축소하다 보면 중간에 값이 비는 경우가 있을 시 갑자기 그래프가 사려져버리는 현상을 방지하기 위함입니다. 처음엔 버그인가 싶었는데 빈 값이 fill(null)이면 null과의 연산(derivative()) 결과는 null 이기 때문에 사라져 버리는 것 같다는 생각도 듭니다.

Math()

산술연산을 하거나 필드간 연산을 할때 사용하는 함수입니다.

InfluxDB 에서는 SELECT 절에서 연산자로 바로 연산이 가능하지만 Grafana에서는 math() 함수를 통해서만 연산이 가능합니다. 예를 들면 math(필드1 / 100), math(mean(필드1) + mean(필드2)) 와 같이 활용할 수 있습니다.

Template & Repeat

지금까지 예시로 설정한 쿼리문을 보면 WHERE host='서버명' 과 같이 특정 서버를 지정하였습니다. 그러나 서버가 수십대 혹은 수백대라면 일일이 서버마다 쿼리를 작성하고 대시보드를 만드는 것도 보통일이 아닐 것입니다. 이럴때 편리하게 사용할 수 있는 것이 Template 기능입니다.

화면 상단의 대시보드 설정에 보면 Templating 기능이 있는데 Template을 생성하고 관리할 수 있습니다. Template를 생성하면 tag값(여기서는 host명)의 리스트를 지정하면 되는데 "서버1,서버2,서버3" 과 같이 콤마로 구분하여 수동으로 리스트를 작성할 수 도 있고(Custom Type) 서버명만 추출하는 쿼리를 지정할 수도 있습니다.(Query Type) 

서버가 추가될 때마다 손이 가는 일이 없도록 하려면 아무래도 쿼리로 작성하는 것이 좋을 것입니다. 쿼리 타입으로 하고 Refresh란에 "On Dashboard Load"  나 "On Time Range Change"를 선택해주면 서버가 추가/제거 될 시 리스트를 자동으로 갱신합니다. 여기서는 mysql 서버의 호스트 및 포트 정보를 가져오기 위해 다음과 같이 Template 변수에 쿼리를 지정하였습니다.

글로 설명하기 보다 한번 보는 것이 좋을 것 같아 실제 활용하는 예시 동영상을 만들어 보았습니다. (유투브 화면 설정에서 품질을 720p 이상으로 보시길 권장 합니다.)

이와같이 Template 변수를 활용하면 서버가 추가될 때마다 디자인을 위해 작업할 일이 없어질 뿐더러 Repeat 기능과 같이 사용하면 다이나믹한 대시보드를 만들 수도 있습니다. 또한 동영상 앞부분에 잠깐 나오지만 서버명과 같은 tag 값 외에도 앞서 Metric 디자인 부분에서 설명한 다운샘플링 Interval을 Template 변수로 지정할 수도 있습니다.

마치며..

모니터링을 만드는데 필요한 기본기능 위주로 작성하였는데 이 외에도 다음과 같이 몇 가지 유용한 기능이 더 있습니다.

  • Snapshot : 특정 시점의 대시보드 화면을 스냅샷으로 기록할 수 있습니다. 트래픽이 몰리는 빅 이벤트가 있는 시점의 모니터링 상태나 성능테스트 모니터링 결과를 스냅샷을 기록해 놓고 나중에 유용하게 참고 할 수 있습니다.
  • Export & Import : 대시보드 디자인은 모두 json으로 저장되는데 쉽게 Export / Import 함으로서 공유 및 마이그레이션이 간편합니다.
  • Organization : 그룹 관리 기능으로 조직별로 대시보드 및 사용자를 구분하여 관리할 수 있습니다.
  • Annotation : 특정 시점의 이벤트를 기록하여 그래프에 표시할 수 있습니다. 예들들어 배포(Deploy)시점 마다 특정 event 테이블에 기록해주면 해당 시점을 대시표드에 표시해줌으로서 모니터링에 참고할 수 있습니다.

직접 사용해보면 크게 어렵지 않게 사용할 수 있는 기능들이고 Live Demo(http://play.grafana.org/) 페이지에 활용 예시가 잘 만들어져 있어서 참고하기 좋습니다.

이상으로 3회에 걸쳐 작성한 생각보다 꽤 장황해져버린 포스팅을 마치겠습니다.

읽어주셔서 감사합니다. :)

Happy Monintoring ~ !!


Popit은 페이스북 댓글만 사용하고 있습니다. 페이스북 로그인 후 글을 보시면 댓글이 나타납니다.