2016년 8월 31일 수요일

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 계열은 아래와 같이 설치하면되고 타 플랫폼은 온라인 매뉴얼을 참고하면 됩니다.
$ 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 에 접속하여 미리 유저를 생성해 놓은 정보로 입력해줍니다.

[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)를 모니터링할 목적이라면 derivate(1s) 로 하면 1초간 변화량을 그려줍니다. 1분사이의 변화량은 derivate(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 ~ !!


2016년 8월 2일 화요일

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

데이터 저장소로 InfluxDB를 설치했으면 다음으로는 모니터링 데이터를 수집해야 할 것입니다.
데이터 수집에는 다양한 방법이 있지만 여기서는 Telegraf를 이용하는 방법을 설명합니다.
Telegraf를 선택한 이유는 InfluxDB와 마찬가지로 Go언어로 개발되어 설치가 매우 간편하고 다양한 종류의 수집/저장 플러그인을 간단한 설정으로 사용 가능하기 때문입니다.
실제 MariaDB 5.5, MySQL 5.6 에서 약 1년 넘게 사용해본 결과 별 다른 이슈 없이 만족스럽게 사용하고 있고 기능상 조금 아쉬웠던 부분도 비교적 활발하게 업데이트되고 있는 것 같습니다.
플러그인은 Input/Output Plugin 으로 구분되는데 Input Plugin은 수집하는 대상을 의미하며 여기서는 system 및 mysql을 모니터링 대상으로 수집합니다.
Output Plugin은 수집한 데이터를 전송하는 Plugin으로서 주로 InfluxDB나 Graphite 같은 시계열DB가 될 수 있고 일반 파일이나 Kafka같은 메시징 시스템이 될 수도 있습니다.
다양한 Plugin관련 정보는 Github을 참고하면 됩니다.



Architecture
설치에 앞서 모니터링 시스템 구성은 간단하게 아래와 같이 생각하였습니다.
각 DB서버에 모니터링 데이터 수집 agent로서 telegraf나 FluentD 또는 자체 개발한 프로그램 등을 백그라운드로 실행하여 모니터링 서버로 push하는 방식입니다.
이런 구성에서는 매번 서버가 추가 될 때마다 해당 서버에 agent를 설치해줘야 하는 번거로움이 있습니다.
그래도 모니터링 서버를 통해서 다른서버를 접근할 수 없어 보안상 안전하고 모니터링 서버에 수집 부하가 집중되는 문제를 피할 수 있을 것입니다.



반대로 아래 그림과 같이 모니터링 서버에서 각 서버로 접속하여 get하는 방식으로 구성할 수도 있습니다.
이렇게 구성할 경우 모니터링 대상 서버가 추가될 때마다 agent용 프로그램들을 설치할 필요 없이 간단히 설정만 추가하면 되는 편리함은 있습니다.
그러나 모니터링 서버가 보안 위험에 노출될 경우 다른 서버들로 접속이 가능한 위험이 있습니다.
특히 모니터링 대상 서버가 DB서버라면 심각한 보안 위험요소가 될 수 있습니다.
또한 모니터링 서버에 수집 부하가 집중되는 문제도 있어서 이 방법은 고려하지 않고 agent에서 push 하는 방식으로 구성하였습니다.



Preparation (Optional)
Telegraf 설치에 앞서 사전 준비로 InlfuxDB 서버의 호스트 정보를 /etc/hosts 에 추가 합니다.
이 부분은 생략해도 되지만 향후 모니터링 서버를 이관하게 될 경우를 대비해서 편의상 설정하는 것으로 보면 됩니다.

$ echo "" >> /etc/hosts
$ echo "# InfluxDB Server (by bigfoot)" >> /etc/hosts
$ echo "
192.168.100.11 influxdb" >> /etc/hosts
$ cat /etc/hosts 

제대로 접속되는지 포트 스캔으로 테스트 해봅니다.

$ nc -z 192.168.100.11 8086
Connection to 192.168.100.11 8086 port [tcp/d-s-n] succeeded!

telegraf 에서 mysql로 접속할 수 있도록 아래와 같이 DB유저도 생성해 줍니다.
기존에 있던 계정을 사용하면 생략해도 되지만 모니터링용 DB유저를 구분하기 위해 별도 유저를 추가 하였습니다.

MySQL> grant all on *.* to 'telegraf'@'127.0.0.1' identified by "p@$$w0rd";
Query OK, 0 rows affected (0.00 sec)




Installation
사전 준비가 끝났다면 아래와 같이 Telegraf를 다운 받아 설치 합니다.
Redhat 계열은 아래와 같이 하면 되고 타 플랫폼은 온라인 메뉴얼을 참고 합니다.

$ wget https://dl.influxdata.com/telegraf/releases/telegraf-0.13.1.x86_64.rpm
... 안되면...
$ curl -O https://dl.influxdata.com/telegraf/releases/telegraf-0.13.1.x86_64.rpm

# Install
$ sudo yum localinstall telegraf-0.13.1.x86_64.rpm


앞서 언급했듯이 설치가 매우 간단합니다.
설치가 끝났으면 설정파일을 생성하고 기동해주기만 하면 됩니다.

참고로 글을 쓰는 현재(2016년 7월)  telegraf 최신 버전은 0.13.1 이고 제가 사용하던 버전은 0.10.2 버전 이었습니다.
원래는 쓰고 있는 버전 기준으로 포스트를 작성하려 했으나 최신 버전의 telegraf에서 mysql 관련 수집 데이터가 더 많아 최신버전 기준으로 다시 테스트하여 포스트를 작성하였습니다.

기존 telegraf에서는 show global status 와 user별 thread수 정도만 수집되었고 그외 필요한 부분은 따로 스크립트를 작성해서 수집했었는데 지금은 온전히 telegraf만으로 가능하게 되었습니다.

업데이트 될수록 플러그인들의 기능이 점점 좋아지는 것 같으니 최신 버전이 나오면 한번씩 관심을 갖고 보면 좋을 것 같습니다.

설치하면 /etc/telegraf 에 telegraf.conf 파일이 생성되어 있는데 원하는 플러그인 사용을 위해 다시 생성합니다.
아래는 각종 system 모니터링 지표 및 MySQL 모니터링 데이터를 수집하고 InfluxDB로 저장하도록 샘플 telegraf.conf 를 생성하는 예시입니다.

$ cd /etc/telegraf
$ telegraf -sample-config -input-filter cpu:disk:kernel:mem:net:netstat:system:mysql -output-filter influxdb > telegraf.conf

이렇게 생성된 설정 파일에 접속정보나 기타 필요한 정보를 수정해서 telegraf 를 기동합니다.

-input-filter  에 들어가는 값 중 system 모니터링 관련 수집 가능한 데이터는 Github의 해당 플러그인 파일들을 보면 대략 알 수 있습니다.

mysql 관련 수집 정보를 보려면 Github의 MySQL 플러그인 소스를 참고하면 됩니다.
Go언어를 몰라도 소스내에 있는 쿼리나 MySQL명령어들을 보면 대략 알 수 있습니다.

이처럼 다른 input 플러그인도 사용하기 전에 어떤 데이터를 수집하는지 궁금하면 소스코드를 참고하는 것도 좋을 것 같습니다.

설정파일은 크게 agent, output plugin, input plugin 설정으로 구분 됩니다.
agent 설정은 수집 및 전송 주기를 설정하는데 여기서는 실시간 모니터링을 위해 1초마다 수집하고 5초마다 전송하도록 설정하였습니다.
5초마다 전송하는 이유는 나중에 grafana로 볼때 auto refresh 주기가 최소 5초여서 거기에 맞추었습니다.
또한 호스트명을 원래의 호스트명과 다르게 지정하고 싶으면 hostname 항목에 지정하면 되는데 여기서는 mytest1로 하였습니다.
hostname은 influxdb에 저장될 때 모든measurement(table)에 tag(indexed column)로 지정된다고 보면 됩니다.

[agent]
  interval
= "1s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval
= "5s"
  flush_jitter = "0s"
  debug = false
  quiet = false
 
hostname = "mytest1"
  omit_hostname = false


output plugin 설정은 /etc/hosts 파일에 추가했던 influxdb로 지정합니다.
그리고 influxdb에 저장될 database명은 기본 값은 telegraf인데 여기서는 구분을 위해 my_telegraf_test로 설정 하였습니다.

[[outputs.influxdb]]
  urls = ["http://influxdb:8086"] # required
  database = "my_telegraf_test" # required
  precision = "s"
  retention_policy = "default"
  write_consistency = "any"
  timeout = "5s"

input plugin 설정에서 system모니터링 관련해서는 추가로 설정할 부분은 딱히 없으나 필요하면 설정파일의 주석을 참고하여 수정하면 됩니다.
mysql 관련 설정은 접속을 위해 앞서 만들어둔 telegraf 유저와 패스워드를 설정합니다.
기본적으로 show global status 와 show global variables 항목들은 모두 수집하는데 그 외 필요한 것들은 ture/false 로 설정할 수 있습니다.
여기서는 show slave status 항목만 추가로 수집하도록 설정 하였습니다.
그리고 show global variables 는 사실상 자주 수집할 필요가 없어서 설정 마지막 부분에 interval_slow 값으로 보관주기를 따로 제어하는 것도 볼 수 있습니다.
여기서는 30분으로 되어 있습니다.

[[inputs.mysql]]
  servers = ["telegraf:p@$$w0rd@tcp(127.0.0.1:3306)/"]
  ## the limits for metrics form perf_events_statements
  perf_events_statements_digest_text_limit  = 120
  perf_events_statements_limit              = 250
  perf_events_statements_time_limit         = 86400
  #
  ## if the list is empty, then metrics are gathered from all databasee tables
  table_schema_databases                    = []
  #
  ## gather metrics from INFORMATION_SCHEMA.TABLES for databases provided above list
  gather_table_schema                       = false
  #
  ## gather thread state counts from INFORMATION_SCHEMA.PROCESSLIST
  gather_process_list                       = false
  #
  ## gather auto_increment columns and max values from information schema
  gather_info_schema_auto_inc               = false
  #
  ## gather metrics from SHOW SLAVE STATUS command output
  gather_slave_status                       = true
  #
  ## gather metrics from SHOW BINARY LOGS command output
  gather_binary_logs                        = false
  #
  ## gather metrics from PERFORMANCE_SCHEMA.TABLE_IO_WAITS_SUMMART_BY_TABLE
  gather_table_io_waits                     = false
  #
  ## gather metrics from PERFORMANCE_SCHEMA.TABLE_LOCK_WAITS
  gather_table_lock_waits                   = false
  #
  ## gather metrics from PERFORMANCE_SCHEMA.TABLE_IO_WAITS_SUMMART_BY_INDEX_USAGE
  gather_index_io_waits                     = false
  #
  ## gather metrics from PERFORMANCE_SCHEMA.EVENT_WAITS
  gather_event_waits                        = false
  #
  ## gather metrics from PERFORMANCE_SCHEMA.FILE_SUMMARY_BY_EVENT_NAME
  gather_file_events_stats                  = false
  #
  ## gather metrics from PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_SUMMARY_BY_DIGEST
  gather_perf_events_statements             = false
  #
  ## Some queries we may want to run less often (such as SHOW GLOBAL VARIABLES)
  interval_slow                   = "30m"


참고로 한 서버에서 포트로 구분하여 mysql을 멀티인스턴스로 운영하는 경우 [[inputs.mysql]] 섹션만 추가해주면 모두 수집 가능합니다.

[[inputs.mysql]]
  servers = ["telegraf:p@$$w0rd@tcp(127.0.0.1:3306)/"]
  gather_slave_status                       = true

[[inputs.mysql]]
  servers = ["telegraf:p@$$w0rd@tcp(127.0.0.1:3307)/"]
  gather_slave_status                       = true

[[inputs.mysql]]
  servers = ["telegraf:p@$$w0rd@tcp(127.0.0.1:3308)/"]
  gather_slave_status                       = true


설정이 끝났으면 아래와 같이 telegraf를 기동 합니다.

[root@mytest1 telegraf]#
[root@mytest1 telegraf]# service telegraf start

Starting the process telegraf [ OK ]
telegraf process was started [ OK ]
[root@mytest1 telegraf]#
[root@mytest1 telegraf]# service telegraf status

telegraf Process is running [ OK ]
[root@mytest1 telegraf]#



수집 및 전송 과정에 에러가 없는지 확인하기 위해 로그 파일을 확인합니다.
주로 influxdb 또는 mysql로 접속이 실패하거나 수집하는 시간이 설정한 수집주기 보다 오래 걸릴 경우일텐데 로그파일 내용을 보고 적절히 조치하면 됩니다.
아래와 같이 Error 정보가 없다면 정상입니다.

[root@mytest1 telegraf]# tail -f /var/log/telegraf/telegraf.log
2016/07/24 00:46:46 Output [influxdb] wrote batch of 385 metrics in 34.113251ms
2016/07/24 00:46:51 Output [influxdb] buffer fullness: 385 / 10000 metrics. Total gathered metrics: 5657. Total dropped metrics: 0.
2016/07/24 00:46:51 Output [influxdb] wrote batch of 385 metrics in 37.844375ms
2016/07/24 00:46:56 Output [influxdb] buffer fullness: 385 / 10000 metrics. Total gathered metrics: 6042. Total dropped metrics: 0.
2016/07/24 00:46:56 Output [influxdb] wrote batch of 385 metrics in 33.971023ms
2016/07/24 00:47:01 Output [influxdb] buffer fullness: 385 / 10000 metrics. Total gathered metrics: 6427. Total dropped metrics: 0.
2016/07/24 00:47:01 Output [influxdb] wrote batch of 385 metrics in 27.555229ms
2016/07/24 00:47:06 Output [influxdb] buffer fullness: 385 / 10000 metrics. Total gathered metrics: 6812. Total dropped metrics: 0.
2016/07/24 00:47:06 Output [influxdb] wrote batch of 385 metrics in 32.376433ms
2016/07/24 00:47:11 Output [influxdb] buffer fullness: 385 / 10000 metrics. Total gathered metrics: 7197. Total dropped metrics: 0.
2016/07/24 00:47:11 Output [influxdb] wrote batch of 385 metrics in 34.905804ms





InfluxDB Data Check
실제 수집이 잘 되었는지 influxdb에서 확인해 봅니다.

[root@monsvr ~]# 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 databases

name: databases
---------------
name
_internal
my_telegraf_test


설정한대로 my_telegraf_test database가 생성되어 있어야 합니다.
input plugin에 지정한대로 다수의 measurement가 생성되어 있고 조회해보면 수집한 데이터가 저장되고 있음을 확인할 수 있습니다.
mysql 모니터링 항목을 더 지정하면 관련measurement가 더 나타날 수 있습니다.

> use my_telegraf_test
Using database my_telegraf_test
>
> show measurements
name: measurements
------------------
name
cpu
disk
kernel
mem
mysql
mysql_variables
net
netstat
system

> show tag keys from mysql
name: mysql
-----------
tagKey
host
server

> show tag values from mysql with key=host
name: hostTagValues
-------------------
host
mytest1

> show field keys from mysql
name: mysql
-----------
fieldKey
aborted_clients
aborted_connects
access_denied_errors
busy_time
bytes_received
bytes_sent
commands_admin_commands
commands_alter_db
... 생략 ...
...(show slave status 관련 정보 추가된 것 확인)...
slave_Connect_Retry
slave_Exec_Master_Log_Pos
slave_Last_Errno
slave_Last_IO_Errno
slave_Last_SQL_Errno
slave_Master_Port
slave_Master_Server_Id
slave_Read_Master_Log_Pos
slave_Relay_Log_Pos
slave_Relay_Log_Space
slave_Seconds_Behind_Master
slave_Skip_Counter
slave_Slave_IO_Running
slave_Slave_SQL_Running
slave_Until_Log_Pos
slave_heartbeat_period
slave_open_temp_tables
slave_received_heartbeats
slave_retried_transactions
...  생략 ...
threadpool_idle_threads
threadpool_threads
threads_cached
threads_connected
threads_created
threads_running

> select host, slave_Slave_IO_Running, slave_Slave_SQL_Running, slave_Seconds_Behind_Master from mysql limit 10
name: mysql
-----------
time                    host    slave_Slave_IO_Running  slave_Slave_SQL_Running slave_Seconds_Behind_Master
1469294365000000000     mytest1 1                       1                       0
1469294366000000000     mytest1 1                       1                       0
1469294367000000000     mytest1 1                       1                       0
1469294368000000000     mytest1 1                       1                       0
1469294369000000000     mytest1 1                       1                       0
1469294370000000000     mytest1 1                       1                       0
1469294371000000000     mytest1 1                       1                       0
1469294372000000000     mytest1 1                       1                       0
1469294373000000000     mytest1 1                       1                       0
1469294374000000000     mytest1 1                       1                       0




마치며...
모니터링 데이터 수집 agent로서 무언가 설치할 경우 이로 인한 오버헤드를 고려하지 않을 수 없을텐데요.
수집하는 메트릭 수에도 어느정도 좌우되겠지만아주 무지막지하게 많은 데이터를 수집하는게 아니라면 telegraf로 인한 오버해드는 무시해도 될 정도로 미미하다고 보면 될 것 같습니다.
실제로 약  100여개의 메트릭(show global status, show slave status, system monitoring)을 수집하고 5초에 한번씩 influxdb로 전송하는데 문제없이 운영하고 있습니다.
실제 CPU사용량을 보아도 전체 5/3200% 이내로 사용하는 것을 볼 수 있습니다. (제일 하단 파란색)

이어서는 Grafana를 이용하여 모니터링 대시보드를 만드는 과정을 포스팅할 예정인데 아래는 맛보기 캡쳐 화면 입니다.