콘텐츠 대표 이미지 - 내 손안의 데이터 센터: 라즈베리 파이 4와 Grafana로 시스템 모니터링 대시보드 구축하기 🚀

내 손안의 데이터 센터: 라즈베리 파이 4와 Grafana로 시스템 모니터링 대시보드 구축하기 🚀

작고 소중한 라즈베리 파이, 이제 투명하게 속속들이 들여다볼 시간!
개발자 친구가 옆에서 알려주듯 쉽고 재미있게 따라 해 봐요!

우리, 지금 뭘 만들려는 걸까? (feat. 빅 픽처)

안녕! 👋 오늘 우리는 아주 작지만 강력한 컴퓨터, 라즈베리 파이 4의 심장 박동을 직접 눈으로 확인하는 엄청난 프로젝트를 시작할 거야. "내 라즈베리 파이, 지금 얼마나 열심히 일하고 있지?", "메모리는 충분한가?", "온도는 괜찮을까?" 이런 궁금증, 한 번쯤 가져본 적 있지 않아? 이제 더 이상 `top`이나 `htop` 같은 텍스트 기반 명령어에 의존하지 않아도 돼. 우리는 이걸 아주 멋지고, 직관적이고, 심지어 예쁘기까지 한 그래프 대시보드로 만들어 볼 거거든!

이 프로젝트의 최종 목표는 바로 이거야: 라즈베리 파이의 CPU 사용량, 메모리 점유율, 디스크 공간, 네트워크 트래픽, 시스템 온도 같은 핵심 정보들을 실시간으로 수집해서, Grafana(그라파나)라는 끝내주는 툴로 시각화하는 것! 마치 영화에 나오는 최첨단 관제 센터처럼 말이지. 🤩

이걸 왜 하냐고? 이유는 여러 가지야.

1. 내 소중한 파이 지키기: 라즈베리 파이는 팬이 없는 경우가 많아서 발열에 취약할 수 있어. 온도를 실시간으로 모니터링하면 과열로 인한 성능 저하나 고장을 미리 방지할 수 있지.

2. 성능 병목 현상 찾기: 만약 네가 라즈베리 파이로 웹 서버나 NAS, 혹은 다른 서비스를 운영 중이라면, 어떤 프로세스가 CPU나 메모리를 많이 잡아먹는지 한눈에 파악하고 최적화할 수 있어.

3. 그냥... 멋있잖아!: 솔직히 말해서, 내 서버의 상태가 실시간 그래프로 움직이는 걸 보고 있으면 그냥 기분이 좋아. 내가 만든 시스템이 살아 숨 쉬는 걸 느끼는 그 기분, 개발자라면 공감할걸? 😉

4. 기술 스택 경험치 쌓기: 오늘 우리가 사용할 InfluxDB, Telegraf, Grafana는 'TIG 스택'이라고 불리며, 실제 IT 현업에서도 시계열 데이터 처리 및 모니터링 시스템 구축에 널리 사용되는 기술이야. 이 프로젝트를 완성하고 나면, 너의 이력서에 추가할 수 있는 강력한 무기가 하나 생기는 셈이지. 이런 실전 경험은 재능넷 같은 플랫폼에서 너의 가치를 더욱 높여줄 거야.

잠깐, '시계열 데이터'가 뭐야? 어렵게 생각할 것 없어! '시간의 흐름에 따라 기록된 데이터'라는 뜻이야. 예를 들어, '오후 3시 1분 CPU 사용량 15%', '오후 3시 2분 CPU 사용량 18%'처럼 시간 정보가 붙어있는 데이터들을 말해. 주식 차트, 날씨 변화 그래프, 그리고 우리가 만들 시스템 모니터링 데이터가 모두 여기에 해당돼.

자, 이제 우리가 만들 시스템의 전체적인 그림을 한번 그려볼까? 너무 기술적인 용어에 겁먹지 마. 최대한 쉽게 풀어서 설명해 줄게.

라즈베리 파이 모니터링 시스템 아키텍처 Raspberry Pi 4 모니터링 대상 Telegraf 데이터 수집기 (리포터) 시스템 정보 전송 (CPU, MEM, DISK...) InfluxDB 시계열 데이터베이스 (노트) 데이터 조회 요청 Grafana 시각화 대시보드 (방송국) You! (사용자) 웹 브라우저로 접속

이 그림이 바로 우리가 만들 시스템의 심플한 설계도야. 각 역할은 이래.

1. Telegraf (텔레그래프, 데이터 수집기): 라즈베리 파이 안에서 열심히 돌아가는 '현장 리포터'라고 생각하면 돼. 주기적으로 "지금 CPU 10% 쓰고 있고, 메모리는 500MB 남았고, 온도는 45도야!" 같은 정보를 모아서 어딘가로 계속 보고해.

2. InfluxDB (인플럭스DB, 데이터 저장소): Telegraf가 보고한 데이터를 차곡차곡 기록하는 '꼼꼼한 서기'의 노트야. 그냥 저장하는 게 아니라, '언제' 그 데이터가 기록되었는지 시간 정보와 함께 저장해. 그래서 '시계열 데이터베이스'라고 불리지.

3. Grafana (그라파나, 데이터 시각화 툴): InfluxDB에 기록된 데이터를 가져다가 아주 예쁜 그래프와 차트로 그려주는 '방송국 PD'야. 우리는 이 Grafana가 만들어준 방송(웹 페이지)을 보면서 라즈베리 파이의 상태를 실시간으로 확인하게 될 거야.

