프로젝트 개요
Prometheus와 Grafana를 활용한 메트릭 수집 방식을 조사하고 시스템을 구축하던 중, InfluxData의 InfluxDB와 Telegraf를 이용한 메트릭 수집 방법도 가능한 것을 확인하였다. 이에 따라 InfluxDB와 Telegraf를 활용한 방식도 간단히 함께 구축해보려 한다. TICK Stack이 있긴하지만 많이 사용되지 않는것 같아 Grafana 대시보드로 시각화하였다.
현재 구성할 아키텍처

이번 프로젝트에서는 Prometheus 스택과 별도로, Telegraf–InfluxDB–Grafana로 구성된 모니터링 스택도 함께 구축하여 테스트를 진행하였다. 시스템은 총 두 대의 VM을 활용하였으며, 하나는 Master Server, 다른 하나는 Target Server로 구성하였다.
Telegraf는 Target Server에서 시스템 메트릭을 수집하고, 이를 InfluxDB에 저장한다. Master Server에 구축된 InfluxDB는 수집된 데이터를 저장하는 역할을 하며, Grafana는 InfluxDB와 연결되어 해당 데이터를 시각화하는 대시보드를 제공한다.
시스템 배포는 Docker Compose를 활용하여 전체 모니터링 스택을 일관되게 구성하였다.
모니터링 범위는 다음과 같다.
- 운영체제(OS) 및 Docker 컨테이너의 메트릭 수집
Github
https://github.com/rlaehdwn0105/Grafana-InfluxDB-Docker
InfluxDB
InfluxDB는 InfluxData에서 개발한 오픈소스 기반의 시계열 데이터베이스로, 시간에 따라 변화하는 데이터를 효율적으로 저장하고 조회할 수 있도록 설계되었다. 센서 데이터, 애플리케이션 성능 지표, 인프라 로그 등 시간 정보를 포함한 데이터를 처리하는 데 최적화되어 있으며, 높은 쓰기 성능과 빠른 쿼리 응답 속도를 제공한다.
InfluxDB는 자체적인 쿼리 언어인 InfluxQL 또는 Flux를 통해 데이터를 분석할 수 있으며, RESTful API를 지원하여 다양한 시스템과의 연동이 용이하다. 또한, Retention Policy를 설정하여 데이터의 보존 기간을 자동으로 관리할 수 있어, 장기적인 운영 시 저장소를 효율적으로 활용할 수 있다.
Telegraf
Telegraf는 다양한 시스템 및 애플리케이션으로부터 메트릭 데이터를 수집하여 InfluxDB로 전송하는 경량화된 데이터 수집 에이전트이다. 시스템 리소스를 최소화하면서도 실시간으로 데이터를 효율적으로 수집할 수 있도록 설계되었으며, 운영 환경에서 부담 없이 적용할 수 있다. Telegraf는 플러그인 기반 아키텍처를 사용하여 유연한 확장이 가능하다. 입력 플러그인을 통해 CPU 사용률, 메모리 상태, 디스크 I/O, 네트워크 트래픽 등 다양한 시스템 메트릭을 수집할 수 있으며, 출력 플러그인을 활용하여 수집된 데이터를 InfluxDB뿐만 아니라 Prometheus, Kafka, Graphite, AWS CloudWatch 등 다양한 외부 시스템으로 전송할 수 있다.
Master-server
마스터 서버의 현재 파일의 구조는 다음과 같다.
root@dj-master:~/influxdb# tree
.
├── docker-compose.yml
├── grafana
│ ├── grafana.ini
│ └── provisioning
│ └── datasources
│ └── datasource.yml
└── telegraf
└── telegraf.conf
docker-compose.yml
root@dj-master:~/influxdb# cat docker-compose.yml
version: "3.8"
networks:
monitor-net:
driver: bridge
volumes:
grafana_data: {}
influxdb_data: {}
telegraf_data: {}
services:
grafana:
image: grafana/grafana:latest
container_name: grafana
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning/:/etc/grafana/provisioning/
ports:
- "3000:3000"
restart: unless-stopped
networks:
- monitor-net
labels:
org.label-schema.group: "monitoring"
influxdb:
image: influxdb:latest
container_name: influxdb
volumes:
- influxdb_data:/var/lib/influxdb
# - ./influxdb/init:/docker-entrypoint-initdb.d
ports:
- "8086:8086"
restart: unless-stopped
networks:
- monitor-net
labels:
org.label-schema.group: "monitoring"
telegraf:
image: telegraf:latest
container_name: telegraf
hostname: telegraf
restart: unless-stopped
user: telegraf:998
depends_on:
- influxdb
volumes:
- telegraf_data:/etc/telegraf
- ./telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro
- /:/hostfs:ro # 호스트 파일 시스템에 대한 읽기 전용 액세스
- /etc:/hostfs/etc:ro
- /proc:/hostfs/proc:ro
- /sys:/hostfs/sys:ro
- /var/run/utmp:/var/run/utmp:ro
- /var/run/docker.sock:/var/run/docker.sock:ro # Docker 소켓 액세스
environment:
- HOST_ETC=/hostfs/etc
- HOST_PROC=/hostfs/proc
- HOST_SYS=/hostfs/sys
- HOST_MOUNT_PREFIX=/hostfs
networks:
- monitor-net
labels:
org.label-schema.group: "monitoring"
각 서비스는 독립된 컨테이너로 구성되며, monitor-net이라는 브리지 네트워크를 통해 서로 통신하도록 설계하였다. 또한 각 서비스별 데이터를 지속적으로 보존하기 위해 별도의 Docker 볼륨을 사용하였다.
Telegraf는 시스템 메트릭 및 Docker 정보를 수집하기 위해 호스트 파일 시스템과 Docker 소켓에 읽기 전용으로 접근할 수 있도록 설정하였다. 특히 보안 강화를 위해 최근 릴리스에서는 루트 계정이 아닌 비루트 사용자(telegraf:998)로 실행되도록 변경되었기 때문에, 이 UID와 GID를 명시하여 컨테이너를 실행하였다. 이 설정은 Docker 소켓을 읽을 수 있도록 호스트의 docker.sock 소유 그룹과 일치시켜야 하는 점에 유의해야 한다.
Grafana는 기본 포트 3000으로 외부에 노출되며, provisioning 디렉토리를 통해 데이터 소스 및 대시보드 설정을 자동으로 구성할 수 있도록 하였다.
GID확인
먼저stat -c '%g' /var/run/docker.sock 명령어를 통해 자신의 GID를 확인해준다.

