이 포스트는, 라즈베리파이로 시스템 모니터링 대시보드를 만들어 보는 튜토리얼입니다.

이 포스트에서 사용할 도구 및 환경

grafana 와 graphite에 대한 이해는 아래 블로그를 참고하였습니다.

그라파이트(Grahpite) + 그라파나(Grafana) 모니터링 시스템 구축 with Docker

전체적인 구조는 다음과 같습니다.

collecd로 시스템 데이터 수집 ▶ graphite-carbon으로 전송 ▶ graphite-web을 통해 grafana로 전송 ▶ apache2로 웹 서버 구동

1. graphite, python-Tools, apache2, postgresql 설치

sudo apt update
sudo apt-get install build-essential graphite-web graphite-carbon python-dev apache2 libapache2-mod-wsgi libpq-dev python-psycopg2 postgresql

2. postgreSQL

graphitegrafana의 웹에서 사용 할 user 등의 데이터를 저장하는 데이터베이스로 postgreSQL을 사용하겠습니다.

a) postgres cli 들어가기

sudo su - postgres

b) grafana 및 graphite에서 사용할 DB 사용자 만들기

여기서는 raspberrypi 라는 사용자를 만들고, 비밀번호를 SuperSecret으로 하겠습니다.

createuser raspberrypi --pwprompt

c) grafana 및 graphite에서 사용할 DB 만들기

grafanagraphite 라는 DB를 만들고, 방금 만든 사용자 raspberrypi를 각 DB의 관리자로 하겠습니다.

createdb -O raspberrypi graphite
createdb -O raspberrypi grafana

d) 원래 계정으로 돌아옵니다.

exit

3. graphite

a) storage-schemas.conf 설정

whisper의 데이터 보존 기간을 설정합니다. storage-schemas.conf는 특정 패턴의 네임스페이스 데이터의 보존 기간을 정의합니다. 여기서는 [collectd]라는 설정을 만들어, collectd로 시작하는 데이터의 보존 기간을 다음과 같이 설정 하겠습니다.

sudo nano /etc/carbon/storage-schemas.conf
[carbon]
pattern = ^carbon\.
retentions = 60:90d

[collectd]
pattern = ^collectd\.
retentions = 5s:1w,1m:7d,10m:1y

[default_1min_for_1day]
pattern = .*
retentions = 60s:1d

저장 후 종료합니다.

b) storage-aggregation.conf 설정

여기서는 graphite 설치 시 예제로 설치 되는 설정 파일을 그대로 사용하겠습니다.

sudo cp /usr/share/doc/graphite-carbon/examples/storage-aggregation.conf.example /etc/carbon/storage-aggregation.conf

c) carbon-cache를 유효화

sudo nano /etc/default/graphite-carbon

false 를 true 로 바꿔줍니다.

CARBON_CACHE_ENABLED=true

d) 부팅 시 carbon-cache 시작 등록

sudo systemctl enable carbon-cache

f) carbon-cache 재시작

sudo systemctl restart carbon-cache

g) local_settings.py 설정

postgreSQL 및 기타 설정을 합니다.

sudo nano /etc/graphite/local_settings.py

먼저, 중간의 DATABASE 설정을 아래와 같이 바꿔줍니다.

DATABASES = {
'default': {
    'NAME': 'graphite',
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'USER': 'raspberrypi',
    'PASSWORD': 'SuperSecret',
    'HOST': '127.0.0.1',
    'PORT': ''
    }
}

그리고 파일의 가장 아래에 다음의 설정을 추가합니다.

USE_REMOTE_USER_AUTHENTICATION = True
TIME_ZONE = 'Asia/Seoul'
SECRET_KEY = 'SaltHashingUniqueKey-LongLongSecret'

SECRET_KEY는 비밀번호 해싱을 위한 솔트키 이므로, 길고 복잡한 값을 넣어 주시기 바랍니다. (예제랑 똑같이 하지 마시길 바랍니다.)

h) 데이터베이스를 시작/연결 합니다.

sudo graphite-manage syncdb

중간에 Django's auth system 이용을 위한 Super User를 만들겠습니까? 라는 질문을 하는데, yes를 입력하여 사용자(관리자)를 만드시길 바랍니다.

3. apache2

a) 먼저, graphite-web을 이용하기 위해, 기본 설정을 복사합니다.

sudo cp /usr/share/graphite-web/apache2-graphite.conf /etc/apache2/sites-available

b) 설정 파일을 열어 80번 포트를 8080번 포트로 바꾸어 줍니다.

sudo nano /etc/apache2/sites-available/apache2-graphite.conf
<VirtualHost *:8080>

c) apache2가 8080 포트를 열도록 설정합니다.

sudo nano /etc/apache2/ports.conf
Listen 80
Listen 8080

d) apache2의 기본 사이트를 무효화 합니다.

sudo a2dissite 000-default

e) graphite 사이트를 유효화 합니다.

sudo a2ensite apache2-graphite

f) apache2를 재시작 합니다.

sudo systemctl restart apache2

4. graphite 웹 접속 해 보기

