git action clone 추가

This commit is contained in:
kyy
2025-09-04 15:35:13 +09:00
parent df860fc701
commit f1f82aa1eb
8 changed files with 125 additions and 14 deletions

7
.env.example Normal file
View File

@@ -0,0 +1,7 @@
# Grafana 설정
GRAFANA_URL=http://localhost:3000
GRAFANA_API_KEY=
GRAFANA_DASHBOARD_UID=
# Mattermost 설정 (리포트 전송용)
MATTERMOST_WEBHOOK=

12
.gitea/workflows/main.yml Normal file
View File

@@ -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

18
Dockerfile Normal file
View File

@@ -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"]

74
README.md Normal file
View File

@@ -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 <repository_url>
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` 플래그는 스크립트 실행 후 컨테이너를 자동으로 삭제하는 역할을 합니다.

10
docker-compose.yml Normal file
View File

@@ -0,0 +1,10 @@
version: '3.8'
services:
reporter:
build: .
container_name: grafana_reporter
env_file:
- .env
volumes:
- ./logs:/app/logs

2
requirements.txt Normal file
View File

@@ -0,0 +1,2 @@
requests
python-dotenv

View File

@@ -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'

View File

@@ -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)