開源監控系統Prometheus介紹

我是碼客發表於2019-06-22

前言

Prometheus是CNCF的一個開源專案,Google BorgMon監控系統的開源版本,是一個系統和服務的監控系統。週期性採集metrics指標,匹配規則和展示結果,以及觸發某些條件的告警傳送。

 

特點

Prometheus主要區別於其他監控系統的特點是:

  • 多維度資料模型(時序資料是由指標名字和kv結構的維度定義)
  • 靈活的查詢語言(PromQL)
  • 不依賴分散式儲存。每個server是一個自治的節點。
  • 通過HTTP拉取收集時序資料,同時提供push gateway供使用者主動推送資料,主要用於短生命週期的job。
  • 通過靜態配置或服務發現來發現目標物件
  • 支援多種多樣的出圖和展示方式,例如自帶的Web UI和Grafana等。
  • 支援水平擴容

架構

 

元件

Prometheus生態系統由多個元件組成,其中大部分是可選的元件。

  • Prometheus Server 負責收集和儲存時序資料。提供PromQL查詢語言的支援。
  • Pushgateway 支援短生命週期的任務推送結果資料。
  • Exporter 採集元件的總稱,是Prometheus生態系統中的Agent。
  • Altermanager 處理告警。
  • 客戶端SDK 官方提供的SDK支援的語言由go,java,python等多種語言。

絕大部分Prometheus的元件都是用golang編寫,使得Prometheus 元件容易編譯和部署。(二進位制沒有依賴)

 

工作流程

從架構圖中可以看出,Prometheus Server 週期性的拉取從配置檔案或者服務發現獲取到的目標資料,每個目標需要通過HTTP介面暴露資料。Prometheus Server通過一定的規則彙總和記錄時序資料到本地資料庫。將符合檢測條件的告警資料推送給Altermanager,Altermanager通過配置的通知方式傳送告警。Web UI 或者Grafana通過PromQL查詢Prometheus Server中的資料繪圖展示。

 

適用的場景

Prometheus在記錄純數字的時序資料方面表現得非常好。既適用於機器的效能資料,也適用於服務的監控資料。對於微服務,Prometheus的多維度收集和查詢語言也是非常強大。

 

不適用的場景

Promethus的價值在於它的可靠性。Prometheus不適用於對統計或分析資料100%準確要求的場景。

 

部署實戰

下面我會通過Docker Compose的方式部署整個Prometheus監控系統和Grafana展示資料。如果對Docker Compose還不熟悉的朋友,可以先檢視我之前的介紹文章

Prometheus的docker-compose.yml基於github的開源倉庫修改。docker-compose.yml內容如下:

version: '3.1'

volumes:
    prometheus_data: {}
    grafana_data: {}

services:

  prometheus:
    image: prom/prometheus:v2.1.0
    volumes:
      - ./prometheus/:/etc/prometheus/
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      - '--web.console.templates=/usr/share/prometheus/consoles'
    ports:
      - 9090:9090
    restart: always

  node-exporter:
    image: prom/node-exporter
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command: 
      - '--path.procfs=/host/proc' 
      - '--path.sysfs=/host/sys'
      - --collector.filesystem.ignored-mount-points
      - "^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)"
    ports:
      - 9100:9100
    restart: always

  alertmanager:
    image: prom/alertmanager
    volumes:
      - ./alertmanager/:/etc/alertmanager/
    ports:
      - 9093:9093
    restart: always
    command:
      - '--config.file=/etc/alertmanager/config.yml'
      - '--storage.path=/alertmanager'

  grafana:
    image: grafana/grafana
    user: "104"
    ports:
      - 3000:3000
    depends_on:
      - prometheus
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning/:/etc/grafana/provisioning/
    env_file:
      - ./grafana/config.monitoring
    restart: always

從上面的docker-compose.yml可以看出,將通過Docker Compose部署Prometheus Server,Altermanager,Grafana,和node exporter。其中node exporter負責採集機器的基礎效能資料,例如CPU,MEM,DISK等等,通過暴露HTTP介面供Prometheus Server拉取資料做資料儲存和清洗。Grafana負責資料的展示。Prometheus通過配置檔案靜態配置獲取node exporter的地址:

 1 $ cat prometheus.yml 
 2 # my global config
 3 global:
 4   scrape_interval:     15s # By default, scrape targets every 15 seconds.
 5   evaluation_interval: 15s # By default, scrape targets every 15 seconds.
 6   # scrape_timeout is set to the global default (10s).
 7 
 8   # Attach these labels to any time series or alerts when communicating with
 9   # external systems (federation, remote storage, Alertmanager).
10   external_labels:
11       monitor: 'my-project'
12 
13 # Load and evaluate rules in this file every 'evaluation_interval' seconds.
14 rule_files:
15   - 'alert.rules'
16   # - "first.rules"
17   # - "second.rules"
18 
19 # alert
20 alerting:
21   alertmanagers:
22   - scheme: http
23     static_configs:
24     - targets:
25       - "alertmanager:9093"
26 
27 # A scrape configuration containing exactly one endpoint to scrape:
28 # Here it's Prometheus itself.
29 scrape_configs:
30   # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
31 
32   - job_name: 'prometheus'
33 
34     # Override the global default and scrape targets from this job every 5 seconds.
35     scrape_interval: 5s
36 
37     static_configs:
38          - targets: ['localhost:9090']
39 
40   - job_name: 'node-exporter'
41 
42     # Override the global default and scrape targets from this job every 5 seconds.
43     scrape_interval: 5s
44     static_configs:
45          - targets: ['node-exporter:9100']

其中40-45行是node-exporter的抓取地址和週期配置。因為Docker Compose會自動做服務地址解析,所以這裡可以直接用node-exporter:9100作為地址。

通過Prometheus 9090埠可以檢視到要採集的目標列表資訊:

通過Grafana可以檢視到node exporter採集上來的資料展示,其中Grafana用的看板模板是https://grafana.com/dashboards/8919

 

總結

文章開始分析了Prometheus開源監控系統的整體架構和特點,然後通過Docker Compose演示了整個系統的搭建。下一篇部落格我將演示用Prometheus提供的Golang SDK從頭開始寫一個Expoter,敬請期待。

 

參考

https://prometheus.io/docs/introduction/overview/ 

相關文章