Grafana + InfluxDB + Telegraf 모니터링 환경 구축

5win·2025년 1월 17일
0

1. 개요

일단 내가 구상한 아키텍처는 3개의 머신으로 이루어져 있다.

  1. 백엔드 애플리케이션 (AWS EC2)
  2. DB 서버 (iMac On-premise)
  3. 모니터링 서버 (Macbook)

보시다시피 iMac 서버를 DB만 띄워진 DB 서버로 사용하려 했었다.

그리고 주력 개발 컴퓨터인 맥북에 모니터링 애플리케이션을 띄우려 했다.

그러나 맥북의 용량 문제나, Ubuntu와 MacOS의 환경 설정 차이 등등으로 인해 모니터링 애플리케이션도 iMac 서버에 띄우기로 했다.

아무튼 이번 포스트에서는 iMac에 모니터링 환경을 구축하는 과정을 담아보겠다.


2. 도커 설치

모든 애플리케이션은 도커 컨테이너로 띄울 것이므로 도커부터 설치하자.

아래 링크에 나와있는 설치 방법을 순서대로 잘 수행하면 금방 뚝딱 설치할 수 있다.

https://docs.docker.com/engine/install/ubuntu/

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update


sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin


sudo docker run hello-world

hello-world가 출력되므로써 도커 설치가 성공적으로 마무리 됐다.


3. InfluxDB + Telegraf VS Prometheus

성능 테스트 도구로 k6를 선택했고, 따라서 그라파나를 구축해야 했다.

그라파나는 수집된 매트릭을 대시보드로 구성하여 시각화를 도와주는 툴이라고 보면 될 것 같은데, 이 때 매트릭을 수집하는 방법에 따라 Pull 방식과 Push 방식으로 나뉘는 것 같다.

대표적으로 Push 방식에는 InfluxDB + Telegraf 조합이 사용되고, Pull 방식에는 Prometheus가 사용된다고 한다.


프로메테우스는 서버의 Exporter에 의해서 데이터를 pull 해올 수 있다.

Pull 방식 답게, 종속성이 prometheus 서버에서 exporter 서버 방향으로 되어있고, 덕분에 모니터링 서버의 변경, 이동, 확장에 보다 유연한 구조를 가진다는 장점이 있다.

반면에 InfluxDB + Telegraf 조합은 Telegraf가 수집된 데이터를 InfluxDB로 push해주는 방식으로 동작한다.

Pull과는 반대로, 모니터링 대상 서버가 변경되거나 확장되더라도 InfluxDB가 존재하는 중앙 서버는 변경되지 않는다.


즉, 프로메테우스를 사용하면 모니터링 서버의 확장에 유연하고, Telegraf를 사용하면 모니터링 대상 서버의 확장에 유연한 것이라고 이해된다.

현재 수준에서는 어떤 것을 선택하든 상관이 없다.

따라서 로컬에서 k6 테스트 실습을 진행하면서 잠깐이라도 다뤄봤던 InfluxDB를 사용하기로 했고,
Grafana + InfluxDB + Telegraf 조합으로 모니터링 환경을 구축하겠다.


4. Grafana + InfluxDB + Telegraf 컨테이너 환경 구축

K6 툴 실습을 하면서 도커 컴포즈로 컨테이너 환경을 구축했었기 때문에 이번에도 Telegraf 만 추가하여 도커 컴포즈로 환경을 구축하고자 한다.

먼저 도커 컴포즈 스크립트는 다음과 같다.

services:
  telegraf:
    image: telegraf:1.33.1
    container_name: telegraf
    volumes:
    - ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
    - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - influxdb
    links:
      - influxdb
    ports:
    - "8125:8125"

  influxdb:
    image: influxdb:1.8
    container_name: influxdb
    environment:
      - INFLUXDB_DB=influx
      - INFLUXDB_ADMIN_USER=admin
      - INFLUXDB_ADMIN_PASSWORD=admin
      - INFLUXDB_HTTP_AUTH_ENABLED=false
    ports:
      - "8086:8086"
    volumes:
      - influxdb_data:/var/lib/influxdb

  grafana:
    image: grafana/grafana:latest
    depends_on:
      - influxdb
    environment:
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_BASIC_ENABLED=false
    links:
      - influxdb
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
volumes:
  grafana_data: {}
  influxdb_data: {}

