Profile picture

[Docker / 모니터링] Grafana + InfluxDB + Telegraf로 리소스 모니터링 대시보드 구축하기

JaehyoJJAng2024년 03월 10일

개요

이번 게시글에서는 Telegraf로 서버의 각종 지표(Metric)을 수집하고,

InfluxDB 라는 데이터 저장소에 차곡차곡 저장한 뒤,

Grafana를 통해 수집한 지표를 직관적인 대시보드로 시각화하는 방법에 대해 기록해보려고 합니다.


삼총사 소개!

본격적인 구축에 앞서, 우리가 사용할 세 가지 도구가 각각 어떤 역할을 하는지 이해해봅시다.


🧑‍🌾 Telegraf: 부지런한 데이터 수집가

  • 역할: 데이터 수집 (Collect)
  • 개념: 모니터링할 서버에 직접 설치되어, 시스템의 다양한 정보를 주기적으로 수집하는 에이전트입니다.
    • CPU 사용률, 메모리 점유율, 디스크 I/O, 네트워크 트래픽 등 생각할 수 있는 거의 모든 시스템 지표를 수집할 수 있어요.
  • 특징
    • 플러그인 기반: 수백 개의 플러그인(Input/Output)을 지원하여 확장성이 매우 뛰어납니다.
    • Docker, Nginx, MySQL 등 다양한 서비스의 지표도 플러그인 추가만으로 쉽게 수집할 수 있어요!
    • Go 언어로 작성되어 매우 가볍고 시스템에 부하를 주지 않습니다!

쉽게 말해서, Telegraf는 서버 곳곳을 돌아다니며 서버의 리소스 현황을 물어보고 기록하는 부지런한 도구라고 생각하시면 될 것 같습니다.


🗄️ InfluxDB: 시계열 데이터 전문 창고

  • 역할: 데이터 저장 (Store)
  • 개념: '언제(Time)' 어떤 일이 있었는지'를 기록한 데이터, 즉 시계열 데이터(Time-Series Data) 를 저장하고 처리하는 데 특화된 데이터베이스(TSDB)입니다.
  • 특징:
    • 고성능: 대량의 시계열 데이터를 매우 빠르고 효율적으로 쓰고 읽을 수 있도록 설계되었습니다.
    • 전용 쿼리 언어: InfluxQL 또는 Flux라는 자체 쿼리 언어를 통해 시계열 데이터를 쉽게 조회하고 집계할 수 있습니다.
    • 데이터 보존 정책 (Retention Policies): 데이터 보관 기간을 설정하여 오래된 데이터는 자동으로 삭제할 수 있어 저장 공간을 효율적으로 관리할 수 있습니다.

🎨 Grafana: 데이터를 예술로 만드는 아티스트

Grafana는 워낙 유명해서 다들 아실거라고 생각합니다!


데이터 시각화를 해주는 역할이고, InfluxDB와 같은 다양한 데이터 소스에 저장된 데이터를 가져와서,

사용자가 원하는 형태로 멋지게 시각화해주는 대시보드 툴이죠.


TIG 스택 구축 해보기

이제 이론은 충분히 익혔으니, 서버에 직접 TIG 스택을 구축해보겠습니다.


사전 준비

이 실습의 모든 과정은 UbuntuDocker 컨테이너 환경에서 진행됩니다.

먼저 dockerdocker compose를 설치하고 실습을 진행해주세요.
도커 및 도커 컴포즈 설치 방법


1단계: 프로젝트 폴더 및 설정 파일 생성

하나의 폴더 안에서 모든 것을 관리하도록 하겠습니다.


1. 작업할 폴더를 하나 생성해주세요.

mkdir my-tig-stack
cd my-tig-stack

2. 이 폴더 안에 docker-compose.yaml 파일을 생성하고 아래 내용을 붙여넣도록 하겠습니다.

# docker-compose.yml
version: '3'

