
이번 글에서는 메트릭이나 로그 대신 일반 관계형 데이터베이스를 Grafana에 연결한다. 이를 통해 Grafana가 특정 모니터링 도구에 종속된 도구가 아니라, 다양한 데이터 소스를 직접 조회해 시각화할 수 있는 구조임을 확인한다.
Docker Compose를 사용해 PostgreSQL과 Grafana를 함께 실행한다.
services:
postgres:
image: postgres:16-alpine
restart: always
environment:
POSTGRES_USER: grafana_user
POSTGRES_PASSWORD: grafana_password
POSTGRES_DB: grafana_db
volumes:
- postgres_data:/var/lib/postgresql/data
grafana:
image: grafana/grafana-oss:11.1.5
restart: always
ports:
- "3000:3000"
volumes:
- grafana-storage:/var/lib/grafana
volumes:
grafana-storage:
postgres_data:
이 구성은 PostgreSQL과 Grafana를 동일 네트워크에서 실행한다. 별도의 네트워크 설정 없이도 서비스 이름을 통해 접근할 수 있다.
컨테이너에 접속해 데이터베이스 상태를 확인한다.
docker compose exec postgres psql -U grafana_user -d grafana_db
테이블이 없는 상태를 확인한다.
\dt
시각화를 위해 두 개의 테이블을 생성한다.
environment_data: 시계열 데이터category_data: 범주형 데이터CREATE TABLE IF NOT EXISTS environment_data (
id SERIAL PRIMARY KEY,
updated_at TIMESTAMP NOT NULL,
temperature FLOAT NOT NULL,
humidity FLOAT NOT NULL,
pressure FLOAT NOT NULL
);
CREATE TABLE IF NOT EXISTS category_data (
id SERIAL PRIMARY KEY,
category VARCHAR(50) NOT NULL,
value1 FLOAT NOT NULL
);
과거 1일치 시계열 데이터를 생성한다.
INSERT INTO environment_data (updated_at, temperature, humidity, pressure)
SELECT
gs,
round((20 + random()*10)::numeric, 2),
round((30 + random()*30)::numeric, 2),
round((1000 + random()*20)::numeric, 2)
FROM generate_series(
now() - interval '1 day',
now(),
interval '1 second'
) gs;
범주형 데이터도 생성한다.
INSERT INTO category_data (category, value1, value2)
SELECT
(ARRAY['A','B','C'])[floor(random()*3 + 1)],
round((random()*100)::numeric, 2)
FROM generate_series(1, 86400);
Grafana에서 다음 경로로 이동한다.
Home → Connections → Data Source → PostgreSQL
연결 정보는 다음과 같다.
postgres:5432grafana_dbgrafana_usergrafana_password여기서 postgres는 docker-compose 서비스 이름이다. 동일 네트워크 내에서는 서비스 이름으로 접근한다. 연결 테스트 후 Save & Test를 실행하면 데이터소스 등록이 완료된다.