Prometheus監控系列最佳實踐

Prometheus是繼kubernetes第二個從CNCF中畢業的項目,個人也是非常的喜歡這款通過數據指標發現和預測告警的開源監控平臺,官方的話就不多說了,根據官網的介紹有以下功能,但是有些簡短的概括了你也不一定知道,所以加了一些個人的白話
官方截圖

Prometheus之白話文一段

  • 實現高緯度的數據模型
    • 時間序列數據通過 metric 名和鍵值對來區分,這裏你可以區分多(隔離)環境的監控指標。
    • 所有的 metrics 都可以設置任意的多維標籤,可以自定義添加多個,比如這個服務的監控屬於哪個團隊的。
    • 數據模型更隨意,不需要刻意設置爲以點分隔的字符串;
    • 可以對數據模型進行聚合,切割和切片操作;
    • 支持雙精度浮點類型,標籤可以設爲全 unicode;
      看到這可能你還是不知道啥意思,那就等接下來用到的時候就恍然大悟了...
  • 強大的PromQL語句
    • 支持查詢語句,可以通過PromSQL進行數值之間的比較
    • 可以通過PromSQL內嵌的函數計算指標的變化,比如平均值,增長率等等...
  • 出色的可視化
    • 個人覺得一點都不咋出色,哈哈,還是結合Grafana使用吧,畢竟人家專業啊~
  • 高效的存儲
    • 可以根據需求設置指標數據的存儲天數,也可以持久化存儲,比如通過remotestorageadapter
  • 使用簡單
    • 部署簡單
    • 支持動態發現
    • 支持熱加載
    • 支持配置文件格式檢查
  • 精準的告警
    • 告警指的不是Prometheus,而是Alertmanager
    • 可以設置沉默時間,可以對告警進行分組,可以對告警進行匹配從而決定告警郵件發給哪些負責人
    • 支持多種告警媒介,比如常用的slack,企業微信,釘釘,郵件還有一些國外常用的,你也可以自己定製;
  • 支持多語言客戶端庫
    • 對常見的編程語言都是支持的
  • 擁有豐富的exporter生態
    • 完美的支持常見的中間件,數據庫,主機等等監控
    • 還有一些有時候會被忽略的監控對象比如:證書有效期,域名有效期等等
    • 比如還有jmx,snmp,vmi等等exporter,這些你可以在github.com搜索prometheus exporter看到

上面整那麼多的意思就是除了Zabbix,Prometheus也是沒有什麼不能監控的,甚至做的更簡單,更人性化,但是這裏不會介紹太多Prometheus的指標類型,網上很多,就不想整了,大家可以看一下https://yunlzheng.gitbook.io/prometheus-book/introduction寫的算是很走心了,大部分還是要自己實踐中琢磨到底如何做。

Prometheus之少不了的部署篇

ServerName ServerVersion Functions 配置文件
Promethues v2.12.0 數據處理 prometheus.yaml
influxdb v1.7 監控指標的持久化存儲 influxdb.conf
remotestorageadapter latest 數據遠程轉存適配器
alertmanager v0.19.0 告警管理 config.yml
pushgateway v0.10.0 實現push模式推送指標
grafana v6.0.0 數據的可視化展示平臺 grafana.ini
cadvisor v0.32.0 分析正在運行容器的指標和性能數據
Docker v18.03.0-ce 容器運行時
docker-compose v1.11.2 容器編排工具

但是你可以直接拿來使用和測試,使用docker-compose管理的配置清單,對於還沒有k8s環境的人來說,也算是福音了。docker-compose-monitor-platform.yml:

version: '3.4'
services:
  influxdb:
    image: influxdb:1.7
    command: -config /etc/influxdb/influxdb.conf
    container_name: influxdb
    ports:
      - "8086:8086"
    restart: always
    volumes:
      - /data/influxdb:/var/lib/influxdb
    environment:
      - INFLUXDB_DB=prometheus
      - INFLUXDB_ADMIN_ENABLED=true
      - INFLUXDB_ADMIN_USER=admin
      - INFLUXDB_ADMIN_PASSWORD=admin
      - INFLUXDB_USER=prom
      - INFLUXDB_USER_PASSWORD=prom
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 300M
        reservations:
          cpus: '0.25'
          memory: 200M
  remotestorageadapter:
    image: gavind/prometheus-remote-storage-adapter:1.0
    container_name: prometheus-remote-storage-adapter
    ports:
      - 9201:9201
    environment:
      - INFLUXDB_PW=prom
    restart: always
    command: ['-influxdb-url=http://192.168.0.112:8086', '-influxdb.database=prometheus', '-influxdb.retention-policy=autogen','-influxdb.username=prom']
  alertmanager:
    image: prom/alertmanager:latest
    container_name: alertmanager
    ports:
      - "9093:9093"
    restart: always
    volumes:
      - /opt/alertmanager/config.yml:/etc/alertmanager/config.yml
    command: ['--config.file=/etc/alertmanager/config.yml']
  prometheus:
    image: prom/prometheus:v2.12.0
    container_name: prometheus
    restart: always
    volumes:
      - /opt/prometheus/conf/:/etc/prometheus/
    ports:
      - "9090:9090"
    command: ['--web.external-url=http://192.168.0.112:9090','--config.file=/etc/prometheus/prometheus.yml','--storage.tsdb.path=/prometheus/data','--web.enable-lifecycle','--web.enable-admin-api','--web.console.templates=/prometheus/consoletest','--web.page-title=Prometheues監控平臺',]
  pushgateway:
    container_name: pushgateway
    image: prom/pushgateway:v1.0.0
    restart: always
    ports:
      - "9091:9091"
    command: ['--persistence.file="/pushgateway/data"','--persistence.interval=5m','--web.external-url=http://192.168.0.112:9091','--web.enable-admin-api','--log.format=json','--log.level=info','--web.enable-lifecycle']
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 300M
        reservations:
          cpus: '0.25'
          memory: 200M
  grafana:
    container_name: grafana
    image: grafana/grafana:6.4.0
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - /data/grafana/grafana.ini:/etc/grafana/grafana.ini
      - /data/grafana:/var/lib/grafana
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 300M
        reservations:
          cpus: '0.25'
          memory: 200M
