From f1f82aa1ebea114800f5052f657a64a03226e295 Mon Sep 17 00:00:00 2001 From: kyy Date: Thu, 4 Sep 2025 15:35:13 +0900 Subject: [PATCH] =?UTF-8?q?git=20action=20clone=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 7 ++++ .gitea/workflows/main.yml | 12 +++++++ Dockerfile | 18 ++++++++++ README.md | 74 +++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 10 ++++++ requirements.txt | 2 ++ run_table.sh | 12 ------- src/report_table.py | 4 +-- 8 files changed, 125 insertions(+), 14 deletions(-) create mode 100644 .env.example create mode 100644 .gitea/workflows/main.yml create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 docker-compose.yml create mode 100644 requirements.txt diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..e83ee78 --- /dev/null +++ b/.env.example @@ -0,0 +1,7 @@ +# Grafana 설정 +GRAFANA_URL=http://localhost:3000 +GRAFANA_API_KEY= +GRAFANA_DASHBOARD_UID= + +# Mattermost 설정 (리포트 전송용) +MATTERMOST_WEBHOOK= diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml new file mode 100644 index 0000000..5099eff --- /dev/null +++ b/.gitea/workflows/main.yml @@ -0,0 +1,12 @@ +name: Run Report Table +on: + schedule: + - cron: '0 21 * * *' # 06:00 KST is 21:00 UTC +jobs: + run-script: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Run script + run: ./run_table.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e06066a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,18 @@ +# Python 3.9 슬림 버전을 기반 이미지로 사용 +FROM python:3.9-slim + +# 작업 디렉토리 설정 +WORKDIR /app + +# 의존성 파일 복사 및 설치 +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# 소스 코드 및 실행 스크립트 복사 +COPY . . + +# 스크립트에 실행 권한 부여 +RUN chmod +x run_text.sh run_table.sh + +# 기본적으로 아무것도 실행하지 않음 (docker-compose에서 커맨드 지정) +CMD ["tail", "-f", "/dev/null"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..294544c --- /dev/null +++ b/README.md @@ -0,0 +1,74 @@ +# Grafana 알림 리포터 + +Grafana, Prometheus, Loki 등에서 수집된 데이터를 기반으로 주기적인 요약 리포트를 생성하고 Mattermost로 전송하는 파이썬 기반 도구입니다. + +## 주요 기능 + +- **데이터 소스 연동**: Grafana, Prometheus, Loki 데이터 소스에서 직접 데이터를 조회합니다. +- **자동 리포트 생성**: 지정된 Grafana 대시보드의 패널 쿼리를 실행하여 데이터를 요약하고 리포트를 생성합니다. +- **다양한 출력 형식**: 텍스트(Text) 및 테이블(Table) 형식의 리포트를 지원합니다. +- **Mattermost 통합**: 생성된 리포트를 지정된 Mattermost 웹훅을 통해 자동으로 전송합니다. +- **유연한 설정**: `.env` 파일을 통해 Grafana URL, API 키, 대시보드 UID 등의 설정을 쉽게 변경할 수 있습니다. + +## 프로젝트 구조 + +``` +. +├── src/ +│ ├── clients/ # Grafana, Loki, Prometheus API 클라이언트 +│ ├── services/ # 리포트 생성, 데이터 요약 등 핵심 비즈니스 로직 +│ ├── setting/ # 환경 변수 및 설정 관리 +│ ├── utils/ # 시간 처리 등 유틸리티 함수 +│ ├── report_table.py # 테이블 형식 리포트 생성 스크립트 +│ └── report_text.py # 텍스트 형식 리포트 생성 스크립트 +├── run_table.sh # 테이블 리포트 실행 스크립트 +├── run_text.sh # 텍스트 리포트 실행 스크립트 +├── requirements.txt # 프로젝트 의존성 +└── .env.example # 환경 변수 설정 예시 파일 +``` + +## 시작하기 + +### 1. 사전 요구사항 + +- Docker +- Docker Compose + +### 2. 설정 + +1. **저장소 복제** + ```bash + git clone + cd grafana_alerts + ``` + +2. **환경 변수 설정** + `.env.example` 파일을 복사하여 `.env` 파일을 생성하고, 파일 내의 변수들을 실제 환경에 맞게 수정합니다. + ```bash + cp .env.example .env + ``` + - `GRAFANA_URL`: 사용하는 Grafana 인스턴스의 URL + - `GRAFANA_API_KEY`: Grafana API에 접근하기 위한 API 키 (Viewer 역할 이상) + - `GRAFANA_DASHBOARD_UID`: 리포트를 생성할 대상 대시보드의 UID + - `MATTERMOST_WEBHOOK`: 리포트를 전송할 Mattermost 채널의 Incoming Webhook URL + +3. **Docker 이미지 빌드** + ```bash + docker compose build + ``` + +### 3. 사용법 + +리포트를 생성하고 Mattermost로 전송하려면 아래의 `docker compose run` 명령어를 사용합니다. + +- **텍스트 형식 리포트 생성** + ```bash + docker compose run --rm reporter ./run_text.sh + ``` + +- **테이블 형식 리포트 생성** + ```bash + docker-compose run --rm reporter ./run_table.sh + ``` + +`--rm` 플래그는 스크립트 실행 후 컨테이너를 자동으로 삭제하는 역할을 합니다. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..19e72c8 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,10 @@ +version: '3.8' + +services: + reporter: + build: . + container_name: grafana_reporter + env_file: + - .env + volumes: + - ./logs:/app/logs diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..df7458c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +requests +python-dotenv diff --git a/run_table.sh b/run_table.sh index 790c23b..6960510 100644 --- a/run_table.sh +++ b/run_table.sh @@ -19,18 +19,6 @@ LOG_FILE="${LOG_DIR}/report_${ABSOLUTE_RANGE}_${TS}.log" echo "[OK] Started background job." echo "[OK] Logging to ${LOG_FILE}" -ABSOLUTE_RANGE=24h # 24h -TS="$(date +%Y%m%d_%H%M%S)" - -LOG_FILE="${LOG_DIR}/report_${ABSOLUTE_RANGE}_${TS}.log" - -(cd src && python3 -m report_table \ - --range "${ABSOLUTE_RANGE}") \ - >> "${LOG_FILE}" 2>&1 & - -echo "[OK] Started background job." -echo "[OK] Logging to ${LOG_FILE}" - # # crontab -e # # 매일 09:00 KST에 지난 24시간 보고 # 0 9 * * * /usr/bin/env bash -lc 'cd /opt/monitor && /usr/bin/python3 grafana_dash_pull_and_alert.py --range 24h' diff --git a/src/report_table.py b/src/report_table.py index ead417b..a9534c3 100644 --- a/src/report_table.py +++ b/src/report_table.py @@ -14,7 +14,7 @@ from services.dashboard import ( from services.reporter import post_mattermost from services.summarizer import compute_total_for_target from setting.config import AppConfig -from utils.timeutils import now_kst, to_epoch +from utils.timeutils import now_kst, step_for_range, to_epoch logging.basicConfig(level=logging.INFO, format="%(message)s") logger = logging.getLogger(__name__) @@ -63,7 +63,7 @@ def main(): step = 21600 # 6시간 - Interval start_epoch, end_epoch = to_epoch(start), to_epoch(now) - # step = step_for_range(end_epoch - start_epoch) + step = step_for_range(end_epoch - start_epoch) # 대시보드에서 패널 추출 dash = gf.get_dashboard_by_uid(cfg.grafana_dashboard_uid)