Prometheus

citywalk發表於2024-03-13

Prometheus

基本概念

Prometheus 概述

Prometheus 是一個開源的服務監控系統和時序資料庫,其提供了通用的資料模型和快捷資料採集、儲存和查詢介面。它的核心元件 Prometheus server 會定期從靜態配置的監控目標或者基於服務發現自動配置的目標中進行拉取資料,新拉取到的資料會持久化到儲存裝置當中。

每個被監控的主機都可以透過專用的 exporter 程式提供輸出監控資料的介面,它會在目標處收集監控資料,並暴露出一個 HTTP 介面供 Prometheus server 查詢,Prometheus 透過基於 HTTP 的 pull 的方式來週期性的採集資料。 
如果存在告警規則,則抓取到資料之後會根據規則進行計算,滿足告警條件則會生成告警,併傳送到 Alertmanager 完成告警的彙總和分發。
當被監控的目標有主動推送資料的需求時,可以以 Pushgateway 元件進行接收並臨時儲存資料,然後等待 Prometheus server 完成資料的採集。

任何被監控的目標都需要事先納入到監控系統中才能進行時序資料採集、儲存、告警和展示,監控目標可以透過配置資訊以靜態形式指定,也可以讓 Prometheus 透過服務發現的機制進行動態管理。
Prometheus 能夠直接把 API Server 作為服務發現系統使用,進而動態發現和監控叢集中的所有可被監控的物件。


Prometheus 官網地址:https://prometheus.io

Prometheus github 地址:https://github.com/prometheus

TSDB 作為 Prometheus 的儲存引擎完美契合了監控資料的應用場景

●儲存的資料量級十分龐大
●大部分時間都是寫入操作
●寫入操作幾乎是順序新增,大多數時候資料都以時間排序
●很少更新資料,大多數情況在資料被採集到數秒或者數分鐘後就會被寫入資料庫
●刪除操作一般為區塊刪除,選定開始的歷史時間並指定後續的區塊。很少單獨刪除某個時間或者分開的隨機時間的資料
●基本資料大,一般超過記憶體大小。一般選取的只是其一小部分且沒有規律,快取幾乎不起任何作用
●讀操作是十分典型的升序或者降序的順序讀
●高併發的讀操作十分常見

Prometheus 的特點

●多維資料模型:由度量名稱和鍵值對標識的時間序列資料
時間序列資料:按照時間順序記錄系統、裝置狀態變化的資料,每個資料稱為一個樣本;伺服器指標資料、應用程式效能監控資料、網路資料等都是時序資料

●內建時間序列(Time Series)資料庫:Prometheus ;外接的遠端儲存通常會用:InfluxDB、OpenTSDB 等

●promQL 一種靈活的查詢語言,可以利用多維資料完成複雜查詢

●基於 HTTP 的 pull(拉取)方式採集時間序列資料

●同時支援 PushGateway 元件收集資料

●透過靜態配置或服務發現發現目標

●支援作為資料來源接入 Grafana

Prometheus 的生態元件

Prometheus 負責時序型指標資料的採集及儲存,但資料的分析、聚合及直觀展示以及告警等功能並非由 Prometheus Server 所負責。
Prometheus 生態圈中包含了多個元件,其中部分元件可選:
(1)Prometheus server:服務核心元件,採用 pull 方式採集監控資料,透過 http 協議傳輸;儲存時間序列資料;基於“告警規則”生成告警通知。
Prometheus server 由三個部分組成:Retrieval,Storage,PromQL
●Retrieval:負責在活躍的 target 主機上抓取監控指標資料。
●Storage:儲存,主要是把採集到的資料儲存到磁碟中。預設為 15 天。
●PromQL:是 Prometheus 提供的查詢語言模組。

(2)Client Library: 客戶端庫,目的在於為那些期望原生提供 Instrumentation 功能的應用程式提供便捷的開發途徑,用於基於應用程式內建的測量系統。

(3)Exporters:指標暴露器,負責收集不支援內建 Instrumentation 的應用程式或服務的效能指標資料,並透過 HTTP 介面供 Prometheus Server 獲取。
換句話說,Exporter 負責從目標應用程式上採集和聚合原始格式的資料,並轉換或聚合為 Prometheus 格式的指標向外暴露。
常用的 Exporters:
●Node-Exporter:用於收集伺服器節點的物理指標狀態資料,如平均負載、CPU、記憶體、磁碟、網路等資源資訊的指標資料,需要部署到所有運算節點。
指標詳細介紹:https://github.com/prometheus/node_exporter

