1. prometheus 是什么
開源的系統監控和報警工具,監控項目的流量、內存量、負載量等實時數據。
它通過直接或短時jobs中介收集監控數據,在本地存儲所有收集到的數據,並且通過定義好的rules產生新的時間序列數據,或發送警報。通過其它api可以將采集到的數據可視化。
2. 怎么實現監控
簡單的說,主要就是以下幾個步驟:
- 配置待監控的各個服務器,在每個服務器
本地
收集並存儲數據。如果采用第三方系統收集數據metrics,且數據不是prometheus時序對,則需要定義exporter將那些metrics export為prometheus時序對。現在有很多已經定義好的官方或第三方的exporters。有些軟件抓取的數據直接就是prometheus格式的。 - 找一台服務器部署prometheus服務。然后修改配置文件,設定監控對象的ip地址和端口等。啟動prometheus,之后prometheus就會用輪詢的方式去各個服務器pull數據。
- 分析數據。prometheus提供了強大的查詢庫,可以定制收集到的數據。prometheus提供了browser的結果呈現,也可以配置使用第三方的數據可視化平台。
部署監控mysql
以一個例子來說明部署流程。
安裝和運行prometheus
有很多種安裝方法,這里我使用預編譯的二進制文件
。到這里下載。之后解壓,terminal中輸入./prometheus
,回車啟動prometheus服務。
監控prometheus自己
打開解壓后的prometheus目錄,發現其中有個prometheus.yml文件。prometheus.yml是設置監控對象等的配置文件。打開prometheus.yml,默認的prometheus.yml的初始配置如下:
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'codelab-monitor'
# 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'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
這里設定監控目標為localhost:9090,即prometheus自己。瀏覽器打開localhost:9090
,就能訪問prometheus提供的可視化界面。localhost:9090/metrics
提供了所有的監控數據信息。其中有一條prometheus_target_interval_length_seconds
,表示真實的數據獲取間隔,在prometheus首頁輸入它並回車,就可以看到一系列的數據,它們有不同quantile,從0.01至0.99不等。quantitle表示有多少比例的數據在這個值以內。如果只關注0.99的數據,可以輸入prometheus_target_interval_length_seconds{quantile="0.99"}
查詢。查詢還支持函數,比如count(prometheus_target_interval_length_seconds)
可 以查詢數量。
如果想要查詢結果直接包含數量那個數據,創建一個prometheus.rules文件,在文件中定義這條規則,然后在prometheus.yml中配置rules文件。
//prometheus.rules
test:prometheus_target_interval_length_seconds:count = count(prometheus_target_interval_length_seconds)
//prometheus.yml
# my global config
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
evaluation_interval: 15s # By default, scrape targets every 15 seconds.
# scrape_timeout is set to the global default (10s).
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'codelab-monitor'
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "prometheus.rules"
# - "second.rules"
# 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'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
之后,就可以直接輸入test:prometheus_target_interval_length_seconds:count
查詢數據了。這里rule比較簡單,如果有一些常用的但比較復雜的數據,都可以用rule的方法來定義獲取。
監控mysql
修改prometheus.yml,在文件最后添加:
- job_name: 'mysql'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9104']
labels:
instance: db1
重啟prometheus服務:
$ ./prometheus -config.file=prometheus.yml
再打開localhost:9090,查看Status
-> Targets
頁面下,就可以看到配置的兩個target:一個是prometheus本身,State
為UP
,另一個是mysql,State
為DOWN
,因為我們還沒有配置監控mysql的服務。
安裝並運行mysql exporter
在在這里下載並解壓mysql exporter,或者直接使用docker:
$ docker pull prom/mysqld-exporter
mysqld_exporter需要連接到mysql,需要mysql的權限,需要先為他創建用戶並賦予所需的權限:
CREATE USER 'mysqlexporter'@'localhost' IDENTIFIED BY 'msyqlexporter';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost'
WITH MAX_USER_CONNECTIONS 3;
然后在docker中運行exporter,其中DATA_SOURCE_NAME是環境變量,用於連接數據庫。
$ docker run -d \
-p 9104:9104 \
-e DATA_SOURCE_NAME="mysqlexporter:mysqlexporter@(localhost:3306)/data_store" prom/mysqld-exporter
此時再刷下localhost:9090/targets
,就可以看到mysql的state
轉為UP
,即已經成功的監測了mysql。
總結
核心的幾個點:
- 數據收集
- 通過中介網關支持短時間序列數據收集
- 通過http pull的形式采集時間序列
- 可以通過自定義的rules產生新的時間數據系列(即定義一個rule,這個rule可能以已有的監控數據為輸入,計算之后得到加工后的監控數據。加入該監控規則后,再監控時就能直接拿到這個加工后的數據了),例如官網的這個例子。
- 監控目標:服務發現/靜態配置。基於服務收集數據,而不是基於服務器收集數據。
- 數據存儲
- 不依賴分布式存儲,單個服務器節點工作
- 多維度數據模型(鍵值對確定的時間序列模型),解決了分布式存儲的問題。就是說你的項目是分布在多個容器(例如每個服務器有一個容器)中,要獲得整個項目的數據,需要監控這所有的容器。可以利用cAdvisor等從每個容器中拿數據,這樣得到的數據是分散的,然后采用多維度數據模型配合查詢語法就可以查到整個項目的流量數據。
- 數據查詢
- 靈活的查詢語言來利用上述維度數據模型
- 數據展示
- 各種展示面板:expression browser(無需配置)、Grafana等
局限和適用
局限:
- 單機缺點。因為它是以單個服務器節點工作為基礎的,因此每個節點要存儲監控數據,那么每個節點的監控數據量就會受限於存儲空間。
- 內存占用量大(可以配置改善)。因為集成了leveldb(高效插入數據的數據庫),在ssd盤下io占用高。
適用於監控所有時間序列的項目。