## Alerting rules 警報規則
---
警報規則允許你基于Prometheus表達式語言的表達式定義報警報條件,并在觸發警報時發送通知給外部的接收者。每當警報表達式在給定時間點產生一個或者多個向量元素,這個警報統計活躍的這些元素標簽集。
警報規則在Prometheus系統中用同樣的record rules方式進行配置
### 定義警報規則
警報規則的定義遵循下面的風格:
```
ALERT <alert name>
IF <expression>
[ FOR <duration> ]
[ LABELS <label set> ]
[ ANNOTATIONS <label set> ]
```
`FOR`選項語句會使Prometheus服務等待指定的時間, 在第一次遇到新的表達式輸出向量元素(如:具有高HTTP錯誤率的實例)之間,并將該警報統計為該元素的觸發。如果該元素的活躍的,且尚未觸發,表示正在掛起狀態。
`LABELS`選項語句允許指定額外的標簽列表,把它們附加在警告上。任何已存在的沖突標簽會被重寫。這個標簽值能夠被模板化。
`ANNOTATIONS`選項語句指定了另一組標簽,它們不被當做警告實例的身份標識。它們經常用于存儲額外的信息,例如:警告描述,后者runbook鏈接。這個注釋值能夠被模板化。
### Templating 模板
```
# Alert for any instance that is unreachable for >5 minutes.
ALERT InstanceDown
IF up == 0
FOR 5m
LABELS { severity = "page" }
ANNOTATIONS {
summary = "Instance {{ $labels.instance }} down",
description = "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.",
}
# Alert for any instance that have a median request latency >1s.
ALERT APIHighRequestLatency
IF api_http_request_latencies_second{quantile="0.5"} > 1
FOR 1m
ANNOTATIONS {
summary = "High request latency on {{ $labels.instance }}",
description = "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)",
}
```
### 運行時檢查警告
為了能夠手動檢查哪個警告是活躍的(掛起或者觸發),導航到你的Prometheus服務實例的"Alerts"tab頁面。這個會顯示精確的標簽集合,它們每一個定義的警告都是當前活躍的。
對于掛起和觸發警告,Prometheus也存儲形如`ALERTS{alertname="<alert name>", alertstat=s"pending|firing", <additional alert labels>}`. 只要警告是在指定的活躍(掛起或者觸發)狀態上,這個樣本值設置為1。當一個警告從活躍狀態變成不活躍狀態時,這個樣本值被設置為0。一旦不活躍,這個時間序列將不會再更新。
### 發送警告通知
Prometheus的警告規則擅長確定當前哪個實例有問題。但它們并不是一個完整的通知解決方案。在簡單的警報定義上,需要另一個層來添加總結,通知速率限制,silencing,警報依賴。在Prometheus的生態系統中,Alertmanager發揮了這一作用。因此,Prometheus可能被配置為定期向Alertmanager實例發送有關警報信息,該實例然后負責調用正確的通知,可以通過`-alertmanager.url`命令行標志配置Alertmanager實例。