Docker 소켓의 그룹 GID가 998로 확인되어, Docker-Compose 파일의 Telegraf 설정에 user: telegraf:998을 추가해주었다.
Telegraf 설정
telegraf.conf
root@dj-master:~/influxdb/telegraf# cat telegraf.conf
[agent]
interval = "10s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = ""
debug = false
quiet = false
hostname = "master-server"
omit_hostname = false
[[outputs.influxdb_v2]]
urls = ["http://influxdb:8086"]
organization = "telegraf"
bucket = "telegraf"
timeout = "5s"
token = "influxdb-token"
[[inputs.docker]]
endpoint = "unix:///var/run/docker.sock"
gather_services = false
container_name_include = []
container_name_exclude = []
timeout = "5s"
docker_label_include = []
docker_label_exclude = []
perdevice = true
total = false
[[inputs.cpu]]
percpu = true
totalcpu = true
fielddrop = ["time_*"]
[[inputs.mem]]
# no configuration needed for basic memory metrics
[[inputs.disk]]
ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
[[inputs.diskio]]
# no configuration needed for basic disk IO metrics
[[inputs.net]]
# no configuration needed for basic network metrics
[[inputs.system]]
# no configuration needed for basic system metrics
[[inputs.processes]]
# no configuration needed for basic process metrics
[[inputs.swap]]
# no configuration needed for basic swap metrics
[[inputs.kernel]]
# no configuration needed for basic kernel metrics
telegraf.conf 파일은 Telegraf가 수집할 메트릭 종류, 수집 주기, 전송 대상 등을 정의하는 핵심 설정 파일이다. 이 설정에서는 CPU, 메모리, 디스크, 네트워크, 커널, 프로세스 등의 시스템 메트릭뿐만 아니라 Docker 관련 메트릭도 함께 수집하고 있다.
[[inputs.docker]] 플러그인을 통해 Docker 컨테이너 및 디바이스 단위의 정보를 수집하도록 구성되어 있으며, endpoint 항목은 /var/run/docker.sock으로 지정하여 Docker 소켓에 직접 접근하도록 설정되어 있다.
데이터는 [[outputs.influxdb_v2]] 항목을 통해 InfluxDB로 전송되며, 이를 위해 urls, organization, bucket, token 등의 정보가 정의되어 있다.
이 중 토큰은 InfluxDB UI 또는 CLI를 통해 직접 생성해야 하며, 생성된 토큰 값을 해당 항목에 입력해야 한다.
또한 hostname = "master-server" 설정을 통해 각 Telegraf 에이전트의 데이터를 서버 단위로 구분할 수 있으며, 이를 기반으로 InfluxQL 또는 Flux 쿼리를 사용하여 Grafana에서 서버별 대시보드를 구성할 수 있도록 설계되어 있다.
Grafana 설정
datasource.yml은 InfluxDB와 같은 외부 데이터 소스를 Grafana에 사전 등록하는 역할을 한다. grafana.ini는 grafana 초기 인터페이스 구성값이다.
datasources.yml
apiVersion: 1
datasources:
- name: InfluxDB
type: influxdb
access: proxy
url: http://influxdb:8086
database: telegraf
user: telegraf
password: metrics
isDefault: true
version: 1
editable: true
basicAuth: false
jsonData:
timeInterval: "5s"
Grafana에서 InfluxDB를 데이터 소스로 등록하기 위한 구성 파일이다. Grafana가 InfluxDB에 접근하여 Telegraf로 수집된 메트릭 데이터를 시각화할 수 있도록 도와준다. url 항목에는 InfluxDB의 주소를 지정하고, database, user, password 항목에는 InfluxDB에서 사용할 데이터베이스 이름과 인증 정보를 설정한다. 이 설정을 통해 Grafana는 기본 데이터 소스로 InfluxDB를 사용하게 되며, 메트릭 데이터를 5초 간격으로 조회할 수 있도록 timeInterval도 지정되어 있다.
다만, 토큰 기반 인증은 InfluxDB 구축 이후에만 발급되기 때문에,데이터 소스 설정은 수동으로 진행해야 한다. 이 파일은 추후 테스트를 하기 위해 작성하였다.
grafana.ini
provisioning = /etc/grafana/provisioning
[security]
admin_user = admin
admin_password = admin
[users]
default_theme = dark
Target Server
다음은 타겟서버에서의 파일구조이다.
├── docker-compose.yml
└── telegraf
└── telegraf.conf
docker-compose.yml
root@node-dj:~/influxdb# cat docker-compose.yml
version: "3.8"
services:
telegraf:
image: telegraf:latest
container_name: telegraf-node-server1
hostname: telegraf
restart: unless-stopped
user: telegraf:997
volumes:
- /:/hostfs:ro
- /etc:/hostfs/etc:ro
- /proc:/hostfs/proc:ro
- /sys:/hostfs/sys:ro
- /var/run/utmp:/var/run/utmp:ro
- /var/run/docker.sock:/var/run/docker.sock:ro # Docker 소켓 액세스
- ./telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro # 구성 파일 로드
environment:
- HOST_ETC=/hostfs/etc
- HOST_PROC=/hostfs/proc
- HOST_SYS=/hostfs/sys
- HOST_MOUNT_PREFIX=/hostfs
마스터 서버에서 작성했던 docker-compose 파일에서 Telegraf 관련 설정만 가져와 그대로 사용하였다.
Telegraf 설정
telegraf.conf
root@node-dj:~/influxdb/telegraf# cat telegraf.conf
[agent]
interval = "10s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = ""
debug = false
quiet = false
hostname = "target-server1"
omit_hostname = false
[[outputs.influxdb_v2]]
urls = ["http://master-server-ip:8086"]
organization = "telegraf"
bucket = "telegraf"
timeout = "5s"
token = "influxdb-token-url"
[[inputs.docker]]
endpoint = "unix:///var/run/docker.sock"
gather_services = false
container_name_include = []
container_name_exclude = []
timeout = "5s"
docker_label_include = []
docker_label_exclude = []
perdevice = true
total = false
[[inputs.cpu]]
percpu = true
totalcpu = true
fielddrop = ["time_*"]
[[inputs.mem]]
# no configuration needed for basic memory metrics
[[inputs.disk]]
ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
[[inputs.net]]
# no configuration needed for basic network metrics
[[inputs.system]]
# no configuration needed for basic system metrics
[[inputs.processes]]
# no configuration needed for basic process metrics
[[inputs.swap]]
# no configuration needed for basic swap metrics
[[inputs.kernel]]
# no configuration needed for basic kernel metrics
telegraf.conf 파일은 마스터 서버와 동일한 방식으로 설정되지만, outputs.influxdb 섹션에서는 반드시 마스터 서버의 IP 주소를 지정해야 한다. 이는 Telegraf가 수집한 메트릭 데이터를 마스터 서버에 위치한 InfluxDB로 전송하기 위해서이다.
Grafana 확인
이제 전체 구성은 끝났으니 Docker compose up -d 명령을 통 마스터 서버부터 컨테이너를 올려주도록 하겠다.