●mysqld-exporter/nginx-exporter

●Kube-State-Metrics:為 Prometheus 採集 K8S 資源資料的 exporter,透過監聽 APIServer 收集 kubernetes 叢集內資源物件的狀態指標資料,例如 pod、deployment、service 等等。同時它也提供自己的資料,主要是資源採集個數和採集發生的異常次數統計。
需要注意的是 kube-state-metrics 只是簡單的提供一個 metrics 資料,並不會儲存這些指標資料,所以可以使用 Prometheus 來抓取這些資料然後儲存, 主要關注的是業務相關的一些後設資料,比如 Deployment、Pod、副本狀態等;排程了多少個 replicas ?現在可用的有幾個?多少個 Pod 是 running/stopped/terminated 狀態?Pod 重啟了多少次?有多少 job 在執行中。

●cAdvisor:用來監控容器內部使用資源的資訊,比如 CPU、記憶體、網路I/O、磁碟I/O 。

●blackbox-exporter:監控業務容器存活性。

(4)Service Discovery:服務發現,用於動態發現待監控的 Target,Prometheus 支援多種服務發現機制:檔案、DNS、Consul、Kubernetes 等等。 服務發現可透過第三方提供的介面,Prometheus 查詢到需要監控的 Target 列表,然後輪詢這些 Target 獲取監控資料。該元件目前由 Prometheus Server 內建支援

(5)Alertmanager:是一個獨立的告警模組,從 Prometheus server 端接收到 “告警通知” 後,會進行去重、分組,並路由到相應的接收方,發出報警, 常見的接收方式有:電子郵件、釘釘、企業微信等。
Prometheus Server 僅負責生成告警指示,具體的告警行為由另一個獨立的應用程式 AlertManager 負責;告警指示由 Prometheus Server 基於使用者提供的告警規則週期性計算生成,Alertmanager 接收到 Prometheus Server 發來的告警指示後,基於使用者定義的告警路由向告警接收人傳送告警資訊。

(6)Pushgateway:類似一箇中轉站,Prometheus 的 server 端只會使用 pull 方式拉取資料,但是某些節點因為某些原因只能使用 push 方式推送資料, 那麼它就是用來接收 push 而來的資料並暴露給 Prometheus 的 server 拉取的中轉站。
可以理解成目標主機可以上報短期任務的資料到 Pushgateway,然後 Prometheus server 統一從 Pushgateway 拉取資料。

(7)Grafana:是一個跨平臺的開源的度量分析和視覺化工具,可以將採集的資料視覺化的展示,並及時通知給告警接收方。其官方庫中具有豐富的儀表盤外掛。

Prometheus 的工作模式

●Prometheus Server 基於服務發現(Service Discovery)機制或靜態配置獲取要監視的目標(Target),並透過每個目標上的指標 exporter 來採集(Scrape)指標資料;

●Prometheus Server 內建了一個基於檔案的時間序列儲存來持久儲存指標資料,使用者可使用 PromQL 介面來檢索資料,也能夠按需將告警需求發往 Alertmanager 完成告警內容傳送;

●一些短期執行的作業的生命週期過短,難以有效地將必要的指標資料供給到 Server 端,它們一般會採用推送(Push)方式輸出指標資料, Prometheus 藉助於 Pushgateway 接收這些推送的資料,進而由 Server 端進行抓取

Prometheus 的工作流程

1)Prometheus 以 Prometheus Server 為核心,用於收集和儲存時間序列資料。Prometheus Server 從監控目標中透過 pull 方式拉取指標資料,或透過 pushgateway 把採集的資料拉取到 Prometheus server 中。
(2)Prometheus server 把採集到的監控指標資料透過 TSDB 儲存到本地 HDD/SSD 中。
(3)Prometheus 採集的監控指標資料按時間序列儲存,透過配置報警規則,把觸發的告警通知傳送到 Alertmanager。
(4)Alertmanager 透過配置報警接收方,傳送報警到郵件、釘釘或者企業微信等。
(5)Prometheus 自帶的 Web UI 介面提供 PromQL 查詢語言,可查詢監控資料。
(6)Grafana 可接入 Prometheus 資料來源,把監控資料以圖形化形式展示出。

Prometheus 的侷限性

●Prometheus 是一款指標監控系統,不適合儲存事件及日誌等;它更多地展示的是趨勢性的監控,而非精準資料;

