告警規則

告警規則允許您基於 Prometheus 表示式語言的表示式來定義告警條件,並將關於觸發告警的通知傳送給外部服務。每當在給定時間點告警表示式產生一個或多個向量元素時,該告警就會被視為針對這些元素的標籤集處於活動(active)狀態。

定義告警規則

在 Prometheus 中,告警規則的配置方式與記錄規則相同。

一個包含告警的規則檔案示例如下

groups:
- name: example
  labels:
    team: myteam
  rules:
  - alert: HighRequestLatency
    expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5
    for: 10m
    keep_firing_for: 5m
    labels:
      severity: page
    annotations:
      summary: High request latency

可選的 for 子句會使 Prometheus 在首次遇到新的表示式輸出向量元素,與將此元素的告警計為“觸發(firing)”之間等待一定的持續時間。在這種情況下,Prometheus 將在每次評估期間檢查該告警是否在 10 分鐘內持續處於活動(active)狀態,然後才會觸發該告警。處於活動狀態但尚未觸發的元素處於掛起(pending)狀態。不帶 for 子句的告警規則將在第一次評估時變為活動狀態。

還有一個可選的 keep_firing_for 子句,它指示 Prometheus 在最後一次滿足觸發條件後,在指定的持續時間內保持此告警繼續觸發。這可用於防止告警抖動(flapping)、由於資料丟失導致的錯誤恢復等情況。不帶 keep_firing_for 子句的告警規則將在不滿足條件的第一次評估時停用(假設上述任何可選的 for 持續時間已得到滿足)。

labels 子句允許指定一組附加到告警的標籤。任何現有的衝突標籤都將被覆蓋。標籤值可以使用模板。

annotations 子句指定了一組資訊性標籤,可用於儲存更長的附加資訊,例如告警描述或操作手冊(runbook)連結。註釋值可以使用模板。

模板化

標籤和註釋值可以使用控制檯模板進行模板化。$labels 變數儲存告警例項的標籤鍵/值對。配置的外部標籤可以透過 $externalLabels 變數訪問。$value 變數儲存告警例項的評估值。

# To insert a firing element's label values:
{{ $labels.<labelname> }}
# To insert the numeric expression value of the firing element:
{{ $value }}

示例

groups:
- name: example
  rules:

  # Alert for any instance that is unreachable for >5 minutes.
  - alert: InstanceDown
    expr: 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 has a median request latency >1s.
  - alert: APIHighRequestLatency
    expr: api_http_request_latencies_second{quantile="0.5"} > 1
    for: 10m
    annotations:
      summary: "High request latency on {{ $labels.instance }}"
      description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"

在執行時檢查告警

要手動檢查哪些告警處於活動狀態(掛起或觸發),請導航到 Prometheus 例項的 “Alerts(告警)”選項卡。這將為您顯示每個已定義的告警當前處於活動狀態的精確標籤集。

對於掛起和觸發的告警,Prometheus 還會以 ALERTS{alertname="<alert name>", alertstate="<pending or firing>", <additional alert labels>} 的形式儲存合成時間序列。只要告警處於指定的活動(掛起或觸發)狀態,樣本值就會設定為 1,一旦不再處於該狀態,該序列就會被標記為陳舊(stale)。

傳送告警通知

Prometheus 的告警規則擅長查明當前有哪些地方出現故障,但它們並不是一個完整的通知解決方案。需要在簡單的告警定義之上,再加上一層來新增彙總、通知速率限制、靜默和告警依賴。在 Prometheus 生態系統中,Alertmanager 承擔了這一角色。因此,Prometheus 可以配置為定期將有關告警狀態的資訊傳送給 Alertmanager 例項,然後再由後者負責傳送正確的通知。Prometheus 可以透過其服務發現整合進行配置,以自動發現可用的 Alertmanager 例項。

本頁內容