Grafana, InfluxDB, Telegraf 컨테이너가 정상적으로 실행되었다. 다음 단계로, 웹 브라우저에서 http://$master-server-ip:3000 URL을 통해 Grafana 대시보드에 접속해 보겠다.
Dashboard 접속
계정은 설정해두었던 기본 관리자계정 admin:admin으로 접속할 수 있다.

Datasorce setting
데이터 소스를 확인한 결과, InfluxDB에 대한 인증 오류가 발생하였다. 이를 해결하기 위해, InfluxDB에서 수동으로 토큰을 발급받아 문제를 해결해주었다.

Influxdb API Token 발급
http://$master-server-ip:8086 주소를 통해 InfluxDB 대시보드에 접속한다. 이후 name, bucket, organization은 telegraf.conf 파일에 설정해둔 값을 기준으로 입력해준다.

생성해주면 다음과 같이 자동으로 토큰이 발급된다. 이제 이토큰을 Grafana datasorce와 telegraf.conf 파일에 입력해주면 된다.

Influxdb API Token 등록
Grafana의 데이터 소스 설정 창에서 Custom HTTP Headers에 인증 토큰을 추가해주면 된다.
Header: Authoriztion
Value: Token $influxdb-token
Value에서는 다음과 같이 influxdb 토큰 URL 앞에 따로 Token이라는 단어를 붙여줘야한다.
Token LP8q-ItfkGnDMI-aZheWll6dOWzgs6VyejsGnQNA9I-oFvzj4s4DHaieClQczc

