티스토리 뷰

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 상에서)

  1. Add transformation → Organize fields
    • 보이는 필드 순서:
      • date
      • weekday
      • configuration_name
      • success
      • failed
      • cancelled
      • recommended
      • build_count
  2. Add transformation → Group by
    • Group by fields: date, configuration_name
    • Aggregations: sum (성공, 실패, 빌드수 등)
  3. 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"
        }
      }
    ]
  }
}

사용 방법

  1. Grafana → 대시보드 → Import
  2. 위 JSON 전체를 붙여넣기 or Upload .json 파일로 저장해서 불러오기
  3. 데이터소스 QuickBuild-Mysql 선택 (실제 이름과 다르면 수정 필요)

필요하면 요걸 기반으로 주별 / 월별 대시보드도 추가로 만들어줄 수 있어.
또는 에이전트, 큐 대기시간, 빌드 시간 평균 같은 통계도 붙여줄 수 있어.

말만 해줘, 바로 붙여줄게.

 


 

"일별" 대시보드를 기반으로 "주별", "월별" 통계용 패널 추가 .json Grafana 대시보드

구조

  • 대시보드 이름: QuickBuild Build Summary
  • 패널 3개:
    1. Daily Summary
    2. Weekly Summary
    3. 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} 변수를 각 쿼리에 포함시켜 멀티 선택 필터링 가능

사용법 요약

  1. Grafana → + → Import
  2. .json 붙여넣기 또는 파일 업로드
  3. 데이터소스 QuickBuild-Mysql 지정
  4. 저장 → 사용

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 }
    }
  ]
}

 

사용 방법

  1. Grafana 접속 → 왼쪽 메뉴 + → Import
  2. 위 JSON 전체 복사 → 붙여넣기
  3. 데이터 소스(QuickBuild-Mysql) 선택
  4. 저장하면 완료!

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2026/10   »
일 월 화 수 목 금 토
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함