All checks were successful
E2E Health Check / e2e-health (push) Successful in 16s
- ARCHITECTURE_MEMORY: 新增 Service 層架構說明 - ADR-041: 更新 Phase 21 定期報告狀態 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
237 lines
5.6 KiB
Markdown
237 lines
5.6 KiB
Markdown
# ADR-041: 定期報告架構 (Periodic Reporting Architecture)
|
||
|
||
> **狀態**: ✅ 全部完成 (Phase 21.1 + 21.2 + 21.3)
|
||
> **日期**: 2026-03-31 (台北時間)
|
||
> **決策者**: 統帥 (CEO) + Claude Code (首席架構師)
|
||
> **觸發**: K3s 優化成效驗證後,需要定期報告機制
|
||
|
||
---
|
||
|
||
## 背景
|
||
|
||
### 現狀
|
||
|
||
K3s 優化完成後 (告警 -100%, Pod 重啟 -100%, 48h+ 穩定),缺乏定期報告機制:
|
||
|
||
| 問題 | 影響 | 根因 |
|
||
|------|------|------|
|
||
| 無定期健康檢查 | 異常可能延遲發現 | E2E 只在 push 時觸發 |
|
||
| K3s 成效無報告 | 統帥無法掌握叢集狀態 | 缺少摘要機制 |
|
||
| 週報需人工整理 | 耗費時間,可能遺漏 | 無自動化整合 |
|
||
|
||
### 現有元件
|
||
|
||
| 元件 | 位置 | 狀態 |
|
||
|------|------|------|
|
||
| `DailySummaryMessage` | telegram_gateway.py | ✅ 已實作 |
|
||
| `RepairReportMessage` | telegram_gateway.py | ✅ 已實作 |
|
||
| `StatsService` | stats_service.py | ✅ 6 方法 + Redis 快取 |
|
||
| E2E Workflow | e2e-health.yaml | ✅ 缺 schedule |
|
||
| Prometheus | kube-state-metrics | ✅ :30888 |
|
||
|
||
---
|
||
|
||
## 決策
|
||
|
||
### 採用 Phase 21 三階段架構
|
||
|
||
```
|
||
Phase 21: Periodic Reporting
|
||
├── 21.1 Daily E2E Schedule (P0 - 15min)
|
||
├── 21.2 K3s Status Telegram Report (P1 - 2h)
|
||
└── 21.3 Weekly Report Automation (P2 - 2-4h)
|
||
```
|
||
|
||
### 21.1 Daily E2E Schedule
|
||
|
||
**變更**: `.gitea/workflows/e2e-health.yaml`
|
||
|
||
```yaml
|
||
on:
|
||
push:
|
||
branches: [main]
|
||
workflow_dispatch:
|
||
schedule:
|
||
- cron: '0 16 * * *' # 每日 00:00 台北 (UTC+8)
|
||
```
|
||
|
||
**觸發機制**: Gitea 內建 schedule
|
||
|
||
### 21.2 K3s Status Telegram Report
|
||
|
||
**新增元件**:
|
||
|
||
```python
|
||
# k3s_monitor_service.py
|
||
class K3sMonitorService:
|
||
async def collect_cluster_status() -> K3sStatusMessage
|
||
async def send_daily_report() -> bool
|
||
|
||
# k3s_status.py
|
||
@dataclass
|
||
class K3sStatusMessage:
|
||
node_total: int
|
||
node_ready: int
|
||
pod_total: int
|
||
pod_running: int
|
||
hpa_status: dict
|
||
etcd_backup_last: str
|
||
velero_backup_last: str
|
||
alert_count_48h: int
|
||
```
|
||
|
||
**數據來源**: Prometheus (kube-state-metrics) + kubectl (fallback)
|
||
|
||
**排程**: K8s CronJob (每日 09:00 台北)
|
||
|
||
### 21.3 Weekly Report Automation
|
||
|
||
**選項 A (推薦): Telegram Only**
|
||
|
||
```python
|
||
@dataclass
|
||
class WeeklyReportMessage:
|
||
week_range: str # "2026-W14"
|
||
# 告警統計 (from StatsService)
|
||
alert_total: int
|
||
alert_critical: int
|
||
resolved_rate: float
|
||
# AI 效能
|
||
ai_proposal_count: int
|
||
ai_success_rate: float
|
||
# K3s 健康 (from K3sMonitorService)
|
||
k3s_uptime: str
|
||
hpa_scale_events: int
|
||
# Git 活動
|
||
commits_count: int
|
||
deploy_count: int
|
||
# 成本
|
||
ai_cost_week: float
|
||
```
|
||
|
||
**排程**: K8s CronJob (每週五 18:00 台北)
|
||
|
||
---
|
||
|
||
## 理由
|
||
|
||
### 為什麼三階段?
|
||
|
||
| 原則 | 說明 |
|
||
|------|------|
|
||
| **漸進式** | 由簡到繁,逐步驗證 |
|
||
| **復用最大化** | 70%+ 使用現有元件 |
|
||
| **風險控制** | 每階段獨立驗證 |
|
||
|
||
### 為什麼 Telegram 優先?
|
||
|
||
| 比較 | Telegram | Email |
|
||
|------|----------|-------|
|
||
| 實時性 | ✅ 即時推送 | ❌ 可能延遲 |
|
||
| 互動性 | ✅ 可加按鈕 | ❌ 被動 |
|
||
| 實作成本 | ✅ 已有 Gateway | ❌ 需新增 SMTP |
|
||
| 歸檔 | ⚠️ 需另存 | ✅ 自然歸檔 |
|
||
|
||
### 為什麼 CronJob 而非 APScheduler?
|
||
|
||
| 比較 | K8s CronJob | APScheduler |
|
||
|------|-------------|-------------|
|
||
| 可靠性 | ✅ 叢集管理 | ⚠️ 依賴單 Pod |
|
||
| 監控 | ✅ kubectl 可見 | ❌ 需自建 |
|
||
| 故障恢復 | ✅ 自動重試 | ❌ 需手動 |
|
||
| 符合 ADR-033 | ✅ K3s 原生 | ❌ 應用層 |
|
||
|
||
---
|
||
|
||
## 後果
|
||
|
||
### 優點
|
||
|
||
- ✅ 自動化健康監控,異常早發現
|
||
- ✅ 統帥每日掌握 K3s 狀態
|
||
- ✅ 週報自動生成,節省時間
|
||
- ✅ 復用現有 70%+ 元件
|
||
|
||
### 缺點
|
||
|
||
- ⚠️ 新增 K8s CronJob 需維護
|
||
- ⚠️ Telegram 歸檔需另行處理
|
||
- ⚠️ 報告格式調整需改代碼
|
||
|
||
### 風險
|
||
|
||
| 風險 | 機率 | 緩解 |
|
||
|------|------|------|
|
||
| Prometheus 不穩定 | 低 | kubectl fallback |
|
||
| CronJob 延遲 | 低 | 監控 Job 狀態 |
|
||
| Telegram Rate Limit | 低 | 已有去重機制 |
|
||
|
||
---
|
||
|
||
## 實施計畫
|
||
|
||
### 工時預估
|
||
|
||
| Phase | 工時 | 依賴 |
|
||
|-------|------|------|
|
||
| 21.1 Daily E2E | 15 min | 無 |
|
||
| 21.2 K3s Report | 2h | 21.1 |
|
||
| 21.3 Weekly Report | 2h (A) / 4h (B) | 21.1, 21.2 |
|
||
| **總計** | **4h 15min** | - |
|
||
|
||
### 驗收標準
|
||
|
||
#### 21.1 完成標準
|
||
|
||
```bash
|
||
# Gitea 顯示 scheduled run
|
||
curl -s http://192.168.0.110:3001/api/v1/repos/.../actions/runs
|
||
|
||
# 00:00 台北自動執行
|
||
# (查看 Gitea Actions 執行紀錄)
|
||
```
|
||
|
||
#### 21.2 完成標準
|
||
|
||
```bash
|
||
# Telegram 收到 K3s 報告
|
||
# (每日 09:00 台北)
|
||
|
||
# CronJob 狀態
|
||
kubectl get cronjob k3s-status-report -n awoooi-prod
|
||
```
|
||
|
||
#### 21.3 完成標準
|
||
|
||
```bash
|
||
# Telegram 收到週報
|
||
# (每週五 18:00 台北)
|
||
|
||
# CronJob 狀態
|
||
kubectl get cronjob weekly-report -n awoooi-prod
|
||
```
|
||
|
||
---
|
||
|
||
## 關聯文件
|
||
|
||
| 文件 | 用途 |
|
||
|------|------|
|
||
| `memory/project_periodic_reporting_plan.md` | 詳細計畫 |
|
||
| `memory/project_k3s_optimization_metrics.md` | K3s 成效數據 |
|
||
| `docs/adr/ADR-033-k3s-ha-architecture.md` | K3s HA 架構 |
|
||
| `docs/adr/ADR-037-monitoring-enhancement-architecture.md` | 監控增強 |
|
||
| `apps/api/src/services/telegram_gateway.py` | 訊息模板 |
|
||
| `apps/api/src/services/stats_service.py` | 統計服務 |
|
||
|
||
---
|
||
|
||
## 變更紀錄
|
||
|
||
| 版本 | 日期 | 執行者 | 變更內容 |
|
||
|------|------|--------|----------|
|
||
| 1.0 | 2026-03-31 | Claude Code | 初始提案 |
|
||
| 1.1 | 2026-03-31 | Claude Code | **Phase 21.1 完成** (Commit f2aa9a7) |
|
||
| 1.2 | 2026-03-31 | Claude Code | **Phase 21.2 完成** (Commit b2e41eb) |
|
||
| 1.3 | 2026-03-31 | Claude Code | **Phase 21.3 完成** (Commit 723e8ef) - **全部完成!** |
|