다음으로 Telegraf에서 수집할 매트릭들을 지정하는 설정 파일이 필요하다.

telegraf.conf 라는 이름의 파일을 만들고 다음과 같이 작성했다.

[global_tags]

[agent]
  interval = "60s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "10s"
  flush_jitter = "0s"
  precision = ""
  hostname = "127.0.0.1"
  omit_hostname = false

[[outputs.influxdb]]
  urls = ["http://influxdb:8086"]
  database = "influx"
  timeout = "5s"
  username = "admin"
  password = "admin"

[[inputs.cpu]]
  percpu = true
  totalcpu = true
  collect_cpu_time = false
  report_active = false

[[inputs.disk]]
  ignore_fs = ["autofs", "binfmt_misc", "cgroup", "configfs", "debugfs", "devfs", "devtmpfs", "devpts", "fusectl", "fuse.lxcfs", "hugetlbfs", "lxcfs", "mqueue", "none", "nsfs", "overlay", "pstore", "shm", "sysfs", "systemd-1", "tracefs", "tmpfs"]

[[inputs.diskio]]

[[inputs.kernel]]

[[inputs.mem]]

[[inputs.processes]]

[[inputs.swap]]

[[inputs.system]]

# Read metrics about docker containers
[[inputs.docker]]

  endpoint = "unix:///var/run/docker.sock"

  gather_services = false

  container_names = []

  ## Set the source tag for the metrics to the container ID hostname, eg first 12 chars
  source_tag = false

  ## Containers to include and exclude. Collect all if empty. Globs accepted.
  container_name_include = []
  container_name_exclude = []
  ## example: container_state_include = ["created", "restarting", "running", "removing", "paused", "exited", "dead"]
  ## example: container_state_exclude = ["created", "restarting", "running", "removing", "paused", "exited", "dead"]
  container_state_include = ["created", "restarting", "running", "removing", "paused", "exited", "dead"]
#  container_state_exclude = ["created", "restarting", "running", "removing", "paused", "exited", "dead"]
  timeout = "5s"

  perdevice = true

  total = false

  docker_label_include = []
  docker_label_exclude = []

  ## Which environment variables should we use as a tag
  tag_env = ["JAVA_HOME", "HEAP_SIZE"]

스크립트의 자세한 설명을 생략하고, docker compose up 명령어로 실행하고 나서 docker ps 로 각각의 컨테이너들이 잘 떠있는지 확인하자.

이제 어디서든 접속이 가능하도록 포트포워딩을 하면 대강 인프라 설정은 끝난다.


5. Grafana와 InfluxDB 연결 및 대시보드 구성

각각의 컨테이너들이 잘 띄워져 있는 것을 확인했으니, 대시보드 구성을 위해 grafana와 influxDB를 연결해보자.

먼저 http://{ip-address}:3000 으로 접속한 뒤, Connections 에서 Data sources 를 클릭하여 데이터 소스를 추가해야 한다.

InfluxDB가 같은 호스트에 존재하므로 URL은 http://influxdb:8086 으로 입력한다.

그리고 대상 DB 이름, user, password를 입력하면 성공이다.

InfluxDB 를 데이터 소스에 추가했으니 대시보드를 구성해보자.

Dashboards 에서 Add visualization 을 클릭한 뒤, 사진과 같이 SQL과 유사한 쿼리를 원하는대로 지정해주면 된다.

처음에 만들었든 4개의 패널 모습이다.

여기까지 Grafana + InfluxDB + Telegraf 로 모니터링 환경을 구축해보았다.

일단 환경만 구축했을 뿐, 세세한 설정이나 매트릭에 대한 이해는 부족하다.

나머지 환경 설정을 마무리하고 직접 K6로 성능 테스트를 해보면서 매트릭에 대해 알아 가겠다.

0개의 댓글