일단 내가 구상한 아키텍처는 3개의 머신으로 이루어져 있다.
보시다시피 iMac 서버를 DB만 띄워진 DB 서버로 사용하려 했었다.
그리고 주력 개발 컴퓨터인 맥북에 모니터링 애플리케이션을 띄우려 했다.
그러나 맥북의 용량 문제나, Ubuntu와 MacOS의 환경 설정 차이 등등으로 인해 모니터링 애플리케이션도 iMac 서버에 띄우기로 했다.
아무튼 이번 포스트에서는 iMac에 모니터링 환경을 구축하는 과정을 담아보겠다.
모든 애플리케이션은 도커 컨테이너로 띄울 것이므로 도커부터 설치하자.
아래 링크에 나와있는 설치 방법을 순서대로 잘 수행하면 금방 뚝딱 설치할 수 있다.
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가 출력되므로써 도커 설치가 성공적으로 마무리 됐다.
성능 테스트 도구로 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 조합으로 모니터링 환경을 구축하겠다.
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
로 각각의 컨테이너들이 잘 떠있는지 확인하자.
이제 어디서든 접속이 가능하도록 포트포워딩을 하면 대강 인프라 설정은 끝난다.
각각의 컨테이너들이 잘 띄워져 있는 것을 확인했으니, 대시보드 구성을 위해 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로 성능 테스트를 해보면서 매트릭에 대해 알아 가겠다.