이 세 친구가 힘을 합쳐 환상의 팀워크를 보여줄 거야. 우리는 감독이 되어서 이 친구들을 하나씩 설치하고, 서로 잘 소통할 수 있도록 설정해 주기만 하면 돼. 어때, 벌써부터 막 가슴이 뛰지 않아? 그럼 이제 본격적으로 여정을 떠나보자! 🚀

출발 전 준비물 체크! (feat. 필수 아이템)

요리를 시작하기 전에 재료부터 챙겨야지! 우리의 멋진 대시보드 프로젝트를 위해 필요한 준비물들을 확인해 보자. 대부분 이미 가지고 있겠지만, 혹시 모르니 꼼꼼하게 체크해 봐.

[하드웨어]
✔️ 라즈베리 파이 4: 주인공이지! 메모리는 2GB 모델 이상을 추천해. Grafana와 InfluxDB가 생각보다 메모리를 좀 먹거든. 물론 1GB 모델도 가능은 하지만, 조금 버벅일 수 있다는 점은 감안해야 해.
✔️ MicroSD 카드: 최소 16GB, 클래스 10 이상을 추천해. 32GB 정도면 아주 넉넉하게 쓸 수 있어. 운영체제도 설치하고, 우리가 모니터링할 데이터도 저장해야 하니까!
✔️ 전원 어댑터: 라즈베리 파이 4는 최소 5V/3A를 권장해. 안정적인 전원 공급은 시스템 안정성의 기본 중의 기본이야. 전원이 불안정하면 원인 모를 오류가 생길 수 있으니 꼭 정품이나 검증된 어댑터를 사용하자.
✔️ 인터넷 연결: 유선 랜(Ethernet) 연결을 강력 추천해. 안정적인 데이터 수집과 전송을 위해 와이파이보다는 유선이 훨씬 좋아.
✔️ (선택) 케이스 및 방열판/쿨링팬: 24시간 켜놓을 서버로 활용할 거라면 발열 관리는 필수! 간단한 방열판이라도 붙여주면 큰 도움이 되고, 작은 쿨링팬이 달린 케이스를 사용하면 금상첨화야.

[소프트웨어]
✔️ Raspberry Pi OS (64-bit): 최신 버전의 라즈베리 파이 OS를 설치해 줘. 예전에는 '라즈비안'이라고 불렸지. 우리는 서버로 사용할 거니까 GUI가 없는 Lite 버전을 설치해도 충분해. 그 편이 리소스도 아끼고 좋지. 특히, 우리가 사용할 InfluxDB v2 이상은 64비트 환경을 권장하므로, 꼭 64비트 버전으로 설치하는 걸 잊지 마! Raspberry Pi Imager를 사용하면 아주 쉽게 설치할 수 있어.
✔️ SSH 클라이언트: 라즈베리 파이에 직접 키보드와 모니터를 연결해서 작업해도 되지만, 보통은 원격으로 접속해서 작업하는 게 훨씬 편해. 윈도우 사용자라면 `PowerShell`이나 `PuTTY`를, macOS나 리눅스 사용자라면 기본 `터미널`을 사용하면 돼.

💡 꿀팁: 라즈베리 파이 OS 설치 시 SSH 활성화하기! Raspberry Pi Imager의 고급 설정(톱니바퀴 아이콘)에 들어가면 OS를 굽기 전에 호스트 이름 설정, SSH 활성화, 사용자 계정 설정, 와이파이 설정 등을 미리 해둘 수 있어. 여기서 SSH를 활성화해두면, OS 설치 후 모니터나 키보드 연결 없이 바로 원격 접속이 가능해서 정말 편리해!

자, 준비물 체크가 끝났다면 이제 라즈베리 파이의 전원을 켜고, 터미널을 열어 원격 접속을 해보자. 네 PC와 라즈베리 파이가 같은 네트워크에 연결되어 있어야 해.

터미널에 아래처럼 입력해서 접속! (IP 주소는 너의 라즈베리 파이 IP로 바꿔야 해)

ssh [사용자이름]@[라즈베리파이_IP주소]

예를 들어, 사용자 이름이 `pi`이고 IP 주소가 `192.168.0.10`이라면 `ssh pi@192.168.0.10`이 되겠지?

접속에 성공했다면, 가장 먼저 할 일은 시스템을 최신 상태로 업데이트하고 업그레이드하는 거야. 이건 새로운 프로그램을 설치하기 전에 항상 해주는 게 좋은 습관이야. 일종의 준비 운동 같은 거지.

시스템 업데이트 및 업그레이드

sudo apt update
sudo apt full-upgrade -y

첫 번째 `sudo apt update`는 설치 가능한 패키지 목록을 최신화하는 명령어고, 두 번째 `sudo apt full-upgrade`는 실제로 설치된 패키지들을 최신 버전으로 업그레이드하는 명령어야. `-y` 옵션은 중간에 물어보는 질문에 모두 'Yes'라고 자동으로 대답해 주는 편리한 옵션이지.

업그레이드가 진행되는 동안 커피 한 잔의 여유를 즐겨도 좋아. ☕️ 모든 준비가 끝났어. 이제 진짜로 우리의 TIG 스택 용사들을 하나씩 소환해 볼 시간이야! 가장 먼저 데이터를 저장할 창고, InfluxDB부터 지어보자.

