📊
데이터 시각화 & 대시보드 가이드

Grafana 완전 가이드

👥 방문자 수

Grafana로 메트릭, 로그, 트레이스를 하나의 대시보드에서 시각화하세요. 데이터소스 연결, 패널 제작, 변수, Alerting, Provisioning까지 실무 예제로 다룹니다.

Grafana 대시보드 Alerting Provisioning

1. Grafana란?

Grafana는 다양한 데이터소스의 시계열/로그/트레이스 데이터를 하나의 대시보드에서 시각화하는 오픈소스 플랫폼입니다. Prometheus, Loki, InfluxDB, MySQL, CloudWatch 등 수십 가지 데이터소스를 지원하며, 관찰 가능성(Observability) 스택의 "화면" 역할을 담당합니다.

구성 요소역할
Dashboard여러 Panel을 배치한 시각화 화면. JSON으로 정의
Panel단일 그래프/표/게이지 등 시각화 단위
Data SourceGrafana가 쿼리를 실행할 외부 시스템 연결 (Prometheus, Loki 등)
Alert Rule쿼리 결과 기반 임계치 감시 및 알림 발송
Organization / Team대시보드·권한을 그룹 단위로 관리
💡
Grafana만으로는 데이터를 저장하지 않습니다. Grafana는 순수 시각화 계층이며, 실제 데이터는 Prometheus(메트릭), Loki(로그), Tempo(트레이스) 같은 백엔드에 저장됩니다.

2. 설치 (Docker Compose)

services:
  grafana:
    image: grafana/grafana-oss:11.0.0
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_USERS_ALLOW_SIGN_UP=false
    volumes:
      - grafana-data:/var/lib/grafana
      - ./provisioning:/etc/grafana/provisioning   # 데이터소스/대시보드 자동 등록

volumes:
  grafana-data:yaml
docker compose up -d
# http://localhost:3000 접속 (초기 admin/admin, 최초 로그인 시 비밀번호 변경 요구)bash

3. 데이터소스 연결

UI에서 Connections → Data sources → Add data source로 직접 등록하거나, Provisioning으로 코드화할 수 있습니다.

# provisioning/datasources/datasources.yaml
apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    jsonData:
      timeInterval: 15s

  - name: Loki
    type: loki
    access: proxy
    url: http://loki:3100

  - name: MySQL
    type: mysql
    url: mysql:3306
    database: appdb
    user: readonly
    secureJsonData:
      password: "${MYSQL_PASSWORD}"yaml

4. 대시보드 & 패널

대시보드는 여러 Panel의 격자 레이아웃입니다. 대표적인 패널 타입은 다음과 같습니다.

패널 타입용도
Time series시간축 그래프 — CPU, 요청 수 등 추세 확인
Stat단일 값 강조 표시 (현재 접속자 수 등)
Gauge / Bar gauge임계치 대비 현재 값 (디스크 사용률 등)
Table로그·집계 결과를 표 형태로
Heatmap응답 시간 분포처럼 값의 밀도 시각화
# 패널 JSON 예시 (Panel → Edit → JSON Model 탭에서 확인 가능)
{
  "type": "timeseries",
  "title": "요청 수 (분당)",
  "targets": [
    { "expr": "sum(rate(http_requests_total[1m])) by (status)", "legendFormat": "{{status}}" }
  ],
  "fieldConfig": {
    "defaults": { "unit": "reqps", "custom": { "drawStyle": "line", "fillOpacity": 15 } }
  },
  "gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 }
}json
📦
빠르게 시작하려면 Dashboards → New → Import에서 커뮤니티 대시보드 ID를 입력하세요. 예: 1860(Node Exporter Full), 315(Kubernetes cluster monitoring), 7362(MySQL Overview).

5. 변수(Variables) & 템플릿

Variable을 사용하면 하나의 대시보드로 여러 서버·서비스·네임스페이스를 드롭다운으로 전환하며 재사용할 수 있습니다.

