티스토리 뷰
1. 기본 SQL 쿼리 (MySQL 기준)
configuration_id 기준으로 최근 한 달 데이터에 대해 날짜별 통계를 수집.
SELECT
DATE(b.start_time) AS date,
DAYNAME(b.start_time) AS weekday,
c.name AS configuration_name,
SUM(CASE WHEN b.status = 'SUCCESSFUL' THEN 1 ELSE 0 END) AS success,
SUM(CASE WHEN b.status = 'FAILED' THEN 1 ELSE 0 END) AS failed,
SUM(CASE WHEN b.status = 'CANCELLED' THEN 1 ELSE 0 END) AS cancelled,
SUM(CASE WHEN b.status = 'RECOMMENDED' THEN 1 ELSE 0 END) AS recommended,
COUNT(*) AS build_count,
b.configuration_id
FROM
QB_BUILD b
JOIN
QB_CONFIGURATION c ON b.configuration_id = c.id
WHERE
b.start_time >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
GROUP BY
DATE(b.start_time), c.name, b.configuration_id
ORDER BY
date DESC, configuration_name;
2. Grafana 구성 방법
A. 데이터 소스 설정
- 데이터 소스: MySQL
- 테이블 연결: 위 SQL 쿼리 사용
B. 패널 설정 (Table Panel)
- Panel Type: Table
- Query Mode: Raw SQL
- Time Column: b.start_time 또는 date
- Format As: Table
C. Transformation 적용 (Grafana UI 상에서)
- Add transformation → Organize fields
- 보이는 필드 순서:
- date
- weekday
- configuration_name
- success
- failed
- cancelled
- recommended
- build_count
- 보이는 필드 순서:
- Add transformation → Group by
- Group by fields: date, configuration_name
- Aggregations: sum (성공, 실패, 빌드수 등)
- Optional: Add Filter → 특정 configuration_id만 보기 (dropdown variable로 구성 가능)
3. Variables (필터용)
예: configuration_id 선택을 위한 변수 구성
- Type: Query
- Name: config
- Data source: MySQL
- Query:
- SELECT id AS __value, name AS __text FROM QB_CONFIGURATION ORDER BY name;
- Multi-value 지원, All 지원 설정
→ 이후 위 SQL 쿼리에 조건 추가:
AND b.configuration_id IN (${config:csv})
4. 결과 예시
날짜 요일 Configuration Name 성공 실패 취소 recommanded Build Count
| 2025-07-21 | Monday | 빌드/배포/백엔드 | 5 | 2 | 0 | 1 | 8 |
| 2025-07-21 | Monday | 테스트/프론트엔드 | 7 | 1 | 1 | 2 | 11 |
| ... | ... | ... | ... | ... | ... | ... | ... |
Grafana .json 대시보드 템플릿.
- 데이터 소스 이름: QuickBuild-Mysql
- 대시보드 이름: QuickBuild Daily Build Status
- 패널 이름: Build Summary by Configuration
{
"uid": "qb-daily-stats",
"title": "QuickBuild Daily Build Status",
"timezone": "browser",
"schemaVersion": 37,
"version": 1,
"refresh": "5m",
"panels": [
{
"id": 1,
"title": "Build Summary by Configuration",
"type": "table",
"datasource": {
"type": "mysql",
"uid": "QuickBuild-Mysql"
},
"pluginVersion": "10.4.2",
"targets": [
{
"format": "table",
"rawSql": "-- Build Summary (last 30 days)\nSELECT\n DATE(b.start_time) AS date,\n DAYNAME(b.start_time) AS weekday,\n c.name AS configuration_name,\n SUM(CASE WHEN b.status = 'SUCCESSFUL' THEN 1 ELSE 0 END) AS success,\n SUM(CASE WHEN b.status = 'FAILED' THEN 1 ELSE 0 END) AS failed,\n SUM(CASE WHEN b.status = 'CANCELLED' THEN 1 ELSE 0 END) AS cancelled,\n SUM(CASE WHEN b.status = 'RECOMMENDED' THEN 1 ELSE 0 END) AS recommended,\n COUNT(*) AS build_count,\n b.configuration_id\nFROM\n QB_BUILD b\nJOIN\n QB_CONFIGURATION c ON b.configuration_id = c.id\nWHERE\n b.start_time >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)\n AND b.configuration_id IN (${config:csv})\nGROUP BY\n DATE(b.start_time), c.name, b.configuration_id\nORDER BY\n date DESC, configuration_name;",
"refId": "A"
}
],
"fieldConfig": {
"defaults": {
"custom": {}
},
"overrides": []
},
"options": {
"showHeader": true,
"sortBy": [
{
"desc": true,
"displayName": "date"
}
]
},
"transformations": [
{
"id": "organize",
"options": {
"excludeByName": {},
"indexByName": {},
"renameByName": {},
"columns": [
{ "text": "date" },
{ "text": "weekday" },
{ "text": "configuration_name" },
{ "text": "success" },
{ "text": "failed" },
{ "text": "cancelled" },
{ "text": "recommended" },
{ "text": "build_count" }
]
}
}
],
"gridPos": {
"h": 12,
"w": 24,
"x": 0,
"y": 0
}
}
],
"templating": {
"list": [
{
"name": "config",
"type": "query",
"datasource": {
"type": "mysql",
"uid": "QuickBuild-Mysql"
},
"definition": "SELECT id AS __value, name AS __text FROM QB_CONFIGURATION ORDER BY name;",
"refresh": 1,
"multi": true,
"includeAll": true,
"sort": 1,
"query": "SELECT id AS __value, name AS __text FROM QB_CONFIGURATION ORDER BY name;",
"hide": 0,
"label": "Configuration",
"current": {
"text": "All",
"value": "$__all"
}
}
]
}
}
사용 방법
- Grafana → 대시보드 → Import
- 위 JSON 전체를 붙여넣기 or Upload .json 파일로 저장해서 불러오기
- 데이터소스 QuickBuild-Mysql 선택 (실제 이름과 다르면 수정 필요)
필요하면 요걸 기반으로 주별 / 월별 대시보드도 추가로 만들어줄 수 있어.
또는 에이전트, 큐 대기시간, 빌드 시간 평균 같은 통계도 붙여줄 수 있어.
말만 해줘, 바로 붙여줄게.
"일별" 대시보드를 기반으로 "주별", "월별" 통계용 패널 추가 .json Grafana 대시보드
구조
- 대시보드 이름: QuickBuild Build Summary
- 패널 3개:
- Daily Summary
- Weekly Summary
- Monthly Summary
- 모두 같은 configuration_id 변수 필터 사용
- 데이터소스: QuickBuild-Mysql
대시보드 JSON 템플릿
아래는 .json 형식의 전체 대시보드 템플릿이야. 길지만 복사해서 그대로 Grafana > Import 하면 돼.
전체 JSON 파일:
다운로드하려면 여기를 눌러줘 (.json)
또는 텍스트로 보고 싶다면 말해줘.
SQL 쿼리 핵심 요약
1. 일별 통계 (기존과 동일)
SELECT
DATE(b.start_time) AS date,
...
GROUP BY DATE(b.start_time), ...
2. 주별 통계
SELECT
YEARWEEK(b.start_time, 1) AS year_week,
CONCAT(YEAR(b.start_time), '-W', LPAD(WEEK(b.start_time, 1), 2, '0')) AS week_label,
...
GROUP BY year_week, c.name
3. 월별 통계
SELECT
DATE_FORMAT(b.start_time, '%Y-%m') AS month,
...
GROUP BY month, c.name
필터 구성 (공통)
SELECT id AS __value, name AS __text FROM QB_CONFIGURATION ORDER BY name
→ ${config:csv} 변수를 각 쿼리에 포함시켜 멀티 선택 필터링 가능
사용법 요약
- Grafana → + → Import
- .json 붙여넣기 또는 파일 업로드
- 데이터소스 QuickBuild-Mysql 지정
- 저장 → 사용
Grafana 대시보드 JSON 템플릿
QuickBuild Daily / Weekly / Monthly Summary – Grafana JSON
아래 JSON은 Grafana에서 Import 가능한 형태.
데이터소스 이름은 "QuickBuild-Mysql"로 설정되어 있으니, 다르면 수정
{
"uid": "quickbuild-stats",
"title": "QuickBuild Build Summary",
"timezone": "browser",
"version": 1,
"schemaVersion": 38,
"refresh": "5m",
"templating": {
"list": [
{
"name": "config",
"type": "query",
"datasource": {
"type": "mysql",
"uid": "QuickBuild-Mysql"
},
"definition": "SELECT id AS __value, name AS __text FROM QB_CONFIGURATION ORDER BY name;",
"refresh": 1,
"multi": true,
"includeAll": true,
"current": {
"text": "All",
"value": "$__all"
}
}
]
},
"panels": [
{
"id": 1,
"title": "📅 Daily Summary",
"type": "table",
"datasource": {
"type": "mysql",
"uid": "QuickBuild-Mysql"
},
"targets": [
{
"format": "table",
"refId": "A",
"rawSql": "SELECT DATE(b.start_time) AS date, DAYNAME(b.start_time) AS weekday, c.name AS configuration_name, SUM(CASE WHEN b.status = 'SUCCESSFUL' THEN 1 ELSE 0 END) AS success, SUM(CASE WHEN b.status = 'FAILED' THEN 1 ELSE 0 END) AS failed, SUM(CASE WHEN b.status = 'CANCELLED' THEN 1 ELSE 0 END) AS cancelled, SUM(CASE WHEN b.status = 'RECOMMENDED' THEN 1 ELSE 0 END) AS recommended, COUNT(*) AS build_count FROM QB_BUILD b JOIN QB_CONFIGURATION c ON b.configuration_id = c.id WHERE b.start_time >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND b.configuration_id IN (${config:csv}) GROUP BY DATE(b.start_time), c.name ORDER BY date DESC;"
}
],
"options": {
"showHeader": true
},
"gridPos": { "h": 10, "w": 24, "x": 0, "y": 0 }
},
{
"id": 2,
"title": "📈 Weekly Summary",
"type": "table",
"datasource": {
"type": "mysql",
"uid": "QuickBuild-Mysql"
},
"targets": [
{
"format": "table",
"refId": "B",
"rawSql": "SELECT CONCAT(YEAR(b.start_time), '-W', LPAD(WEEK(b.start_time, 1), 2, '0')) AS week_label, c.name AS configuration_name, SUM(CASE WHEN b.status = 'SUCCESSFUL' THEN 1 ELSE 0 END) AS success, SUM(CASE WHEN b.status = 'FAILED' THEN 1 ELSE 0 END) AS failed, SUM(CASE WHEN b.status = 'CANCELLED' THEN 1 ELSE 0 END) AS cancelled, SUM(CASE WHEN b.status = 'RECOMMENDED' THEN 1 ELSE 0 END) AS recommended, COUNT(*) AS build_count FROM QB_BUILD b JOIN QB_CONFIGURATION c ON b.configuration_id = c.id WHERE b.start_time >= DATE_SUB(CURDATE(), INTERVAL 90 DAY) AND b.configuration_id IN (${config:csv}) GROUP BY week_label, c.name ORDER BY week_label DESC;"
}
],
"options": {
"showHeader": true
},
"gridPos": { "h": 10, "w": 24, "x": 0, "y": 11 }
},
{
"id": 3,
"title": "📊 Monthly Summary",
"type": "table",
"datasource": {
"type": "mysql",
"uid": "QuickBuild-Mysql"
},
"targets": [
{
"format": "table",
"refId": "C",
"rawSql": "SELECT DATE_FORMAT(b.start_time, '%Y-%m') AS month, c.name AS configuration_name, SUM(CASE WHEN b.status = 'SUCCESSFUL' THEN 1 ELSE 0 END) AS success, SUM(CASE WHEN b.status = 'FAILED' THEN 1 ELSE 0 END) AS failed, SUM(CASE WHEN b.status = 'CANCELLED' THEN 1 ELSE 0 END) AS cancelled, SUM(CASE WHEN b.status = 'RECOMMENDED' THEN 1 ELSE 0 END) AS recommended, COUNT(*) AS build_count FROM QB_BUILD b JOIN QB_CONFIGURATION c ON b.configuration_id = c.id WHERE b.start_time >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH) AND b.configuration_id IN (${config:csv}) GROUP BY month, c.name ORDER BY month DESC;"
}
],
"options": {
"showHeader": true
},
"gridPos": { "h": 10, "w": 24, "x": 0, "y": 22 }
}
]
}
사용 방법
- Grafana 접속 → 왼쪽 메뉴 + → Import
- 위 JSON 전체 복사 → 붙여넣기
- 데이터 소스(QuickBuild-Mysql) 선택
- 저장하면 완료!
댓글
