본문으로 건너뛰기

2.2 Docker Compose Lab

실습 파일은 사이트에 함께 포함되어 있습니다. 아래 명령으로 내려받아 실행할 수 있습니다.

mkdir observability-lab
cd observability-lab

curl -O https://dbalog.dev/examples/observability-lab/compose.yml
curl -O https://dbalog.dev/examples/observability-lab/init-monitor.sql
mkdir -p prometheus grafana/provisioning/datasources
curl -o prometheus/prometheus.yml \
https://dbalog.dev/examples/observability-lab/prometheus/prometheus.yml
curl -o prometheus/postgres.rules.yml \
https://dbalog.dev/examples/observability-lab/prometheus/postgres.rules.yml
curl -o grafana/provisioning/datasources/prometheus.yml \
https://dbalog.dev/examples/observability-lab/grafana/provisioning/datasources/prometheus.yml

docker compose up -d

로컬 저장소에서는 site/static/examples/observability-lab의 파일을 그대로 사용할 수 있습니다.

서비스 확인

docker compose ps
curl -fsS http://localhost:9187/metrics | grep '^pg_up'
curl -fsS http://localhost:9090/-/ready

접속 주소는 다음과 같습니다.

서비스주소계정
PostgreSQLlocalhost:5432/apppostgres / postgres-lab
Exporter metricshttp://localhost:9187/metrics없음
Prometheushttp://localhost:9090없음
Grafanahttp://localhost:3000admin / admin-lab
경고

이 계정과 password는 로컬 실습 전용입니다. 운영에서는 image tag를 고정하고, password file이나 secret manager를 사용하며, Prometheus/Grafana에도 인증과 TLS를 적용합니다.

최소 권한 계정

초기화 SQL은 exporter 전용 login role을 만들고 pg_monitor를 부여합니다.

CREATE USER postgres_exporter WITH PASSWORD 'exporter-lab';
GRANT CONNECT ON DATABASE app TO postgres_exporter;
GRANT pg_monitor TO postgres_exporter;

Exporter를 superuser로 연결하지 않습니다. pg_monitor는 통계 view와 monitoring 함수에 필요한 권한을 묶은 built-in role입니다. 업무 table의 모든 데이터를 읽을 권한과는 다릅니다.

실습 부하 만들기

transaction counter와 pg_stat_statements에 관측 가능한 변화를 만듭니다.

for i in $(seq 1 200); do
docker compose exec -T postgres \
psql -U postgres -d app -c \
"SELECT count(*) FROM orders WHERE customer_id BETWEEN 10 AND 500;" >/dev/null
done

긴 transaction도 하나 만들어 봅니다.

docker compose exec postgres psql -U postgres -d app
BEGIN;
UPDATE orders SET status = 'processing' WHERE id = 1;
SELECT pg_sleep(120);
ROLLBACK;

다른 terminal에서 exporter output과 Prometheus query를 확인합니다.

종료와 초기화

docker compose down

데이터까지 지우고 처음부터 다시 시작할 때만 volume을 제거합니다.

docker compose down -v

-v는 PostgreSQL, Prometheus, Grafana의 실습 데이터를 모두 제거합니다.