토큰이 정상적으로 인증되었고, 아래와 같이 데이터 소스가 성공적으로 등록된 모습을 확인할 수 있다.

Telegraf에 Influxdb API Token 토큰 적용
다음은 telegraf.conf 파일에 InfluxDB의 토큰 값을 입력해야, InfluxDB가 Telegraf를 통해 정상적으로 메트릭 데이터를 수집할 수 있는 설정이다. 토큰 값을 입력한 뒤에는 docker-compose restart telegraf 명령어로 Telegraf 컨테이너를 재시작해야 한다. 이 과정은 타겟 서버에서도 동일하게 적용된다.
모든 인증이 완료되었으면, 이제 Grafana에서 대시보드를 구성한다. 여기서는 오픈소스로 제공되는 대시보드 템플릿을 미리 다운로드한 후, 이를 커스터마이징하여 JSON 파일 형태로 불러와 Grafana에 적용하였다.

Grafana Dashboard 생성
Create Dashboard에서 Import a dashboard를 선택해준다.

커스터마이징한 대시보드 JSON 파일을 업로드한 뒤, Name만 설정해주면 된다. 이렇게 Import를 완료하면, 다음과 같이 Grafana에서 대시보드가 정상적으로 구축된 모습을 확인할 수 있다.

Matser-server Dashboard
Docker Container와 Host OS의 리소스 사용량을 실시간으로 시각화하여 보여준다. CPU, 메모리, 디스크 사용량, 시스템 부하, 실행 중인 프로세스 수 등 서버의 주요 성능 지표를 확인할 수 있다, 또한, 실행 중인 Docker 컨테이너의 자원 사용 현황과 이미지 및 컨테이너 상태까지 함께 모니터링할 수 있도록 구성되어 있다.

target-server Dashboard

대시보드를 확인하면, Telegraf를 통해 수집된 OS 메트릭과 Docker 메트릭이 InfluxDB에 저장되고, 이 데이터가 Grafana 대시보드에 시각화된 것을 볼 수 있습니다.
이제 OS 및 Docker 로그를 수집하고 싶다면, 이전에 구축한 Loki와 Promtail을 추가하여 로그 수집 및 시각화 기능을 확장할 수 있습니다. 이를 통해 전체 시스템 모니터링과 로그 분석을 더욱 효과적으로 관리할 수 있습니다.