생산성

Metabase를 통한 DB 데이터 시각화

Omoknooni 2025. 8. 31. 16:17

우리 회사의 다양한 서비스는 여러 AWS 계정과 다양한 리전에 걸쳐 운영하고 있다.

각 리전·계정별로 산재한 리소스 현황CloudWatch Alarm 내역을 파악하려면 매번 콘솔을 오가야 했는데, 이 과정이 번거롭고 실시간 모니터링도 쉽지 않았다.

이에 대해서 cloudwatch alarm이 발생하면 DevOps 팀이 사용하는 DB의 내부로 발생 내역 데이터를 저장하고, 주기적으로 구글 시트로 데이터를 추가해서 시트에서 차트를 그려내서 모니터링하도록 구성을 했었다.

하지만 여전히 여러 이슈에 부딪쳤고, 개선안을 탐색하게 되었다.

  • DB 데이터의 수동 추출 : DB의 데이터를 수동으로 csv로 뽑아, 직접 시트에 데이터를 추가해주어야 하는 번거로운 작업
  • 느린 시각화 랜더링 : 데이터 양이 증가함에 따라 필터를 통해 랜더링하는 과정에서 오랜 시간이 소요됨

 

이후, 비개발자도 쉽게 접근 가능하고, 빠르게 분석 리포트를 만들 수 있는 BI(Business Intelligence) 도구를 원했고, 그 결과 Metabase를 선택하게 되었다.

 

Metabase

오픈소스 데이터 시각화 및 BI 도구로, '간단하게 설치하고 SQL 쿼리를 잘 알지 못해도 쉽게 데이터를 조회할 수 있게 한다'라는 가치를 두어서 쉽고 간편하게 데이터 시각화를 커스텀할 수 있다.

 

다른 시각화 도구와 비교했을 때 Metabase의 장점은 아래와 같다.

  • 간단한 초기 설정: 별도의 config파일 설정 등의 작업 없이, Docker 한 줄로 띄울 수 있음
  • 비개발자 친화적: '쿼리빌더'를 통해 쿼리 작성 없이도 드래그,클릭으로 분석할 수 있음
  • 다양한 데이터베이스 연동: MySQL, PostgreSQL과 같은 DB뿐만 아니라 Athena, Redshift, BigQuery 등의 CSP 기반 데이터 웨어하우스 솔루션과도 연동이 가능
  • 오픈소스: Metabase를 선택하게된 가장 큰 이유로, 라이선스 비용 없이 사내에 도입 가능

 

컴포넌트

Metabase는 크게 3가지 컴포넌트로 구성되어 있다.

  • Question
    데이터를 질의하고 시각화하는 기본 단위, 'SQL 쿼리'에 매핑된다.
    생성한 쿼리를 차트 등으로 시각화할 수 있고, alarm을 지정하거나 파일로 Question 결과를 내보낼 수도 있다.
    • Model : 1차적으로 정제된 데이터셋, 간단하게 '미리 저장해둔 쿼리'로 생각하면 좋다
      Model을 통해서도 Question을 작성할 수 있다.
    • Metric : 숫자로 표현되는 '지표'값, '미리 계산된 값'으로 생각하면 좋다 (Metrics are like pre-defined calculations)
  • Dashboard
    여러 Question을 한 화면에 배치한 종합적인 현황판 (리소스 현황, 알람 발생 추이, 계정별 리소스 분포)
  • Collection
    Question과 Dashboard를 모은 폴더, 프로젝트별 / 팀별 등으로 묶어 관리할 수 있다

 

Cloudwatch Alarm 시각화

각 계정/리전의 Cloudwatch alarm 발생 내역 데이터를 저장할 DB 테이블을 작성하고, Metabase를 구축해서 가시화 시켜보도록 한다.

CREATE TABLE cloudwatch_alarms (
    id              BIGINT AUTO_INCREMENT PRIMARY KEY,
    account_id      VARCHAR(32) NOT NULL,          -- AWS 계정 ID
    region          VARCHAR(32) NOT NULL,          -- 알람이 속한 리전
    alarm_name      VARCHAR(255) NOT NULL,         -- 알람 이름
    metric_name     VARCHAR(255) NOT NULL,         -- 모니터링하는 메트릭 이름
    namespace       VARCHAR(255) NOT NULL,         -- AWS 네임스페이스 (예: AWS/EC2)
    state_value     ENUM('OK', 'ALARM', 'INSUFFICIENT_DATA') NOT NULL, -- 알람 상태
    state_updated   DATETIME NOT NULL,             -- 알람 상태가 마지막으로 변경된 시각
    description     TEXT,                          -- 알람 설명
    created_at      DATETIME DEFAULT CURRENT_TIMESTAMP
);

 