1단계: 데이터의 집, InfluxDB 설치하기

첫 번째 타자는 InfluxDB야. Telegraf가 열심히 물어온 데이터를 안전하게 보관해 줄 시계열 데이터베이스(Time Series Database, TSDB)지. 일반적인 관계형 데이터베이스(MySQL, PostgreSQL 등)도 데이터를 저장하지만, InfluxDB는 '시간'에 따른 데이터 변화를 저장하고 조회하는 데 특화되어 있어. 그래서 모니터링 데이터처럼 초 단위로 쏟아지는 정보를 처리하는 데 아주 효율적이야.

우리는 InfluxDB 2.x 버전을 설치할 거야. 1.x 버전에 비해 데이터 처리 언어(Flux), 사용자 인터페이스, 보안 등 많은 부분이 개선되었거든. 자, 이제 차근차근 따라 해 보자.

1. InfluxDB 저장소 키 추가하기

우리가 `apt`라는 패키지 관리자로 InfluxDB를 설치하려면, "이 InfluxDB라는 프로그램은 믿을 수 있는 곳에서 만든 거니까 설치해도 괜찮아"라고 시스템에 알려줘야 해. 그걸 '저장소 키(Repository Key)'를 추가하는 걸로 인증하는 거야.

InfluxDB GPG 키 다운로드 및 추가

wget -q https://repos.influxdata.com/influxdata-archive_compat.key
echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null

명령어가 좀 길고 복잡해 보이지? 걱정 마. 한 줄씩 복사해서 붙여넣으면 돼. 간단히 설명하면, InfluxDB 서버에서 인증키 파일을 다운로드하고, 그 파일이 변조되지 않았는지 체크한 다음(sha256sum), 시스템이 신뢰하는 키 목록에 추가하는 과정이야. 보안을 위한 절차라고 생각하면 돼.

2. InfluxDB 저장소 목록 추가하기

이제 `apt`가 InfluxDB 패키지를 어디서 다운로드해야 하는지 알려줄 차례야. 아래 명령어로 InfluxDB 패키지 서버 주소를 우리 시스템의 소스 리스트에 추가해 주자.

InfluxDB 저장소 정보 추가

echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdb.list

이 명령어를 실행하면 `/etc/apt/sources.list.d/` 디렉터리에 `influxdb.list`라는 파일이 생기고, 그 안에 InfluxDB 저장소 주소가 기록될 거야.

3. InfluxDB 설치하기

자, 이제 모든 밑 준비가 끝났어. 다시 한번 패키지 목록을 업데이트해서 방금 추가한 InfluxDB 저장소 정보를 반영하고, 드디어 InfluxDB를 설치하자!

패키지 목록 업데이트 및 InfluxDB 설치

sudo apt update
sudo apt install influxdb2 -y

설치가 완료되면 InfluxDB 서비스가 자동으로 시작되고, 시스템이 부팅될 때마다 알아서 실행되도록 설정될 거야. 혹시 모르니 잘 실행되고 있는지 상태를 한번 확인해 볼까?

sudo systemctl status influxdb

초록색으로 `active (running)`이라는 메시지가 보이면 성공적으로 설치되고 실행 중인 거야! 🎉 (상태 확인 화면에서 빠져나오려면 `q`를 누르면 돼.)

⚠️ 잠깐! 만약 서비스가 실행되지 않았다면? `inactive (dead)`라고 표시된다면 당황하지 말고 아래 명령어로 서비스를 직접 시작하고, 부팅 시 자동 실행되도록 설정해 주자.
`sudo systemctl start influxdb`
`sudo systemctl enable influxdb`

4. InfluxDB 초기 설정하기

InfluxDB 2.x 버전부터는 웹 브라우저를 통해 아주 편리하게 초기 설정을 진행할 수 있어. 네 PC의 웹 브라우저를 열고 주소창에 아래와 같이 입력해 봐.

http://[라즈베리파이_IP주소]:8086

예를 들어, 라즈베리 파이 IP가 `192.168.0.10`이라면 `http://192.168.0.10:8086`으로 접속하면 돼. `8086`은 InfluxDB가 사용하는 기본 포트 번호야.

접속하면 'Welcome to InfluxDB'라는 화면이 우리를 반겨줄 거야. [GET STARTED] 버튼을 누르고, 아래 정보를 입력해서 초기 설정을 완료하자.

- Username: 관리자 계정으로 사용할 사용자 이름을 입력해. (예: `admin`)
- Password: 관리자 계정의 비밀번호를 입력해. 잊어버리지 않게 잘 기억해 둬! 🔑
- Initial Organization Name: 데이터를 관리할 조직(그룹)의 이름을 정하는 거야. 개인 프로젝트니까 `my-org`나 너의 닉네임처럼 편한 이름으로 지으면 돼.
- Initial Bucket Name: 버킷(Bucket)은 데이터를 담는 최상위 컨테이너, 즉 '데이터 통'이라고 생각하면 쉬워. 우리는 Telegraf가 수집한 데이터를 담을 거니까 `telegraf`라고 짓는 게 직관적이고 좋겠지?