●Prometheus 認為只有最近的監控資料才有查詢的需要,其本地儲存的設計初衷只是儲存短期(例如一個月)資料,因而不支援針對大量的歷史資料進行儲存;
若需要儲存長期的歷史資料,建議基於遠端儲存機制將資料儲存於 InfluxDB 或 OpenTSDB 等系統中;

●Prometheus 的叢集機制成熟度不高,可基於 Thanos 或 Cortex 實現 Prometheus 叢集的高可用及聯邦叢集。

部署 Prometheus

cat /usr/local/prometheus/prometheus.yml | grep -v "^#"
global:                    #用於prometheus的全域性配置,比如採集間隔,抓取超時時間等
  scrape_interval: 15s            #採集目標主機監控資料的時間間隔,預設為1m
  evaluation_interval: 15s         #觸發告警生成alert的時間間隔,預設是1m
  # scrape_timeout is set to the global default (10s).
  scrape_timeout: 10s            #資料採集超時時間,預設10s

alerting:                #用於alertmanager例項的配置,支援靜態配置和動態服務發現的機制
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

rule_files:                #用於載入告警規則相關的檔案路徑的配置,可以使用檔名通配機制
  # - "first_rules.yml"
  # - "second_rules.yml"

scrape_configs:            #用於採集時序資料來源的配置
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"        #每個被監控例項的集合用job_name命名,支援靜態配置(static_configs)和動態服務發現的機制(*_sd_configs)

    # metrics_path defaults to '/metrics'
    metrics_path: '/metrics'    #指標資料採集路徑,預設為 /metrics
    # scheme defaults to 'http'.

    static_configs:                #靜態目標配置,固定從某個target拉取資料
      - targets: ["localhost:9090"]

配置系統啟動檔案,啟動 Prometheust

 vim /usr/lib/systemd/system/prometheus.service