# Dashboard Settings → Variables → Add variable
Name: instance
Type: Query
Data source: Prometheus
Query: label_values(up, instance)
Multi-value: true
Include All option: true

# 패널 쿼리에서 변수 사용
sum(rate(http_requests_total{instance=~"$instance"}[5m]))

# 변수를 대시보드 제목에도 활용 가능
title: "요청 현황 — $instance"promql

6. Alerting

Grafana 9+ 의 Unified Alerting은 Prometheus의 AlertManager와 별개로, Grafana 자체에서 알림 규칙과 발송 채널을 관리합니다.

# Alert Rule (UI: Alerting → Alert rules → New alert rule)
Query: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
Condition: WHEN last() OF query IS ABOVE 0.05
Evaluate every: 1m   For: 5m   # 5분간 지속되면 Firing

# Contact point — Slack
Type: Slack
Webhook URL: https://hooks.slack.com/services/xxx/yyy/zzz

# Notification policy — 라벨 매칭으로 라우팅
Matching labels: severity=critical
Contact point: slack-oncall
Group by: alertname, clusteryaml
⚠️
Prometheus + AlertManager를 이미 구축했다면 알림 이원화를 피하기 위해 둘 중 하나만 사용하는 것을 권장합니다. 자세한 AlertManager 설정은 Prometheus 가이드를 참고하세요.

7. Provisioning (Dashboards as Code)

대시보드와 데이터소스를 UI가 아닌 파일로 관리하면 Git으로 버전 관리하고 여러 환경에 동일하게 배포할 수 있습니다.

# provisioning/dashboards/dashboards.yaml
apiVersion: 1
providers:
  - name: default
    folder: "App Dashboards"
    type: file
    updateIntervalSeconds: 30
    options:
      path: /etc/grafana/provisioning/dashboards/json
      foldersFromFilesStructure: true

# 디렉터리 구조
provisioning/
├── datasources/datasources.yaml
└── dashboards/
    ├── dashboards.yaml
    └── json/
        └── api-overview.json   # 대시보드 export한 JSON 그대로 배치yaml
# API로 대시보드 export / import (스크립트 자동화)
curl -s -H "Authorization: Bearer $GRAFANA_API_KEY" \
  http://localhost:3000/api/dashboards/uid/ | jq '.dashboard' > api-overview.json

curl -X POST -H "Authorization: Bearer $GRAFANA_API_KEY" -H "Content-Type: application/json" \
  -d @payload.json http://localhost:3000/api/dashboards/dbbash

8. 플러그인 & 사용자/조직 관리

# 플러그인 설치 (예: Pie Chart, CloudWatch)
grafana-cli plugins install grafana-piechart-panel
# Docker 환경에서는 환경변수로 설치
GF_INSTALL_PLUGINS=grafana-piechart-panel,grafana-clock-panel

# API Key / Service Account 발급 (자동화·Provisioning용)
grafana-cli admin reset-admin-password newpasswordbash
권한 범위설명
Organization대시보드·데이터소스가 속한 최상위 격리 단위
Team조직 내 사용자 그룹. 폴더/대시보드 권한을 팀 단위로 부여
Role (Viewer/Editor/Admin)사용자별 기본 권한 등급
Folder permissions폴더 단위로 팀/사용자별 조회·편집 권한 세분화

9. 다음 단계

🚀
Grafana 심화 로드맵

Grafana Loki: 로그 수집·검색 — Prometheus와 동일한 라벨 모델
Grafana Tempo: 분산 트레이싱, Jaeger/Zipkin 호환
Grafana Cloud: 관리형 Prometheus + Loki + Tempo + Grafana 통합 SaaS
Terraform Provider: 대시보드/데이터소스/알림 규칙을 IaC로 관리
Grafana Mimir: Prometheus 장기 저장 및 수평 확장

연계 가이드: Prometheus 가이드 · Kubernetes 실전/심화 가이드 · Docker 가이드