모두 입력하고 [Continue] 버튼을 누르면 설정이 완료되고, InfluxDB의 멋진 대시보드 화면으로 이동하게 될 거야. 여기서 잠깐! 앞으로 Grafana나 Telegraf에서 InfluxDB에 접속하려면 'API 토큰'이라는 인증키가 필요해. 방금 설정이 끝나면서 자동으로 생성된 토큰이 화면에 보일 수도 있고, 아니라면 왼쪽 메뉴에서 [Load Data] > [API Tokens] 탭으로 이동해서 방금 만든 관리자 계정(예: `admin`)의 토큰을 복사해두자. `admin's Token` 같은 이름으로 되어 있을 거야. 이 토큰은 아주 중요하니까 메모장 같은 곳에 안전하게 보관해 둬!

휴, 이걸로 데이터베이스 준비는 완벽하게 끝났어. 이제 현장에서 발로 뛸 리포터, Telegraf를 영입할 차례야!

2단계: 열혈 리포터, Telegraf 설치 및 설정하기

이제 우리 시스템의 '리포터' 역할을 할 Telegraf를 설치할 시간이야. Telegraf는 플러그인 기반의 아주 유연한 데이터 수집 에이전트야. 이게 무슨 말이냐면, 레고 블록처럼 필요한 기능(플러그인)만 골라서 조립하면 뭐든지 수집할 수 있다는 뜻이지. CPU 사용량, 메모리 같은 기본적인 시스템 정보는 물론이고, 웹 서버의 응답 시간, 데이터베이스의 쿼리 수, 심지어는 특정 IoT 센서의 값까지 수집할 수 있는 만능 재주꾼이야.

우리는 라즈베리 파이의 시스템 상태를 모니터링할 거니까, 그에 맞는 기본 플러그인들을 활성화해서 사용해 볼 거야. 설치 과정은 InfluxDB와 거의 비슷하니 겁먹지 말고 따라와!

1. Telegraf 설치하기

InfluxDB를 만든 InfluxData사에서 Telegraf도 함께 만들었기 때문에, 우리는 이미 InfluxDB 저장소를 추가하면서 Telegraf를 설치할 준비를 마친 상태야. 정말 편리하지? 바로 `apt` 명령어로 설치를 진행하자.

Telegraf 설치

sudo apt install telegraf -y

설치가 끝나면 Telegraf 서비스도 InfluxDB처럼 자동으로 시작되고 부팅 시 자동 실행되도록 설정될 거야. 역시나 잘 돌아가고 있는지 상태를 한번 확인해 보자.

sudo systemctl status telegraf

마찬가지로 초록색 `active (running)`이 보이면 성공! 👍

2. Telegraf 설정 파일 수정하기

Telegraf의 핵심은 바로 설정 파일이야. 이 파일 안에 "어떤 데이터를 수집해서(Input Plugins), 어디로 보낼지(Output Plugins)"를 모두 정의하게 돼. 설정 파일은 `/etc/telegraf/telegraf.conf` 경로에 있어. 이 파일을 수정해서 우리가 설치한 InfluxDB로 데이터를 보내도록 설정해 줘야 해.

수정하기 전에, 만약을 대비해서 원본 설정 파일을 백업해두는 습관을 들이면 아주 좋아.

sudo cp /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.bak

이제 `nano` 편집기를 사용해서 설정 파일을 열어보자. `nano`는 사용법이 간단해서 초보자에게 좋은 터미널용 텍스트 편집기야.

sudo nano /etc/telegraf/telegraf.conf

파일을 열면 수많은 설정 항목들이 주석 처리(`#`)된 채로 나타나서 좀 당황스러울 수 있어. 하지만 걱정 마, 우리가 수정할 부분은 딱 정해져 있으니까. 키보드 방향키로 스크롤을 내리거나, `Ctrl + W` (찾기) 기능으로 아래 항목들을 찾아서 수정해 주자.

[outputs.influxdb_v2] 섹션 찾아서 수정하기

먼저 Telegraf가 수집한 데이터를 어디로 보낼지 지정해 줘야 해. `Ctrl + W`를 누르고 `outputs.influxdb_v2`를 검색해 봐. 그럼 아래와 비슷한 부분을 찾을 수 있을 거야.

# # A plugin that can write metrics to InfluxDB v2
# [[outputs.influxdb_v2]]
#   ## The URLs of the InfluxDB cluster nodes.
#   ##
#   ## Multiple URLs can be specified for a single cluster, only ONE of the
#   ## urls will be written to each interval.
#   ##   ex: urls = ["http://127.0.0.1:8086"]
#   urls = ["http://127.0.0.1:8086"]
#
#   ## Token for authentication.
#   token = "$INFLUX_TOKEN"
#
#   ## Organization is the name of the organization you wish to write to.
#   organization = ""
#
#   ## Destination bucket to write into.
#   bucket = ""

여기서 주석(`#`)을 제거하고 우리가 InfluxDB 초기 설정 때 만들었던 정보를 입력해야 해. 아래처럼 바꿔주자.

# A plugin that can write metrics to InfluxDB v2
[[outputs.influxdb_v2]]
  ## The URLs of the InfluxDB cluster nodes.
  urls = ["http://127.0.0.1:8086"]

  ## Token for authentication.
  # 이 부분에 아까 복사해 둔 InfluxDB API 토큰을 붙여넣으세요!
  token = "여기에_너의_API_토큰을_붙여넣기"

  ## Organization is the name of the organization you wish to write to.
  # InfluxDB 초기 설정 시 입력했던 조직 이름
  organization = "my-org"

  ## Destination bucket to write into.
  # InfluxDB 초기 설정 시 입력했던 버킷 이름
  bucket = "telegraf"