services:
  influxdb:
    image: influxdb:2.7 # InfluxDB 이미지
    container_name: influxdb
    volumes:
      - influxdb-data:/var/lib/influxdb2 # 데이터 영속성을 위한 볼륨
    ports:
      - "8086:8086" # InfluxDB 포트
    environment:
      # InfluxDB 초기 설정을 환경변수로 지정
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=admin # 원하는 유저명
      - DOCKER_INFLUXDB_INIT_PASSWORD=your_secure_password # 강력한 비밀번호로 변경!
      - DOCKER_INFLUXDB_INIT_ORG=my-org # 조직 이름
      - DOCKER_INFLUXDB_INIT_BUCKET=my-bucket # 버킷 이름
      - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=admin # 매우 중요한 토큰! 꼭 복사해두세요.
    restart: unless-stopped

  telegraf:
    image: telegraf:1.29 # Telegraf 이미지
    container_name: telegraf
    volumes:
      # 로컬의 telegraf.conf 파일을 컨테이너 내부로 마운트
      - ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
      # 호스트(서버)의 시스템 정보를 읽기 위해 필요
      - /proc:/rootfs/proc:ro
      - /sys:/rootfs/sys:ro
      - /etc/os-release:/rootfs/etc/os-release:ro
    depends_on:
      - influxdb # InfluxDB가 먼저 실행되도록 설정
    restart: unless-stopped

  grafana:
    image: grafana/grafana:10.4.2 # Grafana 이미지
    container_name: grafana
    volumes:
      - grafana-data:/var/lib/grafana # 대시보드, 설정 등 데이터 영속성을 위한 볼륨
    ports:
      - "3000:3000" # Grafana 포트
    depends_on:
      - influxdb
    restart: unless-stopped

volumes:
  influxdb-data:
  grafana-data:

각 컨테이너별 설정 내용 최신화가 필요하신 분들은 아래 깃허브 링크를 각각 참고해보세요.


3. 같은 폴더(my-tig-stack) 안에 Telegraf 설정 파일인 telegraf.conf를 생성하고 아래 내용을 붙여넣도록 하겠습니다.

# telegraf.conf

# Global Agent Configuration
[agent]
  interval = "10s"
  round_interval = true
  hostname = ""
  omit_hostname = false

#  INPUT PLUGINS
#  기본적인 호스트 서버의 CPU, 메모리, 디스크 등의 정보를 수집합니다.
[[inputs.cpu]]
  percpu = true
  totalcpu = true
  collect_cpu_time = false
  report_active = false
[[inputs.disk]]
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
[[inputs.diskio]]
[[inputs.mem]]
[[inputs.net]]
[[inputs.system]]
[[inputs.swap]]

# OUTPUT PLUGINS
# 수집한 데이터를 InfluxDB로 보냅니다.
[[outputs.influxdb_v2]]
  # 도커 네트워크 안에서는 서비스 이름(influxdb)으로 통신합니다.
  urls = ["http://influxdb:8086"]

  # docker-compose.yml 파일에 설정한 토큰, 조직, 버킷 이름을 정확하게 입력합니다.
  token = "admin" # 여기에 위에서 설정한 influxdb 토큰을 다시 입력!
  organization = "my-org"
  bucket = "my-bucket"

2단계: 모든 컨테이너 실행하기

이제 모든 설정 파일 작성이 끝이 났습니다!

my-tig-stack 폴더 안에서 아래 명령어 한 줄만 실행시켜주세요.

docker compose up -d --build

3단계: Grafana 설정 및 대시보드 연동

이제 Grafana에 접속해 데이터 소스(Influxdb)를 연결하고 대시보드를 가져오기만 하면 끝이 납니다!


웹 브라우저에서 http://<내 서버 IP 주소>:3000으로 접속합니다.
(ID: admin / PW: admin, 이후 변경)


왼쪽 메뉴 톱니바퀴(Configuration) > Data Sources > Add new data source > InfluxDB 선택


설정 화면에서 아래와 같이 입력합니다.

  • Query Language: Flux
  • HTTP > URL: http://influxdb:8086
    • 가장 중요한 부분입니다! 브라우저가 아닌 Grafana '컨테이너'가 InfluxDB '컨테이너'에 접속하는 것이므로, Docker 네트워크의 서비스 이름인 influxdb를 사용해야 합니다. localhost라고 쓰면 Grafana 컨테이너 자기 자신을 가리키므로 연결에 실패합니다.
  • InfluxDB Details
    • Organization: my-org (docker-compose.yml에 설정한 값)
    • Token: your_super_secret_token (docker-compose.yml에 설정한 값)
    • Default Bucket: my-bucket (docker-compose.yml에 설정한 값)
  • Save & test를 클릭하여 "Data source is working" 메시지를 확인합니다.

이제 왼쪽 메뉴 + > Import에 들어가 대시보드 ID 1575 또는 8685를 입력하여 대시보드를 가져오면 됩니다!


Loading script...