본문 바로가기

운영체제/리눅스

[CentOS7] 시스템 모니터링 서버 이해 0 - InfluxDB, Grafana , Telegraf 프로세스 이해

구축 :

 

InfluxDB, Grafana :

https://computingforgeeks.com/install-grafana-and-influxdb-on-centos-7/

 

telegraf

https://computingforgeeks.com/monitor-linux-system-with-grafana-and-telegraf/

 

 

======================================================

 

서버의 관제 (Monitoring) 에 대해서

DevOps의 역량이 점점 중요해지면서, 개발자가 서버의 운영에도 적극 개입하게 되었습니다. 서버의 리소스 뿐만 아니라 다른 시계열 데이터로 된 지표들을 미리 관제하여 서비스에 이상이 생겼음을 즉시 통보 받을 수 있어야합니다. 과거 시스템 관리자로부터 통보 받던 방식은 관제 대상이 제한적이라는 한계가 있습니다.

이 글에서는 1) 오픈소스로 공개된 influxdata의 tsdb(Time Series DataBase)인 influxdb와 collector인 telegraf를 통해 시계열 데이터를 적재하고, 2) 오픈소스 대시보드인 grafana 를 통해 관제 대시보드 구성 및 알림 통보 (alert)를 구성하여, 3) 특정 상황에서 사용자가 정의한 동작을 수행하도록 하는 방법을 설명합니다.

시스템 구조

먼저, 각 서버에는 서비스와 telegraf 서비스가 동작합니다. telegraf는 서비스와 OS의 리소스를 모아서 (collect) influxdb에 적재합니다. 물론 influxdb의 http 프로토콜을 통해 개발자가 원하는 데이터를 직접 적재할 수 도 있습니다.  influxdb는 서비스 그룹당 하나로 구성됩니다. 마지막으 로 grafana를 통해  influxdb의 데이터를 조회하여 대시보드로 구성합니다. 관제 대상 중 grafana의 alert 기능을 통해 slack으로 통보하거나, webhook을 통해 개발자가 정의한 동작을  수행하도록 할 수 있습니다.

diagram_170102
그림1. 시스템 구성도

데이터의 흐름과 동작은 다음과 같습니다:

  1. telegraf에서 influxdb로 OS 리소스 데이터 적재
  2. telegraf에서 influxdb로 잘 알려진 서비스 데이터 적재
  3. 서비스에서 influxdb로 직접 적재
  4. grafana에서 influxdb를 조회하여 차트 및 대시보드 구성
  5. grafana에서  구성한 차트에 대해 slack 통보 추가
  6. grafana에서 구성한 차트에 대해 webhook 추가

시작하기

서비스 endpoints

로컬 mac os에서 시스템을 구성하는 방법을 설명 하겠습니다. 먼저 아래와 같은 구성으로 endpoint를 구성 하겠습니다:

  • serviceA: localhost:8080
  • influxdb: localhost:8086
  • grafana: localhost:80

여기서 serviceA 는 nodejs 런타임에서 동작하는 REST API 서버입니다. GET /api/hello 하나의 api를 서비스하며, api 호출수와 지연시간을 influxdb로 전송합니다. serviceA의 전체 코드는 다음 링크에서 확인할 수 있습니다.

Influxdb

앞서 간단히 소개한 것 처럼, influxdb는 시계열 데이터베이스 (Time Series DataBase, TSDB) 입니다. golang으로 작성된 이 데이터베이스의 데이터는 유닉스 시간 – 흔히 timestamp라고 부르는 – 과 해당 시간에 해당하는 복수 개의 숫자로 된 필드 값, 그리고 태그로 이루어져 있습니다.

몇 가지 주요 특징들은 다음과 같습니다:

  • golang으로 작성되어 단일 바이너리로 제공됨. 외부 의존성이 없음. 즉, 설치와 환경설정이 간편함
  • HTTP API 를 통해 읽기/쓰기 동작이 이루어짐. 읽기/쓰기가 간편함
  • SQL 구문과 같은 조회 및 집계가 가능함 (e.g. 태그를 이용한 where clause)
  • 자동 리텐션 정책을 지원
  • HA, Relay – buffering, sharding, recovering – 기능 지원
  • HA, Clustering 지원 (단, 유료 버전에서만 지원됨)