- `urls`: InfluxDB가 설치된 주소야. Telegraf와 InfluxDB가 같은 라즈베리 파이 안에 있으니 `http://127.0.0.1:8086` (localhost) 그대로 두면 돼.
- `token`: 가장 중요한 부분! 아까 InfluxDB 설정 후 메모장에 복사해 뒀던 그 긴 API 토큰을 쌍따옴표 안에 그대로 붙여넣어 줘.
- `organization`: InfluxDB 설정 때 만들었던 조직 이름 (예: `my-org`)을 입력해.
- `bucket`: 데이터를 저장할 버킷 이름 (예: `telegraf`)을 입력해.

[inputs] 섹션 확인하기

다음은 어떤 데이터를 수집할지 정하는 'Input' 플러그인 부분이야. `telegraf.conf` 파일을 좀 더 위로 올려보면 `[[inputs.cpu]]`, `[[inputs.disk]]`, `[[inputs.mem]]`, `[[inputs.net]]` 같은 부분들이 보일 거야. 기본적으로 이 플러그인들은 대부분 활성화되어 있어서 우리가 특별히 건드릴 건 없어. 하지만 어떤 정보들을 수집하는지 한번 훑어보는 건 좋아.

💡 라즈베리 파이 온도 측정도 추가해 볼까?
라즈베리 파이의 CPU 온도는 아주 중요한 모니터링 지표야. `[[inputs.sensors]]` 플러그인을 사용하면 되는데, 최신 Telegraf 버전에서는 `[[inputs.exec]]` 플러그인을 이용해 직접 명령어를 실행하는 방식이 더 안정적일 수 있어. 설정 파일 맨 아래에 아래 내용을 추가해 봐!

[[inputs.exec]]
  commands = ["/usr/bin/vcgencmd measure_temp"]
  name_override = "cpu_temperature"
  data_format = "grok"
  grok_patterns = ["temp=%{NUMBER:value:float}°C"]

이 설정은 10초마다 `/usr/bin/vcgencmd measure_temp` 명령어를 실행해서 온도를 측정한 다음, 그 결과(예: `temp=45.5'C`)에서 숫자 부분만 `value`라는 이름의 데이터로 추출해서 InfluxDB로 보내라는 의미야. 아주 유용하겠지?

설정 파일 수정이 끝났으면 `Ctrl + X`를 누르고, 저장하겠냐는 물음에 `Y`를 누른 다음, `Enter`를 쳐서 빠져나오자.

3. Telegraf 재시작 및 확인

우리가 수정한 설정 파일을 Telegraf가 읽어 들이도록 서비스를 재시작해 줘야 해.

sudo systemctl restart telegraf

잠시 후, Telegraf가 정상적으로 실행되고 있는지 로그를 확인해서 에러가 없는지 살펴보자. 로그를 실시간으로 보려면 `-f` 옵션을 주면 돼.

sudo journalctl -u telegraf -f

에러 메시지 없이 로그가 쭉 올라가면 성공적으로 InfluxDB와 연결해서 데이터를 보내고 있다는 뜻이야. (로그 확인을 멈추려면 `Ctrl + C`)

진짜로 데이터가 잘 들어가고 있는지 확인하고 싶다면, 다시 InfluxDB 웹 인터페이스(`http://[라즈베리파이_IP주소]:8086`)로 돌아가서 왼쪽 메뉴의 [Explore]를 클릭해 봐. FROM 패널에서 `telegraf` 버킷을 선택하고, `_measurement` 필터에서 `cpu`, `mem` 같은 항목들을 선택하면 그래프에 데이터가 그려지는 걸 볼 수 있을 거야. 데이터가 보인다면, 축하해! 🥳 데이터 수집 및 저장 파이프라인이 완벽하게 구축된 거야!

이제 마지막 단계만 남았어. 이 딱딱한 숫자와 데이터를 아름다운 예술 작품으로 승화시켜 줄 마법사, Grafana를 소환할 시간이야!

3단계: 시각화의 마법사, Grafana 설치하기

드디어 프로젝트의 화룡점정, Grafana를 설치할 차례야! Grafana는 우리가 InfluxDB에 차곡차곡 쌓아온 데이터를 가져다가, 누가 봐도 이해하기 쉬운 멋진 그래프, 게이지, 차트 등으로 변신시켜주는 시각화의 대가야. 복잡한 데이터를 한눈에 파악할 수 있게 해주는 대시보드를 만드는 데 이만한 툴이 없지.

Grafana는 오픈 소스 버전(OSS)과 엔터프라이즈 버전이 있는데, 우리는 당연히 무료인 오픈 소스 버전을 설치할 거야. 개인 프로젝트나 소규모 팀에서는 오픈 소스 버전만으로도 차고 넘치는 기능을 활용할 수 있어.

1. Grafana 저장소 키 및 목록 추가하기

InfluxDB 때와 마찬가지로, `apt`가 Grafana를 인식하고 설치할 수 있도록 GPG 키와 저장소 정보를 추가해 줘야 해. Grafana는 이 과정을 좀 더 편리하게 만들어 뒀어.

Grafana 설치 준비

sudo apt install -y apt-transport-https software-properties-common
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list

첫 번째 명령어는 HTTPS를 통해 패키지를 안전하게 다운로드하는 데 필요한 도구들을 설치하는 거야. 두 번째와 세 번째 명령어는 Grafana의 GPG 키와 저장소 주소를 시스템에 추가하는 과정이지. 이제 익숙하지? 😉