[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus/data/ \
--storage.tsdb.retention=15d \
--web.enable-lifecycle
  
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

部署 Exporters

mv node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin/

vim /usr/lib/systemd/system/node_exporter.service

[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--collector.ntp \
--collector.mountstats \
--collector.systemd \
--collector.tcpstat

ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

- job_name: "nodes"
    metrics_path: "/metrics"
    scheme: http
    static_configs:
    - targets:
      - 192.168.19.23:9100
      - 192.168.19.30:9100
      labels:
        from: node_exporter

#重啟prometheus服務

常用的各指標:
●node_cpu_seconds_total
●node_memory_MemTotal_bytes
●node_filesystem_size_bytes{mount_point=PATH}
●node_system_unit_state{name=}
●node_vmstat_pswpin:系統每秒從磁碟讀到記憶體的位元組數
●node_vmstat_pswpout:系統每秒鐘從記憶體寫到磁碟的位元組數

更多指標介紹:https://github.com/prometheus/node_exporter

監控 MySQL 配置

mv mysqld_exporter-0.14.0.linux-amd64/mysqld_exporter /usr/local/bin/

vim /usr/lib/systemd/system/mysqld_exporter.service

[Unit]
Description=mysqld_exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mysqld_exporter --config.my-cnf=/etc/my.cnf

ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

host=localhost
user=exporter
password=abc123

GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost' IDENTIFIED BY 'abc123';

vim /usr/local/prometheus/prometheus.yml


- job_name: "mysqld"
    metrics_path: "/metrics"
    scheme: http
    static_configs:
    - targets:
      - 192.168.19.26:9104
      labels:
        from: mysqld_exporter

curl -X POST http://192.168.19.24:9090/-/reload

監控 Nginx 配置

yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx

./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--add-module=/usr/local/nginx-module-vts


make & make install

vhost_traffic_status_zone;                    
    vhost_traffic_status_filter_by_host on;

server{
 84         vhost_traffic_status off;               #在不想統計流量的 server 區域,可禁用 vhost_    traffic_status
 85         listen 8080;
 86         allow 127.0.0.1;
 87         allow 192.168.19.24;                    #設定為 prometheus 的 ip 地址
 88 
 89         location /nginx-status {
 90             stub_status on;
 91             access_log off;
 92         }
 93 
 94         location /status {
 95             vhost_traffic_status_display;
 96             vhost_traffic_status_display_format html;
 97         }
 98     }

假如 nginx 沒有規範配置 server_name 或者無需進行監控的 server 上,那麼建議在此 vhost 上禁用統計監控功能。否則會出現 127.0.0.1、hostname 等的域名監控資訊。

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

http://192.168.19.29:8080/status

cat > /usr/lib/systemd/system/nginx-exporter.service <<'EOF'
[Unit]
Description=nginx-exporter
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/nginx-vts-exporter -nginx.scrape_uri=http://localhost:8080/status/format/json

ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

- job_name: "nginx"
    metrics_path: "/metrics"
    scheme: http
    static_configs:
    - targets:
      - 192.168.19.29:9913
      labels:
        from: nginx_exporter

部署 Grafana

yum install -y grafana-7.4.0-1.x86_64.rpm

https://grafana.com/grafana/dashboards

總結

市面上常用的監控系統有哪些?
老牌傳統的:Zabbix   Nagios   Cacti
雲原生時代的:Prometheus    夜鶯


Zabbix和Prometheus的區別?如何選擇?
Zabbix:更適用於傳統業務架構的物理機、虛擬機器環境的監控,對容器的支援比較差;資料儲存主要採用的是關係型資料庫,會隨著被監控節點數量的增加,關係型資料庫的壓力也會變大,監控資料的讀寫也會變慢;對大規模叢集監控的效能比Prometheus要弱一些,可適用於單叢集不超過2000臺節點的場景。

Prometheus:還能支援雲環境、K8S容器叢集的監控,是目前容器監控最好的解決方案;資料儲存採用的是時序資料庫,大大的節省儲存空間,還能提升查詢效率;單叢集能支援的節點規模更大,通常超過2000臺節點、業務服務數量大於1000個的時候建議直接上Prometheus。


Prometheus 是一個開源的監控系統 + 時間序列資料庫。資料模型是 時間序列資料,格式為 指標度量名稱{鍵值對標籤集}


Prometheus的主要元件:
prometheus server:是Prometheus服務的核心元件。透過http pull拉取的方式從監控目標採集監控指標資料(時序資料);作為時序資料庫持久化儲存監控指標資料;
                   根據告警規則生成告警統招推送給alertmanager;內建service discovery自動服務發現功能(支援基於檔案、consul、K8S等自動發現方式)

exporter:指標暴露器,用於對原生不支援prometheus直接採集監控指標資料的系統或應用收集監控指標資料並轉換格式供給prometheus server拉取採集
          node-exporter、kube-state-metrics、nginx/mysqld/redis-exporter、cADvisor、blackbox-exporter

alertmanager:接收prometheus server發來的告警通知,負責對告警通知分組、去重,再路由傳送給接收人(支援email、釘釘、企業微信等方式傳送)

pushgateway:作為臨時中轉站,接收一些短期任務或只能push推送資料的任務傳送的監控指標資料,用於臨時儲存監控指標資料並統一供給prometheus server拉取採集

grafana:外接的監控資料展示平臺,接入prometheus的資料來源,透過promQL查詢資料,以圖形化形式展示監控資料


Prometheus工作流程:
1)prometheus server透過http pull拉取的方式從監控目標target(透過exporter或pushgateway暴露的http介面)拉取監控指標資料
2)prometheus server將採集到的監控指標資料透過時序資料庫持久化儲存在本地磁碟或外接儲存中
3)prometheus server將採集到的監控指標資料與本地配置的額告警規則進行計算比對,如果觸發告警則生成告警通知推送給alertmanager
4)alertmanager接收到prometheus server發來的告警通知後,對告警通知分組、去重,再透過email/釘釘/企業微信等方式傳送給接收人
5)prometheus支援原生的web UI或grafana接入prometheus資料來源,透過promQL查詢資料,以圖形化形式展示監控資料


prometheus支援使用influxdb等大型的時序資料庫作為外接遠端儲存,實現長期儲存歷史資料。
          可基於thanos實現prometheus叢集的高可用(主要方式是在K8S上部署,透過邊車模式與prometheus部署在同一個Pod裡共享監控資料)
          還可透過聯邦叢集實現將多個prometheus叢集的資料進行聚合彙總,統一展示和管理


Prometheus資料採集設定
scrape_configs:
- job_name: XXX                #自定義監控任務的名稱
  metrics_path: "/metrics"     #指定獲取監控資料的URL路徑,一般都是 /metrics
  scheme: http                 #指定拉取監控資料的協議,http(預設值) 或 https
  
  #定義靜態配置的監控目標
  static_configs:
  - targets:                    #指定監控目標節點的IP和exporter的埠
    - IP1:exporter埠
    ....
    labels:                     #自定義簡歷目標的標籤
      key: value

相關文章