DB 세팅

Metabase Docs에서는 DB에 접근할 수 있는 Metabase 전용 사용자를 추가하도록 제시하고 있다.

MySQL을 Data Source로 하는 경우, 아래와 같이 Role과 사용자를 생성하고 접근제어를 지정할 수 있다.

-- 1) 역할 생성
CREATE ROLE 'analytics';

-- 2) 역할에 '읽기 최소 권한' 부여 (데이터베이스 전체 읽기)
GRANT SELECT, SHOW VIEW ON `your_database`.* TO 'analytics';

-- 3) Metabase 전용 사용자 생성
CREATE USER 'metabase'@'%' IDENTIFIED BY 'your_password';

-- 4) 사용자에게 역할을 부여하고, 기본 역할로 설정
GRANT 'analytics' TO 'metabase'@'%';
SET DEFAULT ROLE 'analytics' TO 'metabase'@'%';

 

 

MetaBase 세팅

Docker hub에 배포하고 있는 공식 docker 이미지를 사용하도록 한다.

docker pull metabase/metabase

 

컨테이너 구동 후 해당 포트를 웹으로 접근하면 초기 세팅을 시작하게 된다. Metabase에 접근할 계정과 Metabase가 바라볼 DB, DB 사용자 등의 정보를 입력한다.

docker run -d -p 3000:3000 --name metabase metabase/metabase

 

 

이렇게 DB를 연결하면 해당 계정이 볼 수 있는 범위 내의 DB 테이블 목록들을 확인할 수 있게 된다.

이제 이 데이터들을 바탕으로 대시보드와 Question(쿼리)들을 몇 가지 작성해볼 수 있다.

 

 

Question(쿼리) 작성

Metabase의 최대 장점 중 하나로, Question은 SQL 문 뿐만 아니라 쿼리빌더 GUI를 통해서도 구성할 수 있다.

아래처럼 SQL 문법을 자세하게 알지 못해도 '어떤 데이터셋'을 사용할지, '어떤 값'을 뽑아올지, '어떤 값'으로 요약할지 등 만으로 SQL문을 작성할 수 있게 된다.

테이블을 직접 지정해서 쿼리빌더에서 사용하기

 

 

 

 

각 파트별로 쿼리의 수행결과(프리뷰)를 직접 확인해볼 수 있고, 쿼리빌더를 통해 작성한 SQL문도 함께 확인해서 변환할 수도 있다.

파트별로 프리뷰를 확인할 수 있음
쿼리빌더로 만든 Question에 대한 raw SQL도 확인 가능

 

시각화 구성

위에서 구성한 Question을 통해 얻어온 데이터들을 시각화해야한다.

Metabase는 테이블 형태의 list부터 bar, pie, line 등의 그래프와 피벗 테이블, Geo 데이터를 위한 Map 시각화를 지원한다.

 

시각화에 대한 공식 Docs를 참고해서 각 차트별로 생성방법과 사용 예시를 확인해볼 수 있다.

 

 

대시보드 구성

이렇게 생성한 Question을 Dashboard에 배치해서, 비슷한 주제에 대한 Question들을 함께 모니터링할 수 있게 된다.

 

Grafana 대시보드의 구성과 유사하게 퀴리들을 그리드 상에 배치/조절할 수 있고, 마크다운 텍스트나 링크/iframe 컴포넌트들을 배치할 수도 있다.

 

이메일이나 slack으로 대시보드에 대한 구독을 지정할 수 있고, 퍼블릭 URL을 생성하거나 PDF 파일로 추출해서 공유할 수 있다.

 

 

이렇게 Metabase를 이용해서 DB내의 데이터 모니터링을 위한 대시보드를 구성해보았다.

이 Metabase는 Grafana와 비교되는데, 두개 모두 DB 속 데이터를 충실하게 표현해준다는 점은 충분히 비교할만한 대상인 것 같다.

 

하지만 아무래도 Metabase는 비즈니스 데이터 분석에 초점이 맞춰져있고, Grafana는 모니터링 도구인 만큼 Metric같은 시계열 데이터에 있어서 강점을 보여준다.

UI 부분에도 Grafana는 커스텀 부분에 있어서 깊이 있고 자유도가 높고, Metabase는 컨셉에 맞게 비교적 간단한, point-and-click같은 요소에 초점이 맞춰진 느낌을 크게 받았다.

 

다음으로 Question에서 사용되는 'optional variables'와 대시보드-Question에 사용하는'Field filter'를 알아보도록 한다.