2. Grafana 설치하기

자, 이제 모든 준비는 끝났어. 패키지 목록을 업데이트하고 Grafana를 설치하자!

패키지 목록 업데이트 및 Grafana 설치

sudo apt update
sudo apt install grafana -y

설치가 완료되면 Grafana 서버를 시작하고, 부팅 시 자동 실행되도록 설정해 줘야 해. InfluxDB나 Telegraf와는 다르게 Grafana는 설치 후 자동으로 서비스가 활성화되지 않는 경우가 많거든.

Grafana 서비스 시작 및 활성화

sudo systemctl daemon-reload
sudo systemctl start grafana-server
sudo systemctl enable grafana-server

`daemon-reload`는 새로운 서비스 파일을 시스템이 인식하게 하는 명령어고, 나머지는 이제 익숙한 시작 및 활성화 명령어지. 마지막으로 상태 확인!

sudo systemctl status grafana-server

역시나 초록색 `active (running)`이 우리를 반겨준다면 모든 게 순조롭다는 신호야.

3. Grafana 접속 및 초기 설정

Grafana는 웹 기반 인터페이스를 제공해. 네 PC의 웹 브라우저를 열고 아래 주소로 접속해 보자.

http://[라즈베리파이_IP주소]:3000

Grafana의 기본 포트는 `3000`번이야. 접속하면 로그인 화면이 나타날 거야.

- 초기 사용자 이름: admin
- 초기 비밀번호: admin

로그인하면 보안을 위해 바로 비밀번호를 변경하라는 화면이 나올 거야. 새로운 비밀번호를 설정하고 나면, 드디어 Grafana의 메인 화면이 나타나! 환영해! 🥳

4. 데이터 소스(Data Source) 연결하기

Grafana가 차트를 그리려면 데이터가 어디에 있는지 알려줘야겠지? 우리는 InfluxDB에 데이터를 저장했으니, Grafana에게 "저기 InfluxDB라는 창고에 데이터가 있으니 거기서 가져와!"라고 알려주는 과정이 필요해. 이걸 '데이터 소스 추가'라고 해.

1. Grafana 메인 화면 왼쪽 메뉴에서 톱니바퀴 모양의 [Configuration] 아이콘을 클릭하고, [Data Sources]를 선택해.
2. 파란색 [Add data source] 버튼을 클릭해.
3. 다양한 데이터베이스 목록이 나타나면, 검색창에 `InfluxDB`를 입력하거나 스크롤 해서 찾아서 클릭해.

이제 InfluxDB 연결 정보를 입력하는 화면이 나올 거야. 차근차근 채워보자.

- Name: 데이터 소스의 이름을 정하는 거야. `InfluxDB_RPi4`처럼 알아보기 쉽게 지어주자.
- Query Language: 여기서 `Flux`와 `InfluxQL` 중 하나를 선택할 수 있어. 우리는 InfluxDB 2.x를 사용하고 있으니, 더 강력하고 유연한 Flux를 선택하는 걸 추천해. (물론 InfluxQL도 호환성을 위해 계속 지원되니 익숙하다면 선택해도 괜찮아.)

[HTTP] 섹션
- URL: InfluxDB 서버 주소를 입력해. Grafana와 InfluxDB가 같은 라즈베리 파이에 있으니, `http://localhost:8086`이라고 입력하면 돼.

[Auth] 섹션
- 다른 설정은 건드리지 않아도 돼.

[InfluxDB Details] 섹션
- Organization: InfluxDB 설정 때 만들었던 조직의 Org ID를 입력해야 해. Org ID는 InfluxDB 웹 UI의 왼쪽 메뉴 사용자 아이콘 아래 `About`에서 확인할 수 있어. 또는, 터미널에서 `influx org list` 명령어로도 확인 가능해. 보통은 16진수 형태의 긴 문자열이야.
- Token: 여기에 InfluxDB의 API 토큰을 붙여넣어 줘. Telegraf 설정 때 사용했던 바로 그 토큰이야!
- Default Bucket: 기본으로 사용할 버킷 이름을 입력해. 우리는 `telegraf`라고 만들었지?

⚠️ 잠깐! Org ID를 어디서 찾는지 헷갈린다면? InfluxDB 웹 UI(`http://[IP]:8086`)에 로그인해서, 왼쪽 메뉴 가장 아래에 있는 프로필 아이콘(사람 모양)을 클릭하고 `About`을 누르면 `Organization ID`를 쉽게 복사할 수 있어. 이걸 그대로 Grafana 설정에 붙여넣으면 돼!

모든 정보를 입력했다면, 페이지 맨 아래에 있는 [Save & test] 버튼을 클릭해 봐. "Data source is working"이라는 초록색 알림이 뜨면 성공적으로 연결된 거야! 이제 정말 모든 준비가 끝났어. 재료 손질과 밑 준비가 끝났으니, 이제부터는 신나게 요리할 시간이야. 우리만의 대시보드를 만들어보자!

4단계: 나만의 관제 센터, 대시보드 만들기! 🎨

자, 드디어 이 프로젝트의 가장 재미있는 부분이야! 지금까지 우리가 설치하고 설정한 모든 것들은 바로 이 순간을 위한 빌드업이었어. 이제 Grafana의 하얀 캔버스 위에 우리 라즈베리 파이의 데이터를 멋지게 그려 넣을 거야. 처음에는 조금 복잡해 보일 수 있지만, 하나씩 따라 하다 보면 금방 감을 잡을 수 있을 거야. Let's go!