읽기/쓰기가 간편하고 golang으로 작성되어 성능이 좋기 때문에, 과거 cacti와 같은 서비스에서 많이 사용됐던 RRDTool (Round Robin Database Tool) 과 달리 다른 서비스에서 http 프로토콜을 통해 손쉽게 데이터를 저장하고, 집계 데이터를 읽어서 다양한 서비스로 연동할 수 있습니다. (e.g. anomaly detection)

더 자세한 내용은 공식 문서를 참고하시기 바랍니다.

# homebrew를 통해 설치
$ brew update
$ brew install influxdb
==> Downloading https://homebrew.bintray.com/bottles/influxdb-1.1.1.sierra.bottle.tar.gz

To have launchd start influxdb now and restart at login:
  brew services start influxdb
Or, if you don’t want/need a background service you can just run:
  influxd -config /usr/local/etc/influxdb.conf
==> Summary
  /usr/local/Cellar/influxdb/1.1.1: 24B

이 글을 작성하는 시점에는 1.1.1 버전이 homebrew에 릴리즈 되어 있습니다. 설치 진행중 콘솔 출력 중 brew 명령어를 통해 간단히 서비스를 시작할 수 있으며 /usr/local/etc/influxdb.conf 가 구성 파일의 경로이고 /usr/local/Cellar/influxdb/1.1.1 이 바이너리 경로임을 나타냅니다. 구성 파일은 열어서 한번씩 훑어보시기 바랍니다. (우리는 로컬에 테스트할 목적이므로 특별히 수정할 부분은 없습니다. http endpoint  포트가 default로 8086 임을 확인할 수 있습니다.)

# homebrew를 통해 서비스 구동
$ brew services start influxdb

==>
Successfully started `influxdb` (label: homebrew.mxcl.influxdb)

# 서비스 동작 확인
$ brew services list
Name     Status  User Plist
influxdb started {username} /Users/{username}/Library/LaunchAgents/homebrew.mxcl.influxdb.plist

# influx shell 접속
$ influx

Connected to http://localhost:8086 version v1.1.1
InfluxDB shell version: v1.1.1
> show databases
name: databases
name
—-
_internal
> use _internal
> show measurements
name: measurements
name
—-
cq
database
httpd
queryExecutor
runtime

처음 shell에 접속하면 _internal 데이터베이스 한 개만 존재하는데, 이름에서 알 수 있듯이 influxdb 내부용 데이터베이스입니다. 그 안의 measurements 에는 메타 데이터 뿐만 아니라 influxdb 서비스 동작 중 리소스 사용 현황까지 있습니다.

> select * from runtime limit 1
name: runtime
time Alloc Frees HeapAlloc HeapIdle HeapInUse HeapObjects HeapReleased HeapSys Lookups Mallocs NumGC NumGoroutine PauseTotalNs Sys TotalAlloc hostname
—- —– —– ——— ——– ——— ———– ———— ——- ——- ——- —– ———— ———— — ———- ——–
1483495780000000000 3099184 43365 3099184 974848 4628480 26648 0 5603328 15 70013 1 19 182224 10230008 4819872 localhost

Telegraf

다음은 telegraf 서비스 구성 방법입니다. 마찬가지로 golang 으로 작성된 agent 서비스로, 설치와 구성 파일 배포가 간단합니다.

$ brew install telegraf
==> Downloading https://homebrew.bintray.com/bottles/telegraf-1.1.2.sierra.bottle.tar

To have launchd start telegraf now and restart at login:
  brew services start telegraf
Or, if you don’t want/need a background service you can just run:
  telegraf -config /usr/local/etc/telegraf.conf

서비스를 시작하기에 앞서, /usr/local/etc/telegraf.conf 파일을 열어 살펴 봅시다. default로 설정되어 있는 [agent], [[outputs.influxdb]] 항목은 로컬 환경 구성이므로 그대로 두어도 괜찮습니다. 중요한 부분은 [[inputs.*]] 로 시작하는 항목들인데, 다음 링크를 참고하여 데이터를 가져올 수 있습니다. 또한 [[outputs.*]] 에는 influxdb 뿐만 아니라 다양한 체널로 입력값을 보낼 수 있습니다. (e.g. kafka와 같은 mq에 보내 실시간 처리에 이용)