#    user: "104"
  cadvisor:
    image: google/cadvisor:latest
    container_name: cadvisor
    restart: always
    ports:
      - 8080:8080
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro

要注意幾點:

  1. docker-compose-monitor-platform.yml中需要的目錄,你需要創建出來
  2. 配置文件格式我想你是有方法找到的,比如docker cp,比如去官網或者github找
  3. 下面是幾個主要的配置文件,Alertmanager和Prometheus的配置文件

Prometheus之你可以自定義修改的配置文件

prometheus.yml

global:
  scrape_interval:     2m # 設置採集數據指標的時間爲2m, 默認是每1分鐘採集一次,採集的頻率會影響存儲和服務器性能
  evaluation_interval: 15s # 15秒鐘評估一下告警規則,默認是每1分鐘評估一次
  external_labels:
      monitor: 'Prometheues監控平臺'
rule_files:
  - "prom.rules"

alerting:
  alertmanagers:
  - scheme: http
    static_configs:
    - targets: ['192.168.0.112:9093']
scrape_configs:
  - job_name: 'qa-prometheus'
    # 默認的metrics_path標籤值爲: '/metrics'
    # 默認的scheme值爲: 'http'.
    static_configs:
      - targets: ['192.168.0.112:9090']
  - job_name: pushgateway
    static_configs:
      - targets: ['192.168.0.112:9091']
        labels:
          instances: pushgateway
          instanceserver: 192.168.0.112
          honor_labels: true

config.yaml

global:
  resolve_timeout: 1m #該參數定義了當Alertmanager持續多長時間未接收到告警後標記告警狀態爲resolved(已解決),該參數的定義可能會影響到告警恢復通知的接收時間,默認值是5分鐘
  smtp_smarthost: smtp.163.net:465 # 郵箱服務器,注意需要加上端口
  smtp_from: xxx # 發送者郵箱
  smtp_auth_username: xxx # 使用發送者郵箱進行驗證時使用的用戶名
  smtp_auth_password: xxx # 使用發送者郵箱進行驗證時使用的密碼(客戶端授權碼)
  smtp_require_tls: false # 是否需要進行tls驗證
  slack_api_url: 'xxx'

templates:
  - '/etc/alertmanager/template/*.tmpl'
# 所有報警信息進入後的根路由,用來設置報警的分發策略
route: # 主要定義了告警的路由匹配規則,以及Alertmanager需要將匹配到的告警發送給哪一個receiver,【因此這裏詳細設置就能靈活實現通過匹配標籤過濾告警發送到對應的開發owner】
  # 這裏的標籤列表是接收到報警信息後的重新分組標籤,例如,接收到的報警信息裏面有許多具有 cluster=A 和 alertname=LatncyHigh 這樣的標籤的報警信息將會批量被聚合到一個分組裏面
  group_by: ['alertname','cluster']
  # 當一個新的報警分組被創建後,需要等待至少group_wait時間來初始化通知,這種方式可以確保您能有足夠的時間爲同一分組來獲取多個警報,然後一起觸發這個報警信息。
  group_wait: 10s
  # 當第一個報警發送後,等待'group_interval'時間來發送新的一組報警信息。
  group_interval: 5m
  # 如果一個報警信息已經發送成功了,等待'repeat_interval'時間來重新發送他們
  repeat_interval: 4h
  # 默認的receiver:如果一個報警沒有被一個route匹配,則發送給默認的接收器
  receiver: default
  # 上面所有的屬性都由所有子路由繼承,並且可以在每個子路由上進行覆蓋。
  routes:
  - receiver: 'default'
    group_wait: 10s
    continue: true
  - receiver: 'slack'
    group_wait: 10s
    match:
      env: yourenv
    continue: true
inhibit_rules:
- source_match:
   env: yourenv
  target_match:
   env: yourenv
  equal: ['alertname', 'cluster']
receivers:
- name: 'default'
  email_configs:
  - to: 'xxx' # 發送給誰
    send_resolved: true

到這裏,Prometheus監控平臺就基本上部署完成了,接下來就是要看看自己監控哪些服務了,根據自己的監控對象接入到Prometheus中
Prometheus監控系列最佳實踐

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章