1. Grafana란?
Grafana는 다양한 데이터소스의 시계열/로그/트레이스 데이터를 하나의 대시보드에서 시각화하는 오픈소스 플랫폼입니다. Prometheus, Loki, InfluxDB, MySQL, CloudWatch 등 수십 가지 데이터소스를 지원하며, 관찰 가능성(Observability) 스택의 "화면" 역할을 담당합니다.
| 구성 요소 | 역할 |
|---|---|
| Dashboard | 여러 Panel을 배치한 시각화 화면. JSON으로 정의 |
| Panel | 단일 그래프/표/게이지 등 시각화 단위 |
| Data Source | Grafana가 쿼리를 실행할 외부 시스템 연결 (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/db bash
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 가이드
• Grafana Loki: 로그 수집·검색 — Prometheus와 동일한 라벨 모델
• Grafana Tempo: 분산 트레이싱, Jaeger/Zipkin 호환
• Grafana Cloud: 관리형 Prometheus + Loki + Tempo + Grafana 통합 SaaS
• Terraform Provider: 대시보드/데이터소스/알림 규칙을 IaC로 관리
• Grafana Mimir: Prometheus 장기 저장 및 수평 확장
연계 가이드: Prometheus 가이드 · Kubernetes 실전/심화 가이드 · Docker 가이드