1. 程式人生 > 其它 >Prometheus部署(一)

Prometheus部署(一)

Prometheus部署

Prometheus是最初在SoundCloud上構建的開源系統監視和警報工具包。自2012年成立以來,許多公司和組織都採用了Prometheus,該專案擁有非常活躍的開發人員和使用者社群。Prometheus 於2016年加入了 Cloud Native Computing Foundation,這是繼Kubernetes之後的第二個託管專案。

官網:https://prometheus.io
Exporter是一個採集監控資料並通過Prometheus監控規範對外提供資料的元件,能為Prometheus提供監控的介面。

Exporter將監控資料採集的端點通過HTTP服務的形式暴露給Prometheus Server,Prometheus Server通過訪問該Exporter提供的Endpoint端點,即可獲取到需要採集的監控資料。不同的Exporter負責不同的業務。

Prometheus              開源的系統監控和報警框架,靈感源自Google的Borgmon監控系統

AlertManager            處理由客戶端應用程式(如Prometheus server)傳送的警報。它負責將重複資料刪除,分組和路由到正確的接收者整合,還負責沉默和抑制警報

Node_Exporter           用來監控各節點的資源資訊的exporter,應部署到prometheus監控的所有節點

PushGateway             推送閘道器,用於接收各節點推送的資料並暴露給Prometheus server

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

下載prometheus各元件:

https://prometheus.io/download/

Prometheus介紹

  • prometheus的特點:
1. 多維的資料模型(基於時間序列的Key、Value鍵值對)

2. 靈活的查詢和聚合語言PromQL

3. 提供本地儲存和分散式儲存

4. 通過基於HTTP的Pull模型採集時間序列資料

5. 可利用Pushgateway(Prometheus的可選中介軟體)實現Push模式

6. 可通過動態服務發現或靜態配置發現目標機器

7. 支援多種圖表和資料大盤
  • prometheus的元件:
1. Prometheus server,負責拉取、儲存時間序列資料

2. 客戶端庫(client library),插入應用程式程式碼

3. 推送閘道器(push gateway),支援短暫的任務

4. 特殊型別的exporter,支援如HAProxy,StatsD,Graphite等服務

5. 一個alertmanager處理告警

6. 各種支援工具
  • 架構圖

  • prometheus的使用場景:

prometheus非常適合記錄任何純數字時間序列。它既適合以機器為中心的監視,也適合監視高度動態的面向服務的體系結構。在微服務世界中,它對多維資料收集和查詢的支援是一種特別的優勢。

prometheus的設計旨在提高可靠性,使其成為中斷期間要使用的系統,從而使您能夠快速診斷問題。每個prometheus伺服器都是獨立的,而不依賴於網路儲存或其他遠端服務,當基礎設施部分出現問題時仍然可以使用它。

Prometheus概念

  • 資料模型:

prometheus將所有資料儲存為時間序列:屬於相同 metric名稱和相同標籤組(鍵值對)的時間戳值流。

-metric 和 標籤:

每一個時間序列都是由其 metric名稱和一組標籤(鍵值對)組成唯一標識。

metric名稱代表了被監控系統的一般特徵(如 http_requests_total代表接收到的HTTP請求總數)。它可能包含ASCII字母和數字,以及下劃線和冒號,它必須匹配正則表示式[a-zA-Z_:][a-zA-Z0-9_:]*。

注意:冒號是為使用者定義的記錄規則保留的,不應該被exporter使用。

標籤給prometheus建立了多維度資料模型:對於相同的 metric名稱,標籤的任何組合都可以標識該 metric的特定維度例項(例如:所有使用POST方法到 /api/tracks 介面的HTTP請求)。查詢語言會基於這些維度進行過濾和聚合。更改任何標籤值,包括新增或刪除標籤,都會建立一個新的時間序列。

標籤名稱可能包含ASCII字母、數字和下劃線,它必須匹配正則表示式[a-zA-Z_][a-zA-Z0-9_]*。另外,以雙下劃線__開頭的標籤名稱僅供內部使用。

標籤值可以包含任何Unicode字元。標籤值為空的標籤被認為是不存在的標籤。

  • 表示法:

給定 metric名稱和一組標籤,通常使用以下表示法標識時間序列:
<metric name>{<label name>=<label value>, ...}
例如,一個時間序列的 metric名稱是 api_http_requests_total,標籤是 method="POST" 和 handler="/messages"。可以這樣寫:
api_http_requests_total{method="POST", handler="/messages"}
這和OpenTSDB的表示法是一樣的。

  • metric型別:
Counter             值只能單調增加或重啟時歸零,可以用來表示處理的請求數、完成的任務數、出現的錯誤數量等

Gauge               值可以任意增加或減少,可以用來測量溫度、當前記憶體使用等

Histogram           取樣觀測結果,一般用來請求持續時間或響應大小,並在一個可配置的分佈區間(bucket)內計算這些結果,提供所有觀測結果的總和
                        
                        累加的 counter,代表觀測區間:<basename>_bucket{le="<upper inclusive bound>"}
                        所有觀測值的總數:<basename>_sum
                        觀測的事件數量:<basenmae>_count

Summary             取樣觀測結果,一般用來請求持續時間或響應大小,提供觀測次數及所有觀測結果的總和,還可以通過一個滑動的時間視窗計算可分配的分位數
                        觀測的事件流φ-quantiles (0 ≤ φ ≤ 1):<basename>{quantile="φ"}
                        所有觀測值的總和:<basename>_sum
                        觀測的事件數量:<basename>_count
  • 例項與任務:
    在prometheus中,一個可以拉取資料的端點叫做例項(instance),一般等同於一個程序。一組有著同樣目標的例項(例如為彈性或可用性而複製的程序副本)叫做任務(job)。

當prometheus拉取目標時,它會自動新增一些標籤到時間序列中,用於標識被拉取的目標:

job:目標所屬的任務名稱

instance:目標URL中的<host>:<port>部分

如果兩個標籤在被拉取的資料中已經存在,那麼就要看配置選項 honor_labels 的值來決定行為了。

每次對例項的拉取,prometheus會在以下的時間序列中儲存一個樣本(樣本指的是在一個時間序列中特定時間點的一個值):

up{job="<job-name>", instance="<instance-id>"}:如果例項健康(可達),則為 1 ,否則為 0

scrape_duration_seconds{job="<job-name>", instance="<instance-id>"}:拉取的時長

scrape_samples_post_metric_relabeling{job="<job-name>", instance="<instance-id>"}:在 metric relabeling 之後,留存的樣本數量

scrape_samples_scraped{job="<job-name>", instance="<instance-id>"}:目標暴露出的樣本數量

up 時間序列對於例項的可用性監控來說非常有用。

https://blog.csdn.net/miss1181248983/article/details/107112451/

Prometheus部署

全部關閉防火牆和selinux
systemctl stop firewalld && systemctl disable firewalld

  • 下載prometheus:
# wget https://github.com/prometheus/prometheus/releases/download/v2.29.2/prometheus-2.13.1.linux-amd64.tar.gz
wget https://github.com/prometheus/prometheus/releases/download/v2.13.1/prometheus-2.13.1.linux-amd64.tar.gz

tar -zxvf prometheus-2.13.1.linux-amd64.tar.gz
mv prometheus-2.13.1.linux-amd64 prometheus
cd prometheus
vi prometheus.yml
# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']

   #採集node exporter監控資料
  - job_name: 'node'
    static_configs:
    - targets: ['172.16.76.246:9100','172.16.245.197:9100','172.16.245.198:9100','172.16.76.245:9100','172.16.76.243:9100','172.16.76.244:9100','172.16.245.196:9100','172.16.76.247:9100','172.16.76.248:9100','172.16.76.249:9100']
  • 安裝prometheus:
# -M 不要自動建立使用者的登入目錄
useradd  -s /sbin/nologin -M prometheus
mkdir  /opt/prometheus/data -p
chown -R prometheus:prometheus /opt/prometheus/
vi /usr/lib/systemd/system/prometheus.service
# vim /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml --storage.tsdb.path=/opt/prometheus/data
Restart=on-failure
[Install]
WantedBy=multi-user.target
  • 啟動prometheus:
systemctl daemon-reload

systemctl enable prometheus && systemctl start prometheus && systemctl status prometheus
netstat -nltp | grep prometheus

tcp6       0      0 :::9090                 :::*                    LISTEN      27238/prometheus
# 檢視日誌
journalctl -u prometheus -fn 200
  • 瀏覽器訪問:
http://121.40.xxx.xxx:9090/service-discovery
http://121.40.xxx.xxx:9090/targets
http://121.40.xxx.xxx:9090/graph
http://121.40.xxx.xxx:9090/metrics

Prometheus配置