1. 새로운 대시보드 생성하기

Grafana 메인 화면 왼쪽 메뉴에서 플러스(+) 모양의 [Create] 아이콘을 클릭하고, [Dashboard]를 선택해. 그러면 'New dashboard'라는 이름의 텅 빈 대시보드가 나타날 거야. 여기서 [Add a new panel]을 클릭해서 첫 번째 그래프를 만들어 보자.

2. 첫 번째 패널 만들기: CPU 사용량 그래프

가장 기본적이면서도 중요한 지표, 바로 CPU 사용량부터 시작해 보자. 패널 추가를 누르면 패널 편집 화면으로 이동할 거야. 화면은 크게 상단의 시각화 영역과 하단의 쿼리 편집 영역으로 나뉘어 있어.

[쿼리(Query) 설정]
1. Data source: 우리가 방금 추가한 InfluxDB 데이터 소스(`InfluxDB_RPi4` 같은 이름)가 선택되어 있는지 확인해.
2. 쿼리 편집기: 이제 Grafana가 InfluxDB에게 "CPU 사용량 데이터 좀 줘!"라고 요청할 명령어를 작성해야 해. 우리는 Flux 언어를 사용하기로 했으니, 아래 코드를 쿼리 편집 창에 붙여넣어 봐.

Flux 쿼리 예시: CPU 사용량

from(bucket: "telegraf")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "cpu")
  |> filter(fn: (r) => r["_field"] == "usage_idle")
  |> filter(fn: (r) => r["cpu"] == "cpu-total")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> map(fn: (r) => ({ r with _value: 100.0 - r._value }))
  |> yield(name: "usage_total")

코드가 좀 낯설지? 괜찮아, 하나씩 해석해 줄게.
- `from(bucket: "telegraf")`: "telegraf" 버킷에서 데이터를 가져와.
- `|> range(...)`: 대시보드 오른쪽 위에 설정된 시간 범위(예: 지난 1시간)에 해당하는 데이터만 필터링해.
- `|> filter(...)`: 여러 필터들을 통해 우리가 원하는 데이터만 콕 집어내는 과정이야.
- `_measurement`가 `cpu`인 것 (CPU 관련 데이터)
- `_field`가 `usage_idle`인 것 (CPU가 '아무것도 안 하고 쉰' 비율)
- `cpu` 태그가 `cpu-total`인 것 (개별 코어가 아닌 전체 CPU 평균)
- `|> aggregateWindow(...)`: 너무 데이터가 많으면 그래프가 지저분해지니, 일정 시간 간격으로 묶어서 평균(mean)을 내줘.
- `|> map(...)`: 여기가 핵심! 우리는 '사용한' 비율을 보고 싶은데, Telegraf는 '사용한' 비율이 아닌 '쉬고 있는(idle)' 비율을 수집해. 그래서 `100 - (쉬는 비율)` 계산을 통해 '총 사용률'로 변환해 주는 거야. 💡
- `|> yield(...)`: 최종 결과를 `usage_total`이라는 이름으로 출력해.

쿼리를 입력하고 잠시 기다리면, 상단 그래프 영역에 CPU 사용량 그래프가 실시간으로 그려지기 시작할 거야! 벌써부터 뭔가 해낸 것 같지 않아?

[패널(Panel) 옵션 설정]
이제 그래프를 좀 더 예쁘고 보기 좋게 꾸며보자. 오른쪽의 패널 옵션 메뉴를 활용할 거야.

- Panel options > Title: 패널의 제목을 'CPU Usage'처럼 알아보기 쉽게 바꿔줘.
- Standard options > Unit: 데이터의 단위를 설정하는 곳이야. 'Percent (0-100)'을 선택하면 그래프의 Y축에 '%' 기호가 붙고, 최댓값이 100으로 보기 좋게 설정돼.
- Graph styles > Style: 그래프를 선(Lines), 막대(Bars), 점(Points) 중에 선택할 수 있어. 'Lines'가 가장 무난하지.
- Thresholds: 특정 값에 따라 그래프 색상을 다르게 표시하는 기능이야. 예를 들어, 사용량이 80%를 넘으면 노란색, 90%를 넘으면 빨간색으로 표시되게 설정해서 위험 수준을 시각적으로 바로 알 수 있게 할 수 있어.

마음에 들게 꾸몄다면, 오른쪽 위 [Apply] 버튼을 눌러 대시보드에 패널을 추가하자. 짜잔! 첫 번째 위젯이 완성됐어! 👏

3. 다른 패널들도 추가해 보자!

이제 같은 방식으로 다른 지표들도 하나씩 추가해서 대시보드를 풍성하게 만들어 보자. 오른쪽 위 'Add panel' 아이콘을 눌러 새 패널을 추가하고, 아래 쿼리들을 활용해 봐.

[메모리 사용량 (Gauge)]
메모리 사용량은 전체 중 얼마나 사용 중인지 비율로 보는 게 직관적이야. 시각화 타입으로 'Gauge'를 선택하면 멋진 계기판 모양으로 만들 수 있어.

Flux 쿼리: 메모리 사용률

from(bucket: "telegraf")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "mem")
  |> filter(fn: (r) => r["_field"] == "used_percent")
  |> last()
  |> yield(name: "used_percent")

