# 告警規則

本頁說明 go-web-monitor 何時寄出離線告警、失敗計數如何累積與歸零，以及告警信的內容。

## 失敗計數

每個網站在 `.webMonitor.json` 有一個 `count` 欄位，記錄連續離線次數。每輪檢查後依下表更新（`internal/service/monitor.go:159`）：

| 本輪結果 | 原計數 | 動作 | 新計數 |
|---------|-------|------|-------|
| 上線 | 任意 | 無 | 0 |
| 離線 | 0–3 | 無 | 原計數 + 1 |
| 離線 | 4 | 寄出告警 | 0 |

條件寫法是 `(count+1)%5 == 0`；由於計數在第 5 次時歸零，實際效果是「每累積 5 次連續離線寄一次」。

```mermaid
stateDiagram-v2
    [*] --> Healthy
    Healthy: 上線（count = 0）
    Failing: 離線（count 1–4）
    Healthy --> Failing: 離線
    Failing --> Failing: 離線且 count < 4
    Failing --> Healthy: 上線
    Failing --> Alerted: 第 5 次離線
    Alerted: 寄出告警，count 歸零
    Alerted --> Failing: 仍離線
    Alerted --> Healthy: 上線
```

## 告警頻率

| 情境 | 結果 |
|------|------|
| 網站短暫離線 1–4 分鐘後恢復 | 不寄信 |
| 網站持續離線 | 約第 5、10、15... 分鐘各寄一次 |
| 手動 `refresh` | 也算一輪，會加速累積 |

告警不會在網站恢復上線時寄出「恢復通知」。

## 告警信內容

| 欄位 | 值 |
|------|----|
| 主旨 | `Website Offline Alert: <url>` |
| 格式 | HTML（`Content-Type: text/html; charset=UTF-8`） |
| 內文 | 網址、`Status: Offline`、`Reason: HTTP <code>`、檢查時間 |

`Reason` 中的狀態碼在連線失敗時為 `HTTP 0`。

## 寄送條件

告警以背景 goroutine 呼叫 `SMTP.SendEmail()`，下列任一不成立時不會寄出，錯誤只寫到 stderr（`slog`）：

- `enabled` 為 `true`
- `host` 已設定
- `to` 至少一個收件者

SMTP 的設定方式見 [設定 Email 告警](/zh/smtp-setup)，連線細節見 [SMTP 連線](/zh/smtp-connection)。