일단 아무런 수정없이 서비스를 동작 시키겠습니다.
$ brew services start telegraf

이제 로컬 서버의 cpu, memory, process, … 와 같은 관제에 필요한 기본적인 데이터가 influxdb로 유입되기 시작합니다.

$ influx
> show databases
name: databases
name
—-
_internal
telegraf

> use telegraf

_internal 데이터베이스 외에 telegraf 데이터베이스가 추가된 것을 볼 수 있습니다. (telegraf.conf 의 [[outputs.influxdb]] 내에 있는 database 값을 수정하면 바꿀 수 있음)

> show measurements
name: measurements
name
—-
cpu
disk
mem
processes
swap
system

현재부터 10분 전까지의 시스템 사용량의 매 30초 평균을 가져오는 쿼리입니다.

> select mean(usage_system) from cpu where time > now() - 10m group by time(30s)
name: cpu
time mean
—- —-
1483535550000000000 5.112823832738451
1483535580000000000 4.554704323867991
1483535610000000000 4.156467778807397
1483535640000000000 5.1474029903729095
1483535670000000000 5.787787087879861

잘 쌓이고 있음을 확인 했으니, 이제 service 데이터베이스를 생성 후 serviceA를 동작시켜 같은 방식으로 확인 해보겠습니다.

> create database service

ServiceA

serviceA는 앞서 설명했던 것 처럼 nodejs 런타임에서 동작하는 아주 간단한 rest api 서버입니다.
요청: GET /api/hello, 응답: {“hello”:”world!”}
요청: GET /api/world, 응답:{“world”:”hello!”}

$ git clone https://github.com/GeunhoKim/express-influx.git
$ cd express-influx/service-a
$ npm install
$ pm2 start app.js

*로컬에 git, nodejs, pm2 가 모두 설치되어 있어야 합니다.
**git은 brew install git 로 설치합니다.
*** pm2는 npm install pm2 -g 로 설치합니다.

$ curl localhost:8080/api/hello
$ curl localhost:8080/api/world

{“hello”:”world!”}

{“world”:”hello!”}
# 몇 차례 더 요청을 날려서 데이터를 쌓아줍니다.

serviceA 는 요청시 요청수와 지연 시간을 influxdb로 기록합니다. 데이터가 잘 쌓여있는지 확인합니다.

$ influx
> use service
> select * from serviceA limit 5
name: serviceA
time host latency num_requests url
—- — —— ———— —
1483540807908284168 {hostname} 0.349809 1 /api/world
1483540807107210987 {hostname} 0.18984499999999999 1 /api/world
1483540765844455491 {hostname} 0.199207 1 /api/hello
1483540765697138565 {hostname} 0.22938699999999998 1 /api/hello
1483540765531034494 {hostname} 0.223208 1 /api/hello

서비스의 구성이 거의 완료 되었습니다. 이제 관제 대시보드 구성을 쉽게 할 수 있는 grafana 구성 방법을 살펴 보겠습니다.

Grafana

Grafanaelastic 사의 ELK (Elasticsearch, Logstash, Kibana) 제품 중 elasticsearch에 indexing된 데이터의 시각화와 대시보드 구성을 위한 툴인 kibana에 영감을 받아 시작된 open source 프로젝트 입니다. kibana를 써봤다면 어렵지 않게 grafana도 사용할 수 있습니다. 데이터 질의를 통한 검색 기능을 제외하면 시각화와 대시보드 기능은 기능이 훨씬 강력합니다. 프론트엔드에는 nodejs, 백엔드에는 golang을 사용하고 있습니다.

elasticsearch*를 포함하여, graphite, openTSDB, influxdb 등 다양한 시계열 데이터베이스를 데이터 소스로 사용하여 하나의 그래프 박스 안에 여러 데이터베이스를 질의 하여 구성할 수 있습니다. 특히 최근 정식 릴리즈된 4.0 버전부터 알림 (alerting) 기능이 추가되어 데이터의 시각화 뿐만 아니라 관제용 대시보드로서 모든 기능을 갖추게 되었습니다. (드디어 알림 기능을 위해 php로 된 nagios나 icinga2 의 설정 파일을 번거롭게 수정하지 않아도 됩니다)