인터넷 브라우저 창에 라즈베리파이3의 아이피주소:8080을 입력하여 접속해 봅니다.

접속이 되었다면, 왼쪽 트리 메뉴를 열어 최하위 항목들을 클릭해봅니다.

아직 collectd를 통한 데이터 수집 설정을 하지 않았지만, graphite는 자체적으로 몇 개의 샘플 데이터를 수집하고 있는 것을 확인할 수 있습니다.

graphite-web이 작동하는 것을 확인 하였으므로, 저는 apache2의 port 설정(/etc/apache2/ports.conf)을 Listen 127.0.0.1:8080 으로 바꾸겠습니다.

이 후, 같은 호스트에 설치 할 grafana는 graphite-web의 8080 포트로 데이터를 가져 오기 때문에, 127.0.0.1 이외의 호스트 에서는 접속을 못하게 하기 위함입니다.

/etc/apache2/sites-available/apache2-graphite.conf 수정 후,
sudo systemctl restart apache2

5. grafana

다음은 grafana를 설치하여 graphite에서 데이터를 가져와 보겠습니다.

a) grafana 설치

Raspbian의 공식 repository에는 graphite가 없기 때문에, raspberry pi 2 와 pi 3 용으로 빌드된 deb 패키지를 이용하겠습니다.

참고: https://github.com/fg2it/grafana-on-raspberry

sudo apt-get install libfontconfig
curl -L https://github.com/fg2it/grafana-on-raspberry/releases/download/v4.0.1/grafana_4.0.1-1480722482_armhf.deb -o /tmp/grafana_4.0.1-1480722482_armhf.deb
sudo dpkg -i /tmp/grafana_4.0.1-1480722482_armhf.deb

b) grafana 설정

grafana의 설정 파일을 열어줍니다.

sudo nano /etc/grafana/grafana.ini

먼저, [server] 단락을 아래와 같이 수정해 줍니다. 이후에 grafana는 아파치를 통해서 웹 서버를 구동 할 예정입니다.

[server]
protocol = http
http_addr = 127.0.0.1
http_port = 3000
root_url = %(protocol)s://%(domain)s/

다음은 아래의 [database] 단락을 수정합니다.

앞서 postgreSQL에서 설정한 내용을 입력합니다.

[database]
type = postgres
host = 127.0.0.1:5432
name = grafana
user = raspberrypi
password = SuperSecret

다음은 [security] 단락입니다. grafana의 관리자 계정은 admin/admin으로 설정 되어 있습니다. 비밀번호는 첫 접속 후 변경하도록 하겠습니다.

[security]
admin_user = admin
admin_password = admin
secret_key = somelongrandomstringkey (패스워드 해싱을 위한 키 이므로, 길고 복잡한 키를 입력하세요)

c) apache2 설정

아파치의 프록시 모듈을 유효화 합니다.

sudo a2enmod proxy proxy_http xml2enc

다음, grafana를 위한 apache2 가상 호스트 설정을 만들어 줍니다.

sudo nano /etc/apache2/sites-available/apache2-grafana.conf
<VirtualHost *:80>
 	ProxyPreserveHost On
 	ProxyPass / http://127.0.0.1:3000/
 	ProxyPassReverse / http://127.0.0.1:3000/
 	ServerName 172.16.0.13 (라즈베리파이 ip 주소, 혹은 도메인)
</VirtualHost>

설정한 가상 호스트를 유효화 합니다.

sudo a2ensite apache2-grafana

d) 부팅 시 grafana-server 시작 등록

sudo systemctl enable grafana-server

e) grafana, apache2 재시작

sudo systemctl restart grafana-server apache2

6. grafana 웹

웹 브라우저의 주소창에, 위의 grafana-apache에 설정 한 라즈베리파이의 주소를 입력해 봅니다.

접속이 잘 되는군요!!

admin/admin으로 로그인 후 비밀번호를 변경합니다.

비밀번호를 변경 하였으면, grafana에서 이용 할 데이터 소스를 추가해 봅니다.

위에서 설정한 graphite를 데이터 소스로 추가합니다.

추가가 잘 되셨나요?

이제 실제 대시보드를 한 번 가져 와 보겠습니다.

아래의 사이트에 접속해 보시면, 여러 사람들이 만든 대시보드를 공유하고 있습니다.

https://grafana.com/dashboards

우리는 아직 수집중인 데이터가 없는데요, 앞에서 graphite가 자체적으로 몇 개의 샘플 데이터를 수집하고 있다는 것을 언급하였습니다.

그래서, graphite-carbon의 샘플 데이터를 이용한 대시보드를 사용하겠습니다.

위의 grafana 사이트에서 947번 대시보드로 결정하였습니다.

다음 이미지 순서대로 대시보드를 가져옵니다.

뭔가 그래프가 나타났습니다!! graphite-carbon이 사용 중인 시스템 리소스 등의 메트릭 입니다.

이렇게 grafanagraphite가 잘 작동 하는 것을 확인하였습니다.

2부에서는 collectd를 이용하여 라즈베리파이의 시스템 메트릭을 수집, graphite로 전송하여 grafana 대시보드에서 표시하는 방법을 알아보겠습니다.