# 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) - **全部完成！** |