*elasticsearch의 경우 아직 4.0 버전에서는 5.x 버전을 지원하지 않습니다. 릴리즈 전인 latest 베타 버전에서는 해당 PR이 머지 되었으니 최신 베타 버전을 사용하면 가능합니다. 4.1 정식 버전에 포함될 예정이라고 합니다.

$ brew update
$ brew install grafana
==> Downloading https://homebrew.bintray.com/bottles/grafana-4.0.1.sierra.bottle.tar.

To have launchd start grafana now and restart at login:
  brew services start grafana

Or, if you don’t want/need a background service you can just run:
  grafana-server –config=/usr/local/etc/grafana/grafana.ini –homepath /usr/local/share/grafana cfg:default.paths.logs=/usr/local/var/log/grafana cfg:default.paths.data=/usr/local/var/lib/grafana cfg:default.paths.plugins=/usr/local/var/lib/grafana/plugins

다른 서비스들과 마찬가지로 homebrew를 이용하면 최신 버전의 정식 릴리즈를 쉽게 설치할 수 있습니다. 또한 설정 파일의 경로는 /usr/local/etc/grafana/grafana.ini 임을 알 수 있습니다. grafana의 경우 앞서 80 포트로 endpoint를 구성하려 했으므로 해당 파일을 열어서 수정합니다.

/usr/local/etc/grafana/grafana.ini
...
[server]
...
http_port = 80
root_url = http://localhost:80
...

$ grafana-cli plugins install grafana-piechart-panel
// pie chart 플러그인을 설치

각 항목 앞의 세미콜론 (;) 은 주석 처리된 것을 뜻하므로 이를 제거해야 설정이 적용됨을 주의 합니다. 이제 서비스를 구동 합니다.

$ sudo brew services start grafana
// default log 파일 경로 등의 권한 이슈가 있는 경우 sudo 권한으로 실행합니다.

이제 브라우저에서 http://localhost 를 주소창에 입력하면 grafana에 접속할 수 있습니다.

  • default 계정 및 패스워드, admin / admin 입력 후 로그인
  • 좌측 상단의 아이콘을 클릭 > Data Sources 클릭 > 우측 상단의 Add data source 를 클릭
  • Name에 data source를 구분할 이름을 입력. 여기서는 resource로 정함. 우측에 default 체크박스 클릭
  • Type에 InfluxDB 선택
  • Url에 http://localhost:8086 입력
  • Database에 telegraf 입력 (telegraf.conf 에 설정된 telegraf 가 데이터 적재시 사용하는 database 임에 주의)
  • 그 외 설정은 그대로 둔 후 Add 버튼 클릭
  • 같은 방식으로 Database에 service  입력 후 Add 버튼 클릭 (나머지 설정은 동일)

여기까지 했다면 앞서 적재한 telegraf, service influxdb의 data source 생성이 끝난 것입니다. http://localhost/datasources 접속시 아래와 같이 두 개의 data source가 보이면 됩니다.

screen-shot-2017-01-09-at-22-08-26

이제 대시보드를 구성할 차례입니다. 여기서부터는 일일히 설명하기 어려운 부분이 있기 때문에 미리 구성한 대시보드를 import 하여 살펴보시기 바랍니다.

  • 좌측 상단 아이콘 클릭 > Dashboards 클릭 > import 클릭
  • Or paste JSON 텍스트 박스에 링크의 내용을 그대로 붙여 넣고 입력 (최 하단에 view raw 버튼을 클릭해서 새 탭에서 띄우면 전체 선택하기 쉽습니다)
  • telegraf/service 는 위에서 생성한 telegraf/service 입력

grafana의 대시보드 구성의 상세 내용과 알림을 구성하는 방법, 그리고 알림 webhook을 통해 자동화된 동작을 수행하도록 하는 방법에 대해서는 다음 포스팅에서 상세하게 다루도록 하겠습니다.

 

 

출처 : https://geunhokhim.wordpress.com/2017/01/02/grafana-influxdb-telegraf-monitoring-server-alerting-automation/