이 쿼리는 `mem` 측정값에서 `used_percent` 필드를 가져와. `last()`는 시간 범위 내 가장 마지막(최신) 값 하나만 보여달라는 의미야. Gauge 차트에는 현재 값 하나만 필요하니까!

오른쪽 패널 옵션에서 시각화 타입을 [Gauge]로 바꾸고, Unit을 [Percent (0-100)]으로 설정해 봐. 멋진 계기판이 생길 거야!

[디스크 사용량 (Stat)]
디스크 사용량은 남은 공간이나 전체 공간을 숫자로 명확하게 보여주는 게 좋아. 'Stat' 시각화 타입을 사용해 보자.

Flux 쿼리: 루트(/) 파티션 사용률

from(bucket: "telegraf")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "disk")
  |> filter(fn: (r) => r["_field"] == "used_percent")
  |> filter(fn: (r) => r["path"] == "/")
  |> last()
  |> yield(name: "disk_used_percent")

시각화 타입을 [Stat]으로 변경하고, Unit을 [Percent (0-100)]으로 설정해. Stat 설정에서 색상 모드(Color mode)를 'Background'로 바꾸면 값에 따라 배경색이 변해서 더 보기 좋아.

[네트워크 트래픽 (Time series)]
네트워크 트래픽은 시간에 따른 변화를 보는 게 중요하니 다시 'Time series' 그래프를 사용하자. 다운로드와 업로드를 함께 표시해 볼 거야.

Flux 쿼리: 네트워크 트래픽 (Bytes/sec)

from(bucket: "telegraf")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "net")
  |> filter(fn: (r) => r["_field"] == "bytes_recv" or r["_field"] == "bytes_sent")
  |> filter(fn: (r) => r["interface"] == "eth0") // 유선랜은 eth0, 무선랜은 wlan0
  |> derivative(unit: 1s, nonNegative: true)
  |> yield(name: "traffic")

- `derivative(unit: 1s, ...)`: 이게 핵심! 네트워크 트래픽은 누적된 바이트(bytes) 값으로 수집돼. `derivative` 함수는 이 누적 값의 시간당 변화율, 즉 '초당 전송량(Bytes/sec)'으로 계산해 줘. 우리가 흔히 말하는 '속도'가 되는 거지.
- `interface`: 너의 환경에 맞게 수정해야 해. 유선랜을 쓴다면 `eth0`, 무선랜(Wi-Fi)을 쓴다면 `wlan0`일 가능성이 높아. `ifconfig` 명령어로 확인해 봐.
- 패널 옵션의 Unit을 [Data (IEC)] > [Bytes/sec]로 설정하면 `KB/s`, `MB/s`처럼 자동으로 단위를 바꿔줘서 아주 편리해.

4. 대시보드 저장하고 꾸미기

원하는 패널들을 모두 추가했다면, 이제 대시보드를 저장할 시간이야. 오른쪽 위 디스켓 모양의 [Save dashboard] 아이콘을 클릭하고, 대시보드 이름을 'My Raspberry Pi 4'처럼 멋지게 지어줘.

이제 마우스로 각 패널들을 드래그해서 크기를 조절하고 위치를 옮기면서 너만의 레이아웃을 만들어 봐. 관련된 지표끼리 모아두면 더 보기 좋겠지? Grafana는 그리드 시스템을 사용해서 패널들을 깔끔하게 정렬하기 아주 쉬워.

💡 꿀팁: 커뮤니티 대시보드를 활용하자! 직접 만드는 게 어렵거나 귀찮다면, 다른 사람들이 이미 만들어서 공유해 둔 멋진 대시보드를 가져와서 쓸 수도 있어! Grafana 공식 홈페이지의 [Dashboards](https://grafana.com/grafana/dashboards/) 섹션에 가면 수많은 대시보드 템플릿이 있어. 'Raspberry Pi'나 'Telegraf System' 같은 키워드로 검색해서 마음에 드는 걸 찾은 다음, ID 번호를 복사해. 그리고 Grafana의 [Create] > [Import] 메뉴에서 ID를 붙여넣기만 하면 끝! 네 환경에 맞게 데이터 소스만 지정해 주면 바로 화려한 대시보드가 완성될 거야. 이걸 기반으로 너의 입맛에 맞게 수정하는 것도 좋은 방법이야.

어때? 이제 너는 너만의 라즈베리 파이 관제 센터를 갖게 된 거야! 실시간으로 변하는 그래프를 보고 있으면 정말 뿌듯하지 않아? 여기서 멈추지 말고, 온도 센서, 시스템 로그, 실행 중인 프로세스 수 등 더 다양한 지표들을 추가하면서 대시보드를 계속 발전시켜 봐. 모니터링의 세계는 무궁무진하거든. 이런 경험들이 쌓여서 너를 더 뛰어난 개발자나 엔지니어로 만들어 줄 거야. 혹시 더 복잡한 시스템을 구축하다 막히는 부분이 생긴다면, 재능넷 같은 곳에서 전문가의 도움을 받아보는 것도 좋은 방법이 될 수 있겠지. 이제 너의 라즈베리 파이는 투명한 유리 상자 속에서 열심히 일하는 모습을 너에게 항상 보여줄 거야! 🤖

댓글 작성

이 글에 대한 여러분의 생각을 들려주세요

댓글 0
댓글을 불러오는 중입니다.

아직 댓글이 없습니다.