diff --git a/.gitea/workflows/health_check.yml b/.gitea/workflows/health_check.yml new file mode 100644 index 0000000..f8fafbb --- /dev/null +++ b/.gitea/workflows/health_check.yml @@ -0,0 +1,35 @@ +name: API Health Check + +on: + schedule: + - cron: '* * * * *' + +jobs: + health-check: + runs-on: ubuntu-latest + steps: + - name: Check API Health and Notify on Failure + run: | + success=false + for i in $(seq 1 5); do + response=$(curl -s -o /dev/null -w "%{\http_code}" http://172.16.10.176:8888/health/API) + content=$(curl -s http://172.16.10.176:8888/health/API) + + if [ "$response" -eq 200 ] && echo "$content" | grep -q "ok"; then + echo "API is healthy (Attempt $i)." + success=true + break + else + echo "API health check failed (Attempt $i). HTTP Status: $response, Content: $content" + if [ $i -lt 5 ]; then + sleep 10 # Wait for 10 seconds before retrying + fi + fi + done + + if [ "$success" = "false" ]; then + echo "API health check failed after 5 attempts. Sending notification to Mattermost." + curl -i -X POST -H 'Content-Type: application/json' -d '{"text": "## 🚨 API μƒνƒœ 확인 μ‹€νŒ¨\n**μ—”λ“œν¬μΈνŠΈ:** `http://172.16.10.176:8888/health/API`\n\nAPIκ°€ 5번의 μ‹œλ„μ— μ‘λ‹΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 확인이 ν•„μš”ν•©λ‹ˆλ‹€."}' ${{ secrets.MATTERMOST_WEBHOOK }} + exit 1 + fi + diff --git a/README.md b/README.md index 294544c..3fba5aa 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,17 @@ Grafana, Prometheus, Loki λ“±μ—μ„œ μˆ˜μ§‘λœ 데이터λ₯Ό 기반으둜 μ£ΌκΈ° - **μžλ™ 리포트 생성**: μ§€μ •λœ Grafana λŒ€μ‹œλ³΄λ“œμ˜ νŒ¨λ„ 쿼리λ₯Ό μ‹€ν–‰ν•˜μ—¬ 데이터λ₯Ό μš”μ•½ν•˜κ³  리포트λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. - **λ‹€μ–‘ν•œ 좜λ ₯ ν˜•μ‹**: ν…μŠ€νŠΈ(Text) 및 ν…Œμ΄λΈ”(Table) ν˜•μ‹μ˜ 리포트λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. - **Mattermost 톡합**: μƒμ„±λœ 리포트λ₯Ό μ§€μ •λœ Mattermost 웹훅을 톡해 μžλ™μœΌλ‘œ μ „μ†‘ν•©λ‹ˆλ‹€. +- **API μƒνƒœ 확인**: Gitea μ›Œν¬ν”Œλ‘œμš°λ₯Ό 톡해 주기적으둜 API μƒνƒœλ₯Ό ν™•μΈν•˜κ³  μž₯μ•  λ°œμƒ μ‹œ Mattermost둜 μ•Œλ¦Όμ„ μ „μ†‘ν•©λ‹ˆλ‹€. - **μœ μ—°ν•œ μ„€μ •**: `.env` νŒŒμΌμ„ 톡해 Grafana URL, API ν‚€, λŒ€μ‹œλ³΄λ“œ UID λ“±μ˜ 섀정을 μ‰½κ²Œ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ## ν”„λ‘œμ νŠΈ ꡬ쑰 ``` . +β”œβ”€β”€ .gitea/ +β”‚ └── workflows/ +β”‚ β”œβ”€β”€ main.yml # 주기적으둜 ν…Œμ΄λΈ” 리포트λ₯Ό μƒμ„±ν•˜λŠ” Gitea μ›Œν¬ν”Œλ‘œμš° +β”‚ └── health_check.yml # API μƒνƒœλ₯Ό 주기적으둜 ν™•μΈν•˜λŠ” Gitea μ›Œν¬ν”Œλ‘œμš° β”œβ”€β”€ src/ β”‚ β”œβ”€β”€ clients/ # Grafana, Loki, Prometheus API ν΄λΌμ΄μ–ΈνŠΈ β”‚ β”œβ”€β”€ services/ # 리포트 생성, 데이터 μš”μ•½ λ“± 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 @@ -27,6 +32,34 @@ Grafana, Prometheus, Loki λ“±μ—μ„œ μˆ˜μ§‘λœ 데이터λ₯Ό 기반으둜 μ£ΌκΈ° └── .env.example # ν™˜κ²½ λ³€μˆ˜ μ„€μ • μ˜ˆμ‹œ 파일 ``` +## μžλ™ν™” μ›Œν¬ν”Œλ‘œμš° + +### ν…Œμ΄λΈ” 리포트 생성 (`.gitea/workflows/main.yml`) + +- **λͺ©μ **: μŠ€μΌ€μ€„μ— 따라 μžλ™μœΌλ‘œ ν…Œμ΄λΈ” ν˜•μ‹μ˜ 리포트λ₯Ό μƒμ„±ν•˜κ³  Mattermost둜 μ „μ†‘ν•©λ‹ˆλ‹€. +- **λ™μž‘**: + - 맀일 15:00 UTC (`cron: '0 15 * * *'`)에 μžλ™μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€. + - μ›”μš”μΌμ—λŠ” μ§€λ‚œ 7μΌκ°„μ˜ 데이터λ₯Ό μš”μ•½(`run_table.sh 7d`), κ·Έ μ™Έ μš”μΌμ—λŠ” μ§€λ‚œ 24μ‹œκ°„μ˜ 데이터λ₯Ό μš”μ•½(`run_table.sh 24h`)ν•˜μ—¬ 리포트λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. + - μ‹€ν–‰ λ‘œκ·ΈλŠ” `report-logs`λΌλŠ” μ΄λ¦„μ˜ μ•„ν‹°νŒ©νŠΈλ‘œ μ €μž₯λ˜μ–΄ μ›Œν¬ν”Œλ‘œμš° μ‹€ν–‰ κ²°κ³Όμ—μ„œ λ‹€μš΄λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€. +- **ν•„μˆ˜ μ„€μ •**: + - Gitea μ €μž₯μ†Œμ˜ `Settings > Secrets` 및 `Settings > Actions`에 λ‹€μŒ λ³€μˆ˜λ“€μ΄ λ“±λ‘λ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. + - `GRAFANA_URL` + - `GRAFANA_API_KEY` (Secret) + - `MATTERMOST_WEBHOOK` + - `GRAFANA_DASHBOARD_UID` + +### API μƒνƒœ 확인 (`.gitea/workflows/health_check.yml`) + +- **λͺ©μ **: νŠΉμ • API μ—”λ“œν¬μΈνŠΈ(`http://172.16.10.176:8888/health/API`)κ°€ μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜λŠ”μ§€ 주기적으둜 ν™•μΈν•©λ‹ˆλ‹€. +- **λ™μž‘**: + - 1λΆ„λ§ˆλ‹€ (`cron: '* * * * *'`) μŠ€μΌ€μ€„μ— 따라 μžλ™μœΌλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€. + - `curl` λͺ…령을 톡해 API에 HTTP μš”μ²­μ„ λ³΄λƒ…λ‹ˆλ‹€. + - 응닡이 `200 OK`κ°€ μ•„λ‹ˆκ±°λ‚˜ 응닡 λ‚΄μš©μ— "ok"κ°€ ν¬ν•¨λ˜μ§€ μ•ŠμœΌλ©΄ μ‹€νŒ¨λ‘œ κ°„μ£Όν•©λ‹ˆλ‹€. + - μ‹€νŒ¨ μ‹œ 10초 κ°„κ²©μœΌλ‘œ μ΅œλŒ€ 5λ²ˆκΉŒμ§€ μž¬μ‹œλ„ν•©λ‹ˆλ‹€. + - 5번 연속 μ‹€νŒ¨ν•˜λ©΄ Mattermost둜 μž₯μ•  μ•Œλ¦Ό λ©”μ‹œμ§€λ₯Ό μ „μ†‘ν•©λ‹ˆλ‹€. +- **ν•„μˆ˜ μ„€μ •**: + - Gitea μ €μž₯μ†Œμ˜ `Settings > Secrets`에 `MATTERMOST_WEBHOOK`μ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ Mattermost μ›Ήν›… URL이 λ“±λ‘λ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. + ## μ‹œμž‘ν•˜κΈ° ### 1. 사전 μš”κ΅¬μ‚¬ν•­