基於Prometheus和Grafana的監控平臺 - 運維告警

經過前面的文章咱們搭建好了監控環境而且監控了服務器、數據庫、應用,運維人員能夠實時瞭解當前被監控對象的運行狀況,可是他們不可能經過坐在電腦邊上盯着DashBoard來發現服務器或應用異常。java

這就要求咱們須要一個告警功能,當服務器或應用指標異常時發送告警,經過郵件或者短信的形式告訴運維人員及時處理。node

今天咱們就來聊聊 基於Prometheus和Grafana的監控平臺的異常告警功能。linux

告警方式

Grafana

新版本的Grafana已經提供了告警配置,直接在dashboard監控panel中設置告警便可,可是我用事後發現其實並不靈活,不支持變量,並且好多下載的圖表沒法使用告警,因此咱們不選擇使用Grafana告警,而使用Alertmanager。程序員

Alertmanager

相比於Grafana的圖形化界面,Alertmanager須要依靠配置文件實現,配置稍顯繁瑣,可是勝在功能強大靈活。接下來咱們就一步一步實現告警通知。web

告警類型

Alertmanager告警主要使用如下兩種:數據庫

  • 郵件接收器 email_config
  • Webhook接收器 webhook_config,會用post形式向配置的url地址發送以下格式的參數。
 {
 "version""2",
 "status""<resolved|firing>",
 "alerts": [{
   "labels":  < object > ,
   "annotations":  < object > ,
   "startsAt""<rfc3339>",
   "endsAt""<rfc3339>"
   }]
 }

「此次主要使用郵件的方式進行告警。」服務器

實現步驟

  • 下載
    從GitHub上下載最新版本的Alertmanager,將其上傳解壓到服務器上。tar -zxvf alertmanager-0.19.0.linux-amd64.tar.gz微信

  • 配置Alertmanager網絡

vi alertmanager.yml
global:
  resolve_timeout: 5m
  smtp_smarthost: 'mail.163.com:25' #郵箱發送端口
  smtp_from: 'xxx@163.com'
  smtp_auth_username: 'xxx@163.com' #郵箱帳號
  smtp_auth_password: 'xxxxxx' #郵箱密碼
  smtp_require_tls: false
route:
  group_by: ['alertname']
  group_wait: 10s  # 最初即第一次等待多久時間發送一組警報的通知
  group_interval: 10s # 在發送新警報前的等待時間
  repeat_interval: 1h # 發送重複警報的週期 對於email配置中,此項不能夠設置太低,不然將會因爲郵件發送太多頻繁,被smtp服務器拒絕
  receiver: 'email'
receivers:
  - name: 'email'
    email_configs:
    - to: 'xxx@xxx.com'

修改完成後可使用 ./amtool check-config alertmanager.yml校驗文件是否正確。架構

校驗正確後啓動alertmanager。nohup ./alertmanager &。(第一次啓動能夠不使用nohup靜默啓動,方便後面查看日誌)

咱們只定義了一個路由,那就意味着全部由Prometheus產生的告警在發送到Alertmanager以後都會經過名爲 email的receiver接收。實際上,對於不一樣級別的告警,會有不一樣的處理方式,所以在route中,咱們還能夠定義更多的子Route。具體配置規則你們能夠去百度進一步瞭解。

  • 配置Prometheus
    在Prometheus安裝目錄下創建rules文件夾,放置全部的告警規則文件。
alerting:
  alertmanagers:
  - static_configs:
    - targets: ['192.168.249.131:9093']

rule_files:
  - rules/*.yml

在rules文件夾下創建告警規則文件 service_down.yml,當服務器下線時發送郵件。

groups:
 - name: ServiceStatus
   rules:
     - alert: ServiceStatusAlert
       expr: up == 0  
       for: 2m 
       labels:
         team: node
       annotations:
         summary: "Instance {{ $labels.instance }} has bean down"
         description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 2 minutes."
         value: "{{ $value }}"

「配置詳解」

alert:告警規則的名稱。
expr:基於PromQL表達式告警觸發條件,用於計算是否有時間序列知足該條件。
for:評估等待時間,可選參數。用於表示只有當觸發條件持續一段時間後才發送告警。在等待期間新產生告警的狀態爲PENDING,等待期後爲FIRING。
labels:自定義標籤,容許用戶指定要附加到告警上的一組附加標籤。
annotations:用於指定一組附加信息,好比用於描述告警詳細信息的文字等,annotations的內容在告警產生時會一同做爲參數發送到Alertmanager。

配置完成後重啓Prometheus,訪問Prometheus查看告警配置。

  • 測試
    關閉node_exporter,過2分鐘就能夠收到告警郵件啦,截圖以下: Alertmanager的告警內容支持使用模板配置,可使用好看的模板進行渲染,感興趣的能夠試試!

The More

node exporter的一些計算語句

  • CPU使用率(單位爲percent)
    (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
  • 內存已使用(單位爲bytes)
    node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Cached_bytes - node_memory_Buffers_bytes - node_memory_Slab_bytes
  • 內存使用量(單位爲bytes/sec)
    node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Cached_bytes - node_memory_Buffers_bytes - node_memory_Slab_bytes
  • 內存使用率(單位爲percent)
    ((node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Cached_bytes - node_memory_Buffers_bytes - node_memory_Slab_bytes)/node_memory_MemTotal_bytes) * 100
  • server1的內存使用率(單位爲percent)
    ((node_memory_MemTotal_bytes{instance="server1"} - node_memory_MemAvailable_bytes{instance="server1"})/node_memory_MemTotal_bytes{instance="server1"}) * 100
  • server2的磁盤使用率(單位爲percent)
    ((node_filesystem_size_bytes{fstype=~"xfs|ext4",instance="server2"} - node_filesystem_free_bytes{fstype=~"xfs|ext4",instance="server2"}) / node_filesystem_size_bytes{fstype=~"xfs|ext4",instance="server2"}) * 100
  • uptime時間(單位爲seconds)
    time() - node_boot_time
  • server1的uptime時間(單位爲seconds)
    time() - node_boot_time_seconds{instance="server1"}
  • 網絡流出量(單位爲bytes/sec)
    irate(node_network_transmit_bytes_total{device!~"lo|bond[0-9]|cbr[0-9]|veth.*"}[5m]) > 0
  • server1的網絡流出量(單位爲bytes/sec)
    irate(node_network_transmit_bytes_total{instance="server1", device!~"lo|bond[0-9]|cbr[0-9]|veth.*"}[5m]) > 0
  • 網絡流入量(單位爲bytes/sec)
    irate(node_network_receive_bytes_total{device!~"lo|bond[0-9]|cbr[0-9]|veth.*"}[5m]) > 0
  • server1的網絡流入量(單位爲bytes/sec)
    irate(node_network_receive_bytes_total{instance="server1", device!~"lo|bond[0-9]|cbr[0-9]|veth.*"}[5m]) > 0
  • 磁盤讀取速度(單位爲bytes/sec)
    irate(node_disk_read_bytes_total{device=~"sd.*"}[5m])


原創不易,期待您的點贊與轉發!



End




乾貨分享



這裏爲你們準備了一份小小的禮物,關注公衆號,輸入以下代碼,便可得到百度網盤地址,無套路領取!

001:《程序員必讀書籍》
002:《從無到有搭建中小型互聯網公司後臺服務架構與運維架構》
003:《互聯網企業高併發解決方案》
004:《互聯網架構教學視頻》
006:《SpringBoot實現點餐系統》
007:《SpringSecurity實戰視頻》
008:《Hadoop實戰教學視頻》
009:《騰訊2019Techo開發者大會PPT》

010: 微信交流羣






近期熱文top



一、關於JWT Token 自動續期的解決方案

二、SpringBoot開發祕籍-事件異步處理

三、架構師之路-服務器硬件掃盲

四、基於Prometheus和Grafana的監控平臺 - 環境搭建

五、RocketMQ進階 - 事務消息



我就知道你「在看」





本文分享自微信公衆號 - JAVA日知錄(javadaily)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索