Prometheus 官網地址 https://prometheus.io/
Prometheus 官網檔案地址 https://prometheus.io/docs/introduction/overview/
Prometheus GitHub地址 https://github.com/prometheus/prometheus
Prometheus是一個開源的系統監控和警報工具包,最初由SoundCloud開發的,社群活躍,2016年加入了雲原生計算基金會成為繼Kubernetes之後的第二個託管專案;普羅米修斯以時間序列資料的形式收集並儲存度量值;大部分模組由Go語言編寫的。最新版本v2.37.0
Prometheus可以通過exporters直接拉取監控指標,或者通過Pushgateway獲取短期任務推播監控資料,資料儲存在Prometheus伺服器端本地,基於儲存時間序列的資料上執行分析、聚合、生成警報。可以使用Grafana或其他API消費者對收集的資料進行視覺化。普羅米修斯可以很好地記錄任何純數位的時間序列,它既適合以機器為中心的監視,也適合高度動態的面向服務的體系結構的監視,特別擅長於微服務和容器下多維資料收集和查詢。也適合對可靠性要求高場景,每個Prometheus伺服器都是獨立的,不依賴於網路儲存或其他遠端服務。
從根本上說,Prometheus將所有資料儲存為時間序列:帶有時間戳的資料流屬於同一度量標準和同一組標記維度。除了儲存的時間序列,Prometheus還可以生成臨時的派生時間序列作為查詢的結果。
在Prometheus術語中,可以抓取的端點稱為範例,通常對應於單個程序。具有相同目的的範例集合,例如為了可伸縮性或可靠性而複製的程序,稱為作業。
例如一個有四個複製範例的API伺服器作業
1.2.3.4:5670
1.2.3.4:5671
5.6.7.8:5670
5.6.7.8:5671
自動生成標籤和時間序列,當Prometheus抓取目標時,它會自動在抓取的時間序列上附加一些標籤,用於識別被抓取的目標:
Prometheus監控中,對於採集過來的資料,統一成為metrics資料,metrics已經相信大家都已耳熟,當我們需要為某個系統某個服務做監控、做統計,就需要用到metrics。metrics是一種對採集資料的總稱(metrics並不代表某一種具體的資料格式,是一種對於度量計算單位的抽象)
Prometheus使用者端庫提供了四種核心度量型別;目前僅在使用者端庫(以支援針對特定型別的使用進行客製化的api)和連線協定中區分這些型別。Prometheus伺服器還沒有使用型別資訊,並將所有資料扁平化為無型別的時間序列;常見使用的就是counter、gauges和histogram
Prometheus的查詢提供很多內建的函數,這些函數後續在實戰使用到再說,可以在使用查閱官網檔案說明,比如
# 掛載組態檔方式部署,準備prometheus.yml檔案,可以從二進位制檔案拷貝,預設設定無需修改,或者從github中獲取,這裡暴露埠我改為9080,本機已有9090的服務
docker run \
-p 9080:9090 \
-v /home/commons/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
# 掛載設定目錄方式部署
docker run \
-p 9090:9090 \
-v //home/commons/prometheus/config:/etc/prometheus \
prom/prometheus
檢視docker容器程序
存取http://192.168.50.95:9080/ 出現prometheus的控制檯頁面
# 下載最新版本v2.37.0的prometheus server
wget https://github.com/prometheus/prometheus/releases/download/v2.37.0/prometheus-2.37.0.linux-amd64.tar.gz
# 解壓檔案
tar -xvf prometheus-2.37.0.linux-amd64.tar.gz
# 進入目錄
cd prometheus-2.37.0.linux-amd64
# 後臺執行prometheus server,可通過nohup &之類或後臺執行管理工具如daemonize、screen
nohup ./prometheus > prometheus.log 2>&1 &
預設情況下無需修改prometheus根目錄下的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).
# scrape_interval. 抓取採詳資料的時間間隔,預設每15秒去被監控機上採詳一次,這個就是我們所說的Prometheus的自定義資料採集頻率
# evaluation_interval. 監控資料規則的評估頻率,預設為15秒,這個引數是Prometheus多長時間會進行一次監控規則的評估,假如設定當記憶體使用量 > 70%時,發出報警,這麼一條rule(規則),那麼Prometheus會預設每15秒來執行一次這個規則,檢查記憶體的情況。
# Alertmanager configuration 這個是Alertmanager是Prometheus的一個用於管理和發出報警的外掛
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.
# 在這個Jobs 的名字下面,具體來定義,要被監控的節點,以及節點上具體的埠資訊等等,如果Prometheus配合,例如consul這種服務發現軟體,Prometheus的組態檔,就不在需要人工去手工定義出來,而是能自動發現叢集中,有哪些新機器以及新機器上出現了哪些新服務可以被監控
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"]
存取http://192.168.5.52:9090/ 出現prometheus的控制檯頁面,無賬號密碼驗證(如果希望加上驗證,可以使用apache httpass方式新增)
存取http://192.168.5.52:9090/ 出現prometheus的控制檯頁面,無賬號密碼驗證(如果希望加上驗證,可以使用apache httpass方式新增)
命令列支援引數可以查閱控制檯頁面http://192.168.5.52:9090/flags ,也可以直接通過控制檯頁面查詢prometheus.yml的設定內容
通過上面scrape_configs設定可以知道預設情況下設定了對prometheus的監控,查詢控制檯頁面prometheus的範例節點也是UP狀態
prometheus資料存放在data目錄下,其中長串字母的是歷史資料保留,⽽當前近期資料實際上保留在記憶體中,並且按照⼀定間隔存放在 wal / ⽬錄中防⽌突然斷電或者重啟以⽤來恢復記憶體中的資料。
監控重要性
監控運維基礎⼯作
監控系統設計
監控系統實施總體過程
Prometheus主要有兩種方式採集:pull 主動拉取的形式和push 被動推播的形式。
pull : 指的是使用者端(被監控機器)先安裝各類已有exporters(由社群組織或企業開發的監控使用者端外掛)在系統上之後,exporters以守護行程的模式執行,並開始採集資料,exporter本身也是一個http_server可以對http請求作出響應返回資料,Prometheus用pull這種主動拉取的方式(HTTP get)去存取每個節點上exporter並採集回需要的資料。
push: 指的是在使用者端(或伺服器端)安裝官方提供的pushgateway外掛,然後使用我們運維自行開發的各種指令碼,把監控資料組織成K/V的形式metrics形式,傳送給pushgateway之後pushgateway會在推播給Prometheus,這種是一種被動的資料採集模式。
官網提供提供多種獨立常用的exporter,這些exporter分別使用不同的開發語言開發
比如最常用的 node_exporter就非常強大,幾乎可以把Linux系統中和系統自身相關的監控資料全抓出來(很多引數)
# 下載最新版本v1.4.0node_exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.4.0-rc.0/node_exporter-1.4.0-rc.0.linux-amd64.tar.gz
# 解壓
tar -xvf node_exporter-1.4.0-rc.0.linux-amd64.tar.gz
# 進入目錄
cd node_exporter-1.4.0-rc.0.linux-amd64
# 啟動node_exporter
nohup ./node_exporter > node_exporter.log 2>&1 &
node_exporter預設工作在9100埠,可以響應Prometheus_server發過來的HTTP_GET請求,也可以響應其它方式的HTTP_GET請求,測試下請求
執行curl之後,可以看到node_exporter返回了大量的metrics型別的K/V資料,這些返回的K/V資料,其中的Key名稱,可以直接複製到Prometheus的查詢命令列來檢視結果。將剛才node_exporter部署節點的通過檔案設定發現的加入Prometheus的監控中,在Prometheus的prometheus.yml組態檔內scrape_configs設定節點中增加job_name: "node_exporter"的設定資訊
scrape_configs:
- job_name: "node_exporter"
static_configs:
# targets可以並行寫入多個節點,用逗號隔開,機器名或者IP+埠號,埠號:通常用的就是exporter的埠,這裡9100其實是node_exporter的預設埠
- targets: ["192.168.50.95:9100"]
重新啟動prometheus,prometheus就可以通過組態檔識別監控的節點,持續開始採集資料。檢視監控目標頁面已經有加進來的node_exporter節點了
# 先通過http請求檢視剛部署的node_exporter節點的記憶體資訊
curl localhost:9100/metrics | grep node_memory_MemFree
本⾝node_exporter提供的 keys 實在太多了 (因為 都是從Linux系統中的底層各種挖掘資料回來),找到key為node_memory_MemFree_bytes後直接複製在prometheus的Graph頁面中檢視,已經可以看到查詢的資料
還可以切換到圖檢視最近15分鐘的資料曲線趨勢圖
pushgateway 是另⼀種採⽤被動推播的⽅式(⽽不是exporter主動獲取)獲取監控資料的prometheus 外掛,它是可以單獨運⾏在 任何節點上的外掛(並不⼀定要在被監控使用者端),然後通過⽤戶⾃定義開發指令碼把需要監控的資料傳送給pushgateway,然後pushgateway再把資料推播給prometheus server。
pushgateway的安裝以及執行和設定,pushgateway 跟 prometheus和 exporter ⼀樣。
# 下載最新版本v1.4.0node_exporter
wget https://github.com/prometheus/pushgateway/releases/download/v1.4.3/pushgateway-1.4.3.linux-amd64.tar.gz
# 解壓
tar -xvf pushgateway-1.4.3.linux-amd64.tar.gz
# 進入目錄
cd pushgateway-1.4.3.linux-amd64/
# 啟動pushgateway
nohup ./pushgateway > pushgateway.log 2>&1 &
從上面可以看到pushgateway預設的埠為9091,接下來 在prometheus.yml 設定⽂件中, 單獨定義⼀個job設定target 指向到pushgateway運⾏所在的機器名和pushgateway運⾏的埠即可
- job_name: "pushgateway"
static_configs:
# targets可以並行寫入多個節點,用逗號隔開,機器名或者IP+埠號,埠號:通常用的就是pushgateway的埠,這裡9091其實是pushgateway的預設埠
- targets: ["192.168.50.94:9091"]
重新啟動prometheus,檢視監控目標頁面已經有加進來的pushgateway節點了
pushgateway 本⾝是沒有任何抓取監控資料的功能的 它只是被動的等待推播過來,pushgateway 程式設計指令碼的寫法,這裡使⽤shell 編寫的 pushgateway指令碼⽤於抓取 TCP waiting_connection 瞬時數量,編寫monitor.sh如下
#!/bin/bash
instance_name=`hostname -f | cut -d'.' -f1` #本機機器名變數於之後的 標籤
if [ $instance_name == "localhost" ];then # 要求機器名不能是localhost不然標籤就沒有區分了
echo "Must FQDN hostname"
exit 1
fi
# For waitting connections
label="count_netstat_wait_connections" # 定義個新的 key
# 定義1個新的數值 netstat中 wait 的數量,通過Linux命令⾏ 就簡單的獲取到了需要監控的資料 TCP_WAIT數
count_netstat_wait_connections=`netstat -an | grep -i wait | wc -l`
echo "$label : $count_netstat_wait_connections"
# 把 key & value 推播給 pushgatway
echo "$label $count_netstat_wait_connections" | curl --data-binary
@- http://192.168.50.94:9091/metrics/job/pushgateway/instance/$instance_name
如果是每分鐘推播一次則可以結合crontab,如* * * * * sh /home/commons/script/monitor.sh,如果是短於一分鐘也可以shell指令碼通過迴圈使用sleep實現;再到頁面上檢視剛才自定義的key,已經有采集到資料。
其他種類的監控資料我們都可以通過類似的形式直接寫指令碼傳送實現自定義採集。
pushgateway這種⾃定義的採集⽅式⾮常的快速⽽且極其靈活⼏乎不收到任何約束,⾮常希望 使⽤pushgateway來獲取監控資料的,各類的exporters雖然玲琅滿⽬⽽且預設提供的資料很多了已經,⼀般情況下企業中只安裝 node_exporter 和 DB_exporter兩個,其他種類的 監控資料傾向於全部使⽤pushgateway的⽅式採集 (要的就是快速~ 靈活~)。官網在最佳實踐章節也有說明何時使用pushgateway,Pushgateway是一箇中介服務,它允許你從無法抓取的工作中推播指標。
# 通過node_cpu關鍵字檢視關於cpu的監控項
curl localhost:9100/metrics | grep node_cpu
輸入查詢之後,可以看到結果,這個值是CPU各個核各個狀態下從開機開始一直累積下來的CPU使用時間的累計值,但我們理解的CPU應該是使用率,類似百分50%和80%這樣的資料才更好理解。
Prometheus對linux CPU的採集,並不是直接給我們返回一個現成的CPU百分比,而是返回Linux中很底層的cpu時間片,累積數值的咋樣一個資料(我們平時用慣了top/uptime這種簡便的方式看CPU使用率,根本沒有深入理解所謂的CPU使用率在Linux中到底怎麼回事),CPU使用時間包括CPU使用者態使用時間,系統/核心態使用時間,nice值分配使用時間,空閒時間,中斷時間等等。各個CPU狀態的時間單位解如下:
# 編寫數學公式如下,所以說需要理解底層原理和Prometheus對於數學的支援
(1-((sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)) /(sum(increase(node_cpu_seconds_total[1m])) by (instance)))) * 100
Grafana 官網地址 https://grafana.com/
Grafana 官網檔案地址 https://grafana.com/docs/grafana/latest/?pg=oss-graf&plcmt=resources
Grafana GitHub地址 https://github.com/grafana/grafana
Grafana 是⼀款近⼏年新興的開源資料繪圖⼯具平臺預設⽀持如下這麼多種資料來源作為輸⼊,無論它們儲存在哪裡都可以查詢、視覺化、警告和理解您的指標,Grafana可以通過漂亮、靈活的儀表板建立、探索和共用所有的資料。最新版本為9.0.7,由於Grafana有告警功能,因此可以直接Grafana來替換prometheus自身提供的告警系統,這也是目前各大企業最青睞視覺化產品和最佳實踐。
# 下載最新版本v9.0.7的grafana
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.0.7.linux-amd64.tar.gz
# 解壓檔案
tar -xvf grafana-enterprise-9.0.7.linux-amd64.tar.gz
# 進入目錄
cd grafana-9.0.7
# 後臺執行grafana-server,可通過nohup &之類或後臺執行管理工具如daemonize、screen
nohup ./grafana-server > grafana-server.log 2>&1 &
存取grafana預設埠3000,http://192.168.5.52:3000/ 輸入使用者名稱密碼admin/admin ,下一步需要修改密碼後進入主頁面如下
選擇左側面板下面按鈕,然後選擇資料來源,型別為prometheus,輸入url即可
建立一個dashboards,編輯儀表盤,新增圖,選擇資料來源,選擇原始查詢方式,填入前面自定義收集指標count_netstat_wait_connections,執行查詢之後,選擇最近5分鐘的資料,簡單圖就出來了
**本人部落格網站 **IT小神 www.itxiaoshen.com