Prometheus是一個(gè)開源的監(jiān)控系統(tǒng)门躯。
一膘掰、監(jiān)控簡介
監(jiān)控不僅僅只是系統(tǒng)的技術(shù)指標(biāo),還可以是業(yè)務(wù)指標(biāo)应狱。確保為客戶提供可靠恰當(dāng)?shù)漠a(chǎn)品质欲。
在生產(chǎn)系統(tǒng)中卧蜓,監(jiān)控是必須的,它應(yīng)該和應(yīng)用程序一起構(gòu)建和部署把敞。幫助我們了解系統(tǒng)的環(huán)境弥奸、進(jìn)行診斷故障、制定容量計(jì)劃奋早,為組織提供系統(tǒng)的性能盛霎、成本和狀態(tài)等信息。
監(jiān)控模式
- 務(wù)必在項(xiàng)目最開始階段就把監(jiān)控考慮進(jìn)去耽装,它和安全性一樣愤炸,都是應(yīng)用的核心功能。
- 根據(jù)服務(wù)價(jià)值設(shè)計(jì)自上而下的監(jiān)控系統(tǒng)是一個(gè)很好的方式掉奄。先是業(yè)務(wù)邏輯规个,再是應(yīng)用程序,最后才是基礎(chǔ)設(shè)施操作系統(tǒng)姓建。
- 需要找準(zhǔn)監(jiān)控項(xiàng)诞仓,及時(shí)發(fā)現(xiàn)錯(cuò)誤
- 通過多樣化的數(shù)據(jù),如查看數(shù)據(jù)窗口等更智能的技術(shù)分析指標(biāo)與閥值
- 增加監(jiān)控的頻率
- 盡可能實(shí)現(xiàn)監(jiān)控系統(tǒng)部署實(shí)施自動(dòng)化
監(jiān)控機(jī)制
- 探針與內(nèi)仕偻谩:監(jiān)控應(yīng)用程序的兩種方法墅拭。
探針:在應(yīng)用程序的外部,查詢應(yīng)用程序的外部特征涣狗。如Nagios谍婉。
內(nèi)适婧丁:查看應(yīng)用程序的內(nèi)部內(nèi)容,經(jīng)過檢測穗熬,返回其狀態(tài)镀迂、內(nèi)部組件等的度量』秸幔可用作健康檢查接口招拙,由監(jiān)控工具收集。 - 拉取與推送:執(zhí)行監(jiān)控檢查的兩種方式措译。
拉缺鸱铩:提取或檢查遠(yuǎn)程應(yīng)用程序。如Prometheus领虹。
推送:應(yīng)用程序發(fā)送事件給監(jiān)控系統(tǒng)接收规哪。
監(jiān)控?cái)?shù)據(jù)類型
- 指標(biāo):軟件和硬件組件屬性的度量。
指標(biāo)類型:測量型Gauge
塌衰、計(jì)數(shù)型Counter
诉稍、直方圖Histogram
- 日志:應(yīng)用程序發(fā)出的事件(通常是文本類型)。
監(jiān)控方法論
- Brendan Gregg的USE方法
主機(jī)級監(jiān)控
USE:使用率最疆、飽和度杯巨、錯(cuò)誤。針對每個(gè)資源(如CPU)努酸,檢查使用率(如CPU使用百分比)服爷、飽和度(如等待CPU的進(jìn)程數(shù))和錯(cuò)誤(如錯(cuò)誤事件的計(jì)數(shù))。 - Google四個(gè)黃金指標(biāo)
應(yīng)用程序級監(jiān)控
延遲(如服務(wù)請求時(shí)間)获诈、流量(如每秒HTTP請求數(shù))仍源、錯(cuò)誤(如響應(yīng)時(shí)間走過30ms的請求視為錯(cuò)誤)、飽和度(如內(nèi)存IO)舔涎。 - RED方法
Rate(你的服務(wù)所服務(wù)的每秒的請求數(shù))笼踩、Errors(每秒失敗的請求數(shù))、Duration(每個(gè)請求所花費(fèi)的時(shí)間亡嫌,用時(shí)間間隔表示)
通知系統(tǒng)
通知系統(tǒng)需要關(guān)注以下幾點(diǎn):
- 通知清晰嚎于、準(zhǔn)確、可操作挟冠。人易讀于购。
- 通知添加上下文,通知應(yīng)包含組件的其他相關(guān)信息圃郊。
- 僅發(fā)送有意義的通知价涝。
二、Prometheus是什么持舆?
Prometheus靈感來自于谷歌的Borgmon色瘩。這由前谷歌SRE Matt T. Proud開發(fā)。Proud加入SoundCloud后逸寓,兩天Julius Volz合作開發(fā)了Prometheus居兆。于2015年1月發(fā)布。
Prometheus主要用于提供近實(shí)時(shí)的竹伸、基于動(dòng)態(tài)云環(huán)境和容器的微服務(wù)泥栖、服務(wù)和應(yīng)用的內(nèi)省監(jiān)控。Prometheus專注于當(dāng)前的事件勋篓,大多數(shù)監(jiān)控查詢和警報(bào)都是從最近(通常為一天內(nèi))的數(shù)據(jù)中生成吧享。
Prometheus通過拉取應(yīng)用程序中暴露的時(shí)間序列數(shù)據(jù)來工作。時(shí)間序列數(shù)據(jù)通常由應(yīng)用程序本身通過客戶端庫或exporter的代理來作為HTTP端點(diǎn)暴露譬嚣。
Prometheus架構(gòu)
Prometheus有一個(gè)推送網(wǎng)關(guān)钢颂,可用于接收少量數(shù)據(jù)。
名詞解釋
endpoint:端點(diǎn)拜银,Prometheus抓取的指標(biāo)來源
target:目標(biāo)殊鞭,定義執(zhí)行抓取所需的信息,如鏈接尼桶,身份驗(yàn)證操灿,抓取方式
job:一組目標(biāo),具有相同角色的目標(biāo)組
監(jiān)控資源服務(wù)發(fā)現(xiàn)
- 用戶提供靜態(tài)資源列表泵督。
- 基于文件的發(fā)現(xiàn)趾盐。例如使用配置管理工具生成在Prometheus中可以自動(dòng)更新的資源列表。
- 自動(dòng)發(fā)現(xiàn)小腊。例如谤碳,查詢consule等數(shù)據(jù)存儲。
聚合和警報(bào)
Prometheus服務(wù)器可以查詢和聚合時(shí)間序列數(shù)據(jù)溢豆,創(chuàng)建規(guī)則來記錄常用的查詢和聚合蜒简。
Prometheus可以定義警報(bào)規(guī)則。為系統(tǒng)配置的在滿足條件時(shí)觸發(fā)警報(bào)的標(biāo)準(zhǔn)漩仙。將警報(bào)從Prometheus推送到警報(bào)管理器(Alertmanager)的單獨(dú)服務(wù)器搓茬。
AlertManager可以管理、整合队他、分發(fā)各種警報(bào)到不同的目的地卷仑。
查詢、可視化
Prometheus提供了一套內(nèi)置查詢語言PromQL麸折、一個(gè)表達(dá)式瀏覽器及瀏覽數(shù)據(jù)的圖形界面锡凝。
Prometheus可以與開源DashBoard Grafana集成,同時(shí)也支持其他的DashBoard垢啼。
為了速度與可靠性窜锯,Prometheus服務(wù)器充分使用內(nèi)存和SSD磁盤
冗余和高可用性
部署Prometheus的高可用模式张肾,可以使用兩個(gè)以上配置相同的Prometheus服務(wù)器來收集時(shí)間序列數(shù)據(jù),并且生成的警報(bào)由Alertmanager集群來處理锚扎。
Prometheus數(shù)據(jù)模型
total_website_visits{site="MegaApp", location="NJ", instance="webserver:9090", job="web"}
- 指標(biāo)名稱:total_website
- 標(biāo)簽:site="MegaApp"等吞瞪,通常都有一個(gè)instance標(biāo)簽和job標(biāo)簽
標(biāo)簽分為兩類:1,插樁標(biāo)簽驾孔;2芍秆,目標(biāo)標(biāo)簽
插樁標(biāo)簽:來自被監(jiān)控的資源
目標(biāo)標(biāo)簽:通常與架構(gòu)相關(guān),由Prometheus在抓取期間和之后添加翠勉。 - 時(shí)間序列由名稱和標(biāo)簽標(biāo)識妖啥,如果在時(shí)間序列中添加或更改標(biāo)簽,Prometheus會(huì)將其視為新的時(shí)間序列对碌。
三荆虱、安裝部署Prometheus
安裝Prometheus
Linux上安裝Prometheus
- 下載Prometheus的二進(jìn)制文件
$ wget https://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz
- 解壓文件到相關(guān)目錄,安裝promtool
$ tar -xzf prometheus-2.14.0.linux-amd64.tar.gz
$ sudo cp prometheus-2.14.0.linux-amd64/prometheus /usr/local/bin/
$ sudo cp prometheus-2.14.0.linux-amd64/promtool /usr/local/bin/
- 執(zhí)行prometheus --version查看版本驗(yàn)證安裝俭缓。
Ansible安裝Promethues
相關(guān)的role路徑為:https://github.com/cloudalchemy/ansible-prometheus克伊。
OpenShift上安裝Prometheus
OpenShift官方部署腳本支持Prometheus的安裝。在OpenShift 3.11部署的時(shí)候华坦,prometheus默認(rèn)是安裝的愿吹,如果要禁止安裝則需將inventory中的配置openshift_cluster_monitoring_operator_install
設(shè)置為false
。
相關(guān)的開源軟件地址為:https://github.com/openshift/cluster-monitoring-operator
配置Prometheus
Prometheus通過YAML文件來配置惜姐。Prometheus的解壓的目錄中自帶有配置文件prometheus.yml犁跪。
global:
scrape_interval: 15s # 應(yīng)用程序或服務(wù)抓取數(shù)據(jù)的時(shí)間間隔,默認(rèn)為1min
evaluation_interval: 15s # Prometheus評估規(guī)則(記錄規(guī)則歹袁、警報(bào)規(guī)則)的頻率坷衍,默認(rèn)為1min
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# 一次性加載規(guī)則,并且每隔evaluation_interval時(shí)間對規(guī)則進(jìn)行評估'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# 指定Prometheus抓取的所有目標(biāo)
# 下面是監(jiān)控Prometheus本身
scrape_configs:
# job名字將會(huì)被加到監(jiān)控的指標(biāo)中`job=<job_name>`
- job_name: 'prometheus'
# metrics_path 默認(rèn)為 '/metrics'
# scheme 默認(rèn)為 'http'.
static_configs:
- targets: ['localhost:9090']
global:全局配置
alerting:設(shè)置Prometheus的警報(bào)条舔。Prometheus支持Alertmanager服務(wù)發(fā)現(xiàn)功能枫耳。
rule_files:指定包含記錄規(guī)則或警報(bào)規(guī)則的文件列表。
scrape_configs:指定Prometheus抓取的所有目標(biāo)孟抗。
運(yùn)行Prometheus
- 將配置文件prometheus.yml移到合適的位置
$ sudo mkdir -p /etc/prometheus
$ sudo cp prometheus.yml /etc/prometheus/
- 運(yùn)行prometheus應(yīng)用
$ prometheus --config.file "/etc/prometheus/prometheus.yml"
- 如果發(fā)生異常迁杨,可以使用promtool來驗(yàn)證配置文件
$ promtool check config prometheus.yml
Checking prometheus.yml
SUCCESS: 0 rule files found
查詢數(shù)據(jù)
- 查看指定指標(biāo)值
go_gc_duration_seconds{quantile="0.5"} 1.6166e-05
- 過濾一些匹配標(biāo)簽
go_gc_duration_seconds{quantile!="0.5"}
- 聚合數(shù)據(jù)求和
sum(promhttp_metric_handler_requests_total) # 求和
- PromQL通過子名by,按特定維度聚合
sum(promhttp_metric_handler_requests_total) by (job)
- 轉(zhuǎn)換成速率
sum(rate(promhttp_metric_handler_requests_total[5m])) by (job)
rate()函數(shù)計(jì)算一定范圍內(nèi)時(shí)間序列的每秒平均增長率凄硼,適合緩慢變化的計(jì)數(shù)器(counter)铅协。
irate()函數(shù)計(jì)算指定時(shí)間范圍內(nèi)的最近兩個(gè)數(shù)據(jù)點(diǎn)來算速率,適合快速變化的計(jì)數(shù)器(counter)摊沉。
rate()與irate()函數(shù)都必須與計(jì)數(shù)器一起使用狐史。
- 增加數(shù)量
increase(promhttp_metric_handler_requests_total[1h])
指標(biāo)1小時(shí)內(nèi)增長的值。
容量規(guī)劃
- 內(nèi)存
通過以下查詢語句查看樣本的收集率。顯示最后一分鐘添加到數(shù)據(jù)庫的每秒樣本率骏全。
rate(prometheus_tsdb_head_samples_appended_total[1m])
查詢收集的指標(biāo)數(shù)量苍柏,通過以下語句
sum(count by (__name__)({__name__-\~"\.\+"}))
每個(gè)樣本大小通常為1到2字節(jié),假設(shè)在12小時(shí)內(nèi)每秒收集100000個(gè)樣本吟温,那么內(nèi)存使用情況為
100000 * 2 bytes * 43200秒 約為 8.64GB內(nèi)存
約為 8.64GB內(nèi)存序仙,還需要考慮查詢與記錄規(guī)則方面內(nèi)存的使用情況突颊。
可以通過查看process_resident_memory_bytes指標(biāo)查看Prometheus進(jìn)程的內(nèi)存使用情況鲁豪。
- 磁盤
默認(rèn)情況下,指標(biāo)會(huì)在本地?cái)?shù)據(jù)庫中存儲15天律秃。具體時(shí)間由命令行選項(xiàng)控制爬橡。
--storage.tsdb.path: 設(shè)置數(shù)據(jù)存儲目錄,默認(rèn)為Prometheus的目錄中棒动。
--storage.tsdb.retention: 設(shè)置時(shí)間序列保留期糙申,默認(rèn)為15天。
建議采用SSD作為時(shí)間序列數(shù)據(jù)庫的磁盤
每秒10萬個(gè)樣本的示例船惨,每個(gè)樣本磁盤上占用約1~2字節(jié)柜裸,保留15天數(shù)據(jù)算,大約需要259GB磁盤粱锐。
四疙挺、監(jiān)控主機(jī)和容器
Prometheus通過使用exporter工具來暴露主機(jī)和應(yīng)用程序的指標(biāo)。常用的exporter列表可在以下網(wǎng)站上查看怜浅。
https://prometheus.io/docs/instrumenting/exporters/
監(jiān)控主機(jī)
Node Exporter 是用GO語言編寫的铐然,收集各種主機(jī)指標(biāo)數(shù)據(jù)(CPU/內(nèi)存/磁盤等)。同時(shí)還有一個(gè)textfile收集器恶座,允許導(dǎo)出靜態(tài)指標(biāo)搀暑。
- 安裝Node Exporter
Node Exporter的下載地址如下:
https://github.com/prometheus/node_exporter
下載并解壓安裝
$ wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
$ tar -xzf node_exporter-*
$ sudo cp node_exporter-*/node_exporter /user/local/bin/
- 配置Node Exporter
node_exporter是通過執(zhí)行命令時(shí)傳入?yún)?shù)來配置。
$ node_exporter --help
默認(rèn)情況下node_exporter在端口9100上運(yùn)行跨琳,路徑為/metrics自点。可通過--web.listen-address和--web.telemetry-path來設(shè)置
$ node_exporter --web.listen-address=":9600" --web.telemetry-path="/node_metrics"
同時(shí)可以通過參數(shù)控制啟動(dòng)的收集器脉让,默認(rèn)的收集器可在以下地址中查看
https://github.com/prometheus/node_exporter#enabled-by-default
例如桂敛,想要禁用/proc/net/arp統(tǒng)計(jì)信息,只需要啟動(dòng)node_exporter時(shí)添加--no-collector.arp
配置項(xiàng)侠鳄。
- 配置textfile收集器
textfile收集器可以幫助我們暴露自定義指標(biāo)埠啃。node_exporter通過參數(shù)--collector.textfile.directory
參數(shù)指定textfile的目錄,它會(huì)掃描該目錄下的所有文件伟恶,提取所有格式為Prometheus指標(biāo)的字符串碴开,然后暴露它們。
$ mkdir -p /var/lib/node_exporter/textfile_collector
$ echo 'metadata{role="docker_server", datacenter="NJ"} 1' | sudo tee /var/lib/node_exporter/textfile_collector/metadata.prom
- 啟用systemd收集器
systemd收集器記錄systemd中的服務(wù)和系統(tǒng)狀態(tài)。首先需要通過參數(shù)--collector.systemd
啟用該收集器潦牛,同時(shí)如果不希望收集所有的服務(wù)眶掌,只收集部分關(guān)鍵服務(wù)。node_exporter在啟動(dòng)時(shí)可以使用--collector.systemd.unit-whitelist
參數(shù)配置巴碗。 - 運(yùn)行Node Exporter
啟動(dòng)node_exporter的實(shí)例
$ node_exporter --collector.textfile.director /var/lib/node_exporter/textfile_collector --collector.systemd --collector.systemd.unit-whitelist-{(docker|ssh|rsyslog).service"
- 抓取Node Exporter
配置新作業(yè)來抓取Node Exporter導(dǎo)出的數(shù)據(jù)朴爬。prometheus.yml文件中的scrape_configs部分添加job
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['192.168.0.3:9100', '192.168.0.4:9100', '192.168.0.5:9100']
添加了新的job 'node',添加了三臺主機(jī)的node_exporter監(jiān)控橡淆,默認(rèn)路徑為/metrics召噩。
重啟Prometheus服務(wù),將會(huì)加載最新的配置逸爵,新監(jiān)控項(xiàng)將會(huì)被收集到prometheus數(shù)據(jù)中具滴。
- 過濾收集器
Prometheus提供了限制抓取過來的數(shù)據(jù)指標(biāo)的機(jī)制。使用params塊中的collect[]來指定收集的指標(biāo)师倔。
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['192.168.0.3:9100', '192.168.0.4:9100', '192.168.0.5:9100']
params:
collect[]:
- cpu
- meminfo
- diskstats
- netdev
- netstat
- filefd
- filesystem
- xfs
- systemd
使用以下命令來模擬測試
$ curl -g -X GET http://192.168.0.3:9100/metrics?collect[]=cpu
監(jiān)控Docker容器
推薦使用Google的cAdvisor工具來監(jiān)控Docker构韵。cAdvisor作為Docker容器運(yùn)行,單個(gè)cAdvisor容器返回針對Docker守護(hù)進(jìn)程和所有正在運(yùn)行的容器的指標(biāo)趋艘。
- 運(yùn)行cAdvisor
$ docker run \
-v /:/rootfs:ro \
-v /var/run:/var/run:rw \
-v /sys:/sys:ro \
-v /var/lib/docker/:/var/lib/docker:ro \
-v /dev/disk/:/dev/disk:ro \
-p 8080:8080 \
-d --name=cadvisor \
google/cadvisor:latest
通過瀏覽器訪問http://192.168.0.3:8080/containers/可查看
通過瀏覽器訪問http://192.168.0.3:8080/metrics查看暴露的內(nèi)置Prometheus指標(biāo)
- 抓取cAdvisor
配置新作業(yè)來抓取cAdvisor導(dǎo)出的數(shù)據(jù)疲恢。prometheus.yml文件中的scrape_configs部分添加job
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['192.168.0.3:9100', '192.168.0.4:9100', '192.168.0.5:9100']
- job_name: 'docker'
static_configs:
- targets: ['192.168.0.3:8080', '192.168.0.4:8080', '192.168.0.5:8080']
添加了新的job 'docker',添加了三臺主機(jī)的node_exporter監(jiān)控瓷胧,默認(rèn)路徑為/metrics显拳。
Prometheus抓取數(shù)據(jù)的生命周期
可以看到在Prometheus抓取數(shù)據(jù)的生命周期中,有兩處重新標(biāo)記指標(biāo)的部分抖单,一個(gè)在抓取前萎攒,一個(gè)是在抓取后。
標(biāo)簽
標(biāo)簽提供了時(shí)間序列的維度矛绘,可以定義目標(biāo)耍休,并為時(shí)間序列提供上下文。最重要的是货矮,結(jié)合指標(biāo)名稱羊精,它們構(gòu)成了時(shí)間序列的標(biāo)識。
更改或者添加標(biāo)簽會(huì)創(chuàng)建新的時(shí)間序列
- 標(biāo)簽分類:拓?fù)錁?biāo)簽囚玫、模式標(biāo)簽
拓?fù)錁?biāo)簽:通過其物理或者邏輯組成來切割服務(wù)組件喧锦。每個(gè)指標(biāo)都天然帶著job和instance兩個(gè)拓?fù)錁?biāo)簽。instance標(biāo)簽可以標(biāo)識目標(biāo)抓督,通常是目標(biāo)的IP地址和端口燃少,并且來自address標(biāo)簽。
模式標(biāo)簽:url铃在、error_code或者user之類阵具,允許將拓?fù)渲型患墑e的時(shí)間序列匹配在一起碍遍。
如果需要添加額外的標(biāo)簽,可以考慮以下的層次結(jié)構(gòu)
- 重新標(biāo)記
控制標(biāo)簽阳液。有兩個(gè)階段可以重新標(biāo)記標(biāo)簽怕敬。抓取前的relabel_configs和抓取后的metric_relabel_configs模式。
- 刪除不必要的指標(biāo)
- 從指標(biāo)中刪除敏感或不需要的標(biāo)簽
- 添加帘皿、編輯东跪、修改指標(biāo)的標(biāo)簽值或標(biāo)簽格式
在拉取了cAdvisor的指標(biāo)數(shù)據(jù)后,刪除
container_tasks_state
與container_memory_failures_total
指標(biāo)數(shù)據(jù)
- job_name: 'docker'
static_configs:
- targets: ['192.168.0.3:8080', '192.168.0.4:8080', '192.168.0.5:8080']
metric_relabel_configs:
- source_labels: [__name__]
separator: ';'
regex: '(container_tasks_state|container_memory_failures_total)'
action: drop
separator默認(rèn)值為';'鹰溜,多個(gè)標(biāo)簽通過separator連接在一起虽填。
如果指定多個(gè)源標(biāo)簽,可以使用奉狈;隔開每個(gè)正則表達(dá)式卤唉。
action: drop將會(huì)在數(shù)據(jù)存儲之前刪除指標(biāo)涩惑,keep則會(huì)保留與正則匹配的指標(biāo)仁期,刪除所有其他指標(biāo)。
正則配置id指標(biāo)中的數(shù)據(jù)竭恬,并將匹配的值放入新的標(biāo)簽container_id中跛蛋。
- job_name: 'docker'
static_configs:
- targets: ['192.168.0.3:8080', '192.168.0.4:8080', '192.168.0.5:8080']
metric_relabel_configs:
- source_labels: [id]
regex: '/docker/([a-z0-9]+);'
replacement: '$1'
target_label: container_id
沒有指定action操作,因?yàn)閙etric_relabel_configs的action默認(rèn)操作為replace痊硕。
honor_labels默認(rèn)值為false赊级,如果target_label的標(biāo)簽已經(jīng)存在,則會(huì)在其前面添加exported_前綴來做區(qū)分岔绸。
刪除標(biāo)簽kernelVersion
- job_name: 'docker'
static_configs:
- targets: ['192.168.0.3:8080', '192.168.0.4:8080', '192.168.0.5:8080']
metric_relabel_configs:
- regex: 'kernelVersion'
action: labeldrop
action: labeldrop理逊,刪除匹配的標(biāo)簽
action: labelkeep,保留匹配的標(biāo)簽盒揉,刪除所有其他標(biāo)簽
Node Exporter和cAdvisor指標(biāo)
- CPU使用率
100 - avg(irate(node_cpu_seconds_total{job="node", mode="idle"}[5m])) by (instance) * 100
- CPU飽和度
node_load1 > on (instance) 2 * count by (instance)(node_cpu_seconds_total{mode="idle"})
- 內(nèi)存使用率
(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Cached_bytes + node_memory_Buffers_bytes)) / node_memory_MemTotal_bytes * 100
- 內(nèi)存飽和度
1024 * sum by (instance) ((rate(node_vmstat_pgpgin[1m]) + rate(node_vmstat_pgpgout[1m])))
- 磁盤使用率
(node_fileystem_size_bytes{mountpoint=~"/|/run"} - node_filesystem_free_bytes{mountpoint=~"/|/run"}) / node_filesystem_size_bytes{mountpoint=~"/|/run"} * 100
Prometheus支持預(yù)測
predict_linear(node_fileystem_size_bytes{job="node"}[1h], 4*3600) < 0
使用1個(gè)小時(shí)窗口數(shù)據(jù)晋被,預(yù)測所有磁盤4個(gè)小時(shí)后的磁盤會(huì)不會(huì)用完。
- 服務(wù)狀態(tài)
node_systemd_unit_state{name="docker.service", state="active"}
- exporter的可用性和up指標(biāo)
up {job="node", instance="192.168.0.3:9100"}
- textfile收集器metadata指標(biāo)
metadata{datacenter != "NJ"}
node_systemd_unit_state{name="docker.service"} == 1 and on (instance, job) metadata{datacenter = "SF"}
on:一對一匹配
group_left:多對一
group_right:一對多
詳情:https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching
查詢持久化
三種方式使查詢持久化
- 記錄規(guī)則:根據(jù)查詢創(chuàng)建新指標(biāo)
- 警報(bào)規(guī)則:從查詢生成警報(bào)
- 可視化:使用Grafana等儀表板可視化查詢
記錄規(guī)則
prometheus.yml中的配置項(xiàng)evaluation_interval
設(shè)置為自動(dòng)計(jì)算記錄的規(guī)則刚盈。
global:
scrape_interval: 15s
evaluation_interval: 15s
在prometheus.yml文件的同一文件夾下羡洛,創(chuàng)建名為rules的子文件夾,用于保存記錄規(guī)則藕漱。同時(shí)在prometheus.yml配置文件中的rule_files塊中添加文件rules/node_rules.yml
$ mkdir -p rules && cd rules
$ cat > node_rules.yml <<EOF
groups:
- name: node_rules
interval: 10s
rules:
- record: instance:node_cpu:avg_rate5m
expr: 100 - avg(irate(node_cpu_seconds_total{job="node", mode="idle"}[5m])) by (instance) * 100
labels:
metric_type: aggregation
EOF
創(chuàng)建了名為"node_rules"的規(guī)則組欲侮,順序執(zhí)行規(guī)則,后面的規(guī)則可以重用前面的規(guī)則肋联。規(guī)則組間是并行運(yùn)行的威蕉,因此不建議跨組使用規(guī)則。
interval:10s 可以設(shè)置interval覆蓋默認(rèn)的evaluation_interval值橄仍。
record:應(yīng)該仔細(xì)為新的時(shí)間序列取名韧涨,以便快速識別它的含義,一般推薦的格式是: level:metric:operations
expr:保存生成新時(shí)間序列的查詢
labels:向新序列添加新的標(biāo)簽
可視化 Grafana
- 安裝Grafana
$ wget https://dl.grafana.com/oss/release/grafana-6.5.1-1.x86_64.rpm
$ sudo yum localinstall grafana-6.5.1-1.x86_64.rpm
使用ansible role安裝:https://galaxy.ansible.com/list#roles/3563
使用Docker鏡像安裝:https://hub.docker.com/search/?q=grafana
- 啟動(dòng)與配置Grafana
配置文件位于/etc/grafana/grafana.ini
$ systemctl start grafana-server
- 瀏覽器訪問http://localhost:3000,默認(rèn)用戶名和密碼為admin和admin氓奈。
Grafana儀表盤實(shí)例查看地址:https://grafana.com/grafana/dashboards
五翘魄、Prometheus服務(wù)發(fā)現(xiàn)
對于主機(jī)數(shù)少的情況下,Prometheus可以使用靜態(tài)配置目標(biāo)舀奶。當(dāng)規(guī)模較大的集群時(shí)暑竟,就不適用了。服務(wù)發(fā)現(xiàn)可以通過以下三種機(jī)制實(shí)現(xiàn):
- 配置管理工具生成的文件中接收目標(biāo)列表
- 查詢API以獲取目標(biāo)列表
- 使用DNS記錄以返回目標(biāo)列表
基于文件的服務(wù)發(fā)現(xiàn)
適合配置管理工具育勺。Prometheus會(huì)按指定時(shí)間計(jì)劃從這些文件重新加載目標(biāo)但荤,文件格式支持yaml、Json格式涧至,它們包含了目標(biāo)列表腹躁。
- job_name: node
file_sd_configs:
- files:
- targets/nodes/*.json
refresh_interval: 5m
- job_name: docker
file_sd_configs:
- files:
- targets/docker/*.yml
refresh_interval: 5m
新建nodes與docker目錄,并添加對應(yīng)的配置文件
$ cd /etc/prometheus
$ mkdir -p targets/{nodes,docker}
$ cat > targets/nodes/nodes.json <<EOF
[{
"targets": [
'192.168.0.3:9100',
'192.168.0.4:9100',
'192.168.0.5:9100'
]
}]
EOF
$ cat > targets/docker/daemons.yml <<EOF
- targets:
- '192.168.0.3:8080'
- '192.168.0.4:8080'
- '192.168.0.5:8080'
labels:
datacenter: NJ
EOF
基于API的服務(wù)發(fā)現(xiàn)
當(dāng)前API的服務(wù)發(fā)現(xiàn)支持以下平臺:
- AWS EC2
- Azure
- Consul
- Google Compute Cloud
- Kubernetes
基于DNS的服務(wù)發(fā)現(xiàn)
- job_name: webapp
dns_sd_configs:
- names: ['_prometheus._tcp.example.com']
Prometheus在查詢目標(biāo)時(shí)南蓬,通過DNS服務(wù)器查找example.com域纺非,然后在該域下搜索名為_prometheus._tcp.example.com的SRV記錄,返回該條目中的服務(wù)記錄赘方。
還可以使用DNS服務(wù)發(fā)現(xiàn)來查詢單個(gè)A或AAAA記錄烧颖。
- job_name: webapp
dns_sd_configs:
- names: ['example.com']
type: A
port: 9100
返回example.com域根目錄下的所有A記錄。
六窄陡、Alert Manager報(bào)警管理
監(jiān)控是為了了解系統(tǒng)的狀態(tài)炕淮,以便于及時(shí)發(fā)現(xiàn)問題。當(dāng)指標(biāo)出現(xiàn)異常時(shí)跳夭,我們應(yīng)該第一時(shí)間知道涂圆,便及時(shí)處理,但是我們又無法實(shí)時(shí)關(guān)注在每個(gè)監(jiān)控指標(biāo)币叹,這時(shí)我們就需要告警機(jī)制润歉。沒有告警機(jī)制的監(jiān)控,像是擺在家里的花瓶套硼,它很美但用處不大卡辰。
一個(gè)好的警報(bào)應(yīng)該是,在正確的時(shí)間邪意、發(fā)給正確的人九妈、恰當(dāng)?shù)牧俊瑴?zhǔn)確(不多也不少)的信息雾鬼。
- 適當(dāng)數(shù)量的警報(bào)
- 設(shè)置正確的警報(bào)優(yōu)先級
- 警報(bào)應(yīng)包括適當(dāng)?shù)纳舷挛?/li>
Alertmanager如何工作
Prometheus服務(wù)器向Alertmanager發(fā)送警報(bào)萌朱,當(dāng)然Alertmanager也可以接收其他工具的警報(bào)。Alertmanager對警報(bào)進(jìn)行去重策菜、分組晶疼,然后路由到不同的接收器:email酒贬,sms等。
- 在Prometheus服務(wù)上編寫警報(bào)規(guī)則
- 當(dāng)指標(biāo)達(dá)到閾值時(shí)翠霍,會(huì)生成警報(bào)推送到Alertmanager锭吨。
- 一個(gè)或多個(gè)Prometheus服務(wù)器可以將警報(bào)定向到單個(gè)Alertmanager下
- Alertmanager處理警報(bào),并根據(jù)其標(biāo)簽進(jìn)行路由寒匙。
Alertmanager安裝零如、配置、運(yùn)行
- Alertmanager安裝
$ wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0-rc.0/alertmanager-0.20.0-rc.0.linux-amd64.tar.gz
$ tar -xzf alertmanager-0.20.0-rc.0.linux-amd64.tar.gz
$ sudo cp alertmanager-0.20.0-rc.0.linux-amd64/alertmanager /usr/local/bin/
$ sudo cp alertmanager-0.20.0-rc.0.linux-amd64/amtool /usr/local/bin/
- 配置Alertmanager
https://prometheus.io/docs/alerting/configuration/
$ sudo mkdir -p /etc/alertmanager
$ sudo cat > /etc/alertmanager/alertmanager.yml <<EOF
global:
smtp_smarthost: 'localhost:25'
smtp_from: 'alertmanager@example.com'
smtp_require_tls: false
templates:
- '/etc/alertmanager/template/*.tmpl'
route:
receiver: email
receivers:
- name: 'email'
email_configs:
- to: 'alerts@example.com'
EOF
global:全局設(shè)置锄弱,為其他模塊的默認(rèn)值
template:保存警報(bào)模板
route:警報(bào)根據(jù)規(guī)則進(jìn)行匹配考蕾,采取相應(yīng)的操作
receivers:接收器列表,每個(gè)接收器有唯一的名字及配置会宪。email_configs來指定電子郵件選項(xiàng)肖卧,webhook_configs可以擴(kuò)展Alertmanager的接收器。
- 運(yùn)行Alertmanager
$ alertmanager --config.file alertmanager.yml
通過瀏覽器訪問alertmanager掸鹅,http://localhost:9093
Prometheus配置Alertmanager
- 在prometheus.yml配置中設(shè)置alerting模塊塞帐。
alerting:
alertmanagers:
- static_configs:
-targets:
- alertmanager:9093
- 監(jiān)控Alertmanager
Alertmanager服務(wù)暴露了自身的相關(guān)指標(biāo),創(chuàng)建一個(gè)Prometheus Job就可以監(jiān)控Alertmanager
- job_name: 'alertmanager'
static_configs:
- targets: ['localhost:9093']
- 添加警報(bào)規(guī)則
與記錄規(guī)則一樣河劝,警報(bào)規(guī)則在Prometheus服務(wù)器配置中加載的規(guī)則文件內(nèi)也使用Yaml語句定義壁榕。
在prometheus.yml配置文件中的rule_files塊中添加文件rules/node_alerts.yml
在rules目錄下創(chuàng)建文件node_alerts.yml來保存節(jié)點(diǎn)報(bào)警規(guī)則。
$ cat > rules/node_alerts.yml <<EOF
groups:
- name: node_alerts
rules:
- alert: HighNodeCPU
expr: instance:node_cpu:avg_rate5m > 80
for: 60m
labels:
severity: warning
annotations:
summary: High Node CPU for 1 hour
console: You might want to check the Node Dashboard at http://grafana.example.com/dashboard/db/node-dashboard
EOF
alert:規(guī)則名
expr:觸發(fā)規(guī)則
for:控制在觸發(fā)警報(bào)之前測試表達(dá)式必須為true的時(shí)長
labels與annotations:裝飾警報(bào)
警報(bào)有三種狀態(tài):
Inactive:警報(bào)未激活
Pending:警報(bào)已滿足測試表達(dá)式條件赎瞎,但仍在等待for子句中指定的持續(xù)時(shí)長
Firing:警報(bào)(如果沒有設(shè)置for,則一旦觸發(fā)條件颊咬,立刻Firing)
Pending务甥、Firing狀態(tài)下的警報(bào)可以在Prometheus的指標(biāo)中查看到ALERTS。
新的警報(bào)與模板示例
groups:
- name: node_alerts
rules:
- alert: DiskWillFillIn4Hours
expr: predict_linear(node_fileystem_size_bytes{mountpoing="/"}[1h], 4*3600) < 0
for: 5m
labels:
severity: critical
annotations:
summary: Disk on {{ $labels.instance }} will fill in approximately 4 hours.
- alert: InstanceDown
expr: up{job="node"} == 0
for: 10m
labels:
severity: critical
annotations:
summary: Host {{ $labels.instance }} of {{ $labels.job }} is down!
- alert: NodeServiceDown
expr: node_systemd_unit_state{state="active"} != 1
for: 60s
labels:
severity: critical
annotations:
summary: Service {{$labels.name}} on {{ $labels.instance }} is no longer active!
description: Service Down
- alert: InstanceGone
expr: absent(up{job="node"})
for: 10s
labels:
severity: critical
annotations:
summary: Host {{ $labels.instance }} is no logger reporting!
description: 'OMG Where are my instances'
- name: prometheus_alerts
rules:
- alert: PrometheusConfigReloadFailed
expr: prometheus_config_last_reload_successful == 0
for: 10m
labels:
severity: warning
annotations:
description: Reloading Prometheus configuration has failed on {{ $lables.instance }}.
- alert: PrometheusNotConnectedToAlertmanagers
expr: prometheus_notifications_alertmanagers_discovered < 1
for: 10m
labels:
severity: warning
annotations:
description: Prometheus {{ $labels.instance }} is not connected to any Alertmanagers.
路由
Alertmanager的配置文件alertmanager.yml中添加一些路由配置喳篇。
route:
group_by: ['instance']
group_wait: 30s
group_interval: 5m
repeat_interval: 3h
receiver: email
routes:
- match:
severity: critical
receiver: pager
- match_re:
severity: ^(warning|critical)$
receiver: support_team
receivers:
- name: 'email'
email_configs:
- to: 'alert@example.com'
send_resolved: true
- name: 'support_team'
email_configs:
- to: 'support@example.com'
- name: 'pager'
email_configs:
- to: 'alert-pager@example.com'
pagerduty_configs:
- service_key: TEAFDSFEWS
group_by:對Alertmanager警報(bào)指定分組方式敞临,如按照instance來分組
group_wait:如果進(jìn)行分組,Alertmanager會(huì)等待group_wait指定的時(shí)間麸澜,以便在觸發(fā)報(bào)警前查看是否收到該組中的其他報(bào)警
group_interval:如果發(fā)出警報(bào)后挺尿,Alertmanager收到該分組的下一次評估的新警報(bào)后,會(huì)等待group_interval時(shí)間后再發(fā)送新警報(bào)炊邦,以免警報(bào)泛濫
repeat_interval:適用于單個(gè)警報(bào)编矾,等待重新發(fā)送相同警報(bào)的時(shí)間段
receiver:默認(rèn)接收器
send_resolved: 恢復(fù)后發(fā)送通知
routes:路由規(guī)則。如果需要routers還可以分支馁害。如:
routes:
- match:
severity: critical
receiver: pager
routes:
- match:
service: application1
receiver: support_team
通知模板
模板目錄:/etc/alertmanager/templates
$ cat > /etc/alertmanager/templates/slack.tmpl <<EOF
{{ define "annotation.summary.text" }}{{ .CommonAnnotations.summary}}{{end}}
EOF
對應(yīng)的slack_configs receiver配置
slack_configs:
- api_url: https://hooks.slack.com/services/ABC123/fsdaf窄俏、
EXAMPLE
channel: #monitoring
text: '{{template "annotation.summary.text" .}}
使用模板通知來填充text字段,使用上下文通知碘菜。
silence和維護(hù)
報(bào)警靜默設(shè)置凹蜈。當(dāng)服務(wù)進(jìn)行維護(hù)時(shí)限寞,不需要發(fā)出告警,使用silence進(jìn)行控制仰坦。兩種方法進(jìn)行設(shè)置:
- 通過Alertmanger Web控制臺
- 通過amtool命令工具
- 使用amtool添加silence履植。默認(rèn)為1h過期時(shí)間,可以指定--expires和--expire-on參數(shù)指定更長的時(shí)間與窗口
$ amtool --alertmanager.url=http://localhost:9093 silence add alertname=InstancesGone service=application1
- 使用query命令查詢silence列表
$ amtool --alertmanager.url=http://localhost:9093 silence query
- 指定silence過期
$ amtool --alertmanager.url=http://localhost:9093 silence expire $SILENCE_ID
- 使用正則創(chuàng)建silence
$ amtool --alertmanager.url=http://localhost:9093 silence add --comment "App1 maintenance" alertname=~'Instance.*' service=application1
七悄晃、Prometheus高可用性
Prometheus通過運(yùn)行兩個(gè)配置相同的Prometheus服務(wù)器静尼,并且它們同時(shí)處于活動(dòng)狀態(tài)來實(shí)現(xiàn)容錯(cuò)。該配置生成的重復(fù)警報(bào)交由上游Alertmanager使用其分組功能進(jìn)行處理传泊。所以一個(gè)推薦的做法是關(guān)注Alertmanager的高可用鼠渺,而不是Prometheus服務(wù)。
通過創(chuàng)建一個(gè)Alertmanager集群來實(shí)現(xiàn)高可用眷细,所有Prometheus服務(wù)器將告警發(fā)送到Alertmamanager集群拦盹,而Alertmanager負(fù)責(zé)去除重復(fù)數(shù)據(jù)。
設(shè)置Alertmanager集群
Alertmanager包含由HashiCorp Memberlist庫提供的集群功能溪椎。
- 在多臺主機(jī)上安裝Alertmanager
- 啟動(dòng)Alertmanager普舆,傳入?yún)?shù)--cluster.listen-address
第一臺主機(jī)啟動(dòng)Alertmanager命令如下:
$ alertmanager --config.file alertmanager.yml --cluster.listen-address 192.168.0.3:8001
剩下的主機(jī)啟動(dòng)Alertmanager命令如下:
$ alertmanager --config.file alertmanager.yml --cluster.listen-address 192.168.0.4:8001 --cluster.peer 192.168.0.3:8001
- 在Alertmanager的控制臺狀態(tài)頁面/status上查看集群狀態(tài)
- 為Prometheus配置Alertmanager集群
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.0.3:9093
- 192.168.0.4:9093
- 192.168.0.5:9093
三個(gè)Alertmanager服務(wù)都會(huì)收到告警信息,保證告警可達(dá)校读。
可擴(kuò)展性
Prometheus federation API抓取每個(gè)工作節(jié)點(diǎn)的聚合指標(biāo)
一個(gè)很好的例子是:基于區(qū)域的主節(jié)點(diǎn)和工作節(jié)點(diǎn)沼侣,基于區(qū)域的主節(jié)點(diǎn)視為全局的工作節(jié)點(diǎn),然后向全局的主節(jié)點(diǎn)進(jìn)行報(bào)告歉秫。
因?yàn)槭墙鹱炙壗Y(jié)構(gòu)蛾洛,主節(jié)點(diǎn)可能會(huì)有延時(shí),所以盡量通過工作節(jié)點(diǎn)向Alertmanager發(fā)送告警雁芙。
水平分片通常是最后的選擇轧膘。每個(gè)目標(biāo)都有數(shù)萬個(gè)指標(biāo)或者大量時(shí)間序列。
Prometheus work0配置
global:
external_labels:
worker: 0
rule_files:
- "rules/node_rules.yml"
scrape_configs:
- job_name: 'node'
file_sd_configs:
- files:
- targets/nodes/*.json
refresh_interval: 5m
relabel_configs:
- source_labels: [__address__]
modulus: 3
target_label: __tmp_hash
action: hashmod
- source_labels: [__tmp_hash]
regex: ^0$
action: keep
該過程是使用hashmod模塊對__address__
標(biāo)簽的值對3取Mod兔甘,如果余數(shù)為0谎碍,則保留。
同樣的方法配置好work1與work2節(jié)點(diǎn)洞焙。
Prometheus 主節(jié)點(diǎn)配置
scrap_configs:
- job_name: 'node_workers'
file_sd_configs:
- files:
- 'targets/workers.json'
refresh_interval: 5m
honor_labels: true
metrics_path: /federate
params:
'match[]':
- '{__name__="^instance:.*"}'
其中targets/workers.json內(nèi)容為
[{
"targets": [
"worker0:9090",
"worker1:9090",
"worker2:9090",
]
}]
Prometheus支持使用/federate API根據(jù)指定的匹配參數(shù)來查詢服務(wù)器指標(biāo)蟆淀。
八、日志監(jiān)控
使用mtail作為日志處理工具澡匪,它是Google開發(fā)的熔任,非常輕巧。它專門用于從應(yīng)用程序日志中提取要導(dǎo)出到時(shí)間序列數(shù)據(jù)庫中的指標(biāo)。
- 安裝mtail
$ wget https://github.com/google/mtail/releases/download/v3.0.0-rc33/mtail_v3.0.0-rc33_linux_amd64 -O mtail
$ chmod 0755 mtail
$ sudo cp mtail /usr/local/bin/
- 使用mtail
mtail通過命令進(jìn)行配置,指定日志文件列表挂滓,以及運(yùn)行的程序目錄猎贴。每個(gè)mtail程序都以.mtail為后綴名是越。
$ sudo mkdir /etc/mtail
$ cat > /etc/mtail/line_count.mtail <<EOF
counter line_count
/$/ {
line_count++
}
EOF
程序定義了一個(gè)名為line_count的計(jì)數(shù)器(計(jì)數(shù)器 counter曹鸠,測量型 gauge)造成。這些計(jì)數(shù)與測量通過mtail導(dǎo)出到定義的任何目的地搞旭。
- 運(yùn)行mtail
$ sudo mtail --progs /etc/mtail --logs '/var/log/*.log'
--progs:指定mtail程序所在目錄
--logs:指定日志文件
執(zhí)行后趁餐,mtail將在3903端口上啟動(dòng)Web服務(wù)(使用--address和--port參數(shù)設(shè)置IP與端口)喷兼。http://localhost:3903/metrics路徑可以被Prometheus獲取相關(guān)監(jiān)控?cái)?shù)據(jù)。
處理Web服務(wù)器訪問日志
# LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer|i\" \"%}User-agent|i\"
counter apache_http_requests_total by request_method, http_version, request_status
counter apache_http_bytes_total by request_method, http_version, request_status
/^/ +
/(?P<hostname>[0-9A-Za=z\.-]+) / + # %h
/(?P<remote_logname>[0-9A-Za=z\.-]+) / + # %l
/(?P<remote_username>[0-9A-Za=z\.-]+) / + # %u
/(?P<timestamp>\[\d{2}\/\w{3}\/\d{4}:\d{2}:\d{2}:\d{2} (\+|-)\d{4}\]) / + # %u
/"(?P<request_method>[A-Z]+) (?P<URI>\S+) (?P<http_version>HTTP\/[0-9\.]+)" / + # \"%r\"
/(?P<request_status>\d{3}) / + # %>s
/(?P<response_size>\d+) / + # %b
/"(?P<referer>\S+)" / + # \"%{Referer}i\"
/"(?P<user_agent>[[:print:]]+)"/ + # \"%{User-agent}i\"
/$/ {
apache_http_requests_total[$request_method][$http_version][$request_status]++
apache_http_bytes_total[$request_method][$http_version][$request_status] += $response_size
}
by:指定要添加到指標(biāo)的其他維度后雷,它們將會(huì)添加到指標(biāo)的標(biāo)簽中季惯。
每個(gè)維度包含在[ ]中。
運(yùn)行mtail程序
$ sudo mtail --progs /etc/mtail --logs '/var/log/apache/*.access'
解析Rail日志到直方圖
counter rails_requests_started_total
counter rails_requests_started by verb
counter rails_requests_completed_total
counter rails_requests_completed by status
counter rails_requests_completed_milliseconds_sum by status
counter rails_requests_completed_milliseconds_count by status
counter rails_requests_completed_milliseconds_bucket by le,status
/^Started (?P<verb>[A-Z]+) ./*/ {
rails_requests_started_total++
rails_requests_started[$verb]++
}
/^Completed (?P<status>\d{3}) .+ in (?P<request_milliseconds>\d+)ms .*$/ {
rails_requests_completed_total++
rails_requests_completed[$status]++
rails_requests_completed_milliseconds_sum[$status] += $request_milliseconds
rails_requests_completed_milliseconds_count[$status] ++
$request_milliseconds <= 10{
rails_requests_completed_milliseconds_bucket["10"][$status] ++
}
$request_milliseconds <= 50{
rails_requests_completed_milliseconds_bucket["50"][$status] ++
}
}
盡量為每個(gè)應(yīng)用單獨(dú)部署日志監(jiān)控臀突,對于K8S上的應(yīng)用勉抓,可以使用sidecar的方式運(yùn)行mtail來實(shí)現(xiàn)日志監(jiān)控。
例子代碼:https://github.com/google/mtail/tree/master/examples
九候学、探針監(jiān)控
使用Blackbox exporter來對外部服務(wù)探測監(jiān)控藕筋。
- 安裝Blackbox exporter
$ wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.16.0/blackbox_exporter-0.16.0.linux-amd64.tar.gz
$ tar -xzf blackbox_exporter-0.16.0.linux-amd64.tar.gz
$ sudo cp blackbox_exporter-0.16.0.linux-amd64/blackbox_exporter /usr/local/bin/
- 配置Blackbox exporter
使用/etc/prober/prober.yml文件配置exporter
$ sudo mkdir -p /etc/prober
$ sudo touch /etc/prober/prober.yml
$ cat > /etc/prober/prober.yml <<EOF
modules:
http_2xx_check:
prober: http
timeout: 5s
http:
valid_status_codes: []
method: GET
icmp_check:
prober: icmp
timeout: 5s
icmp:
preferred_ip_protocol: "ip4"
dns_examplecom_check:
prober: dns
dns:
preferred_ip_protocol: "ip4"
query_name: "www.example.com"
EOF
- 啟動(dòng)exporter
$ sudo blackbox_exporter --config.file="/etc/prober/prober.yml"
默認(rèn)在端口9115下運(yùn)行服務(wù):http://localhost:9115/metrics
- Prometheus創(chuàng)建作業(yè),調(diào)用Blackbox Exporter服務(wù)
scrape_configs:
- job_name: 'blackbox'
metrics_path: /probe
params:
module: [http_2xx_check] # Look for a HTTP 200 response.
static_configs:
- targets:
- http://prometheus.io # Target to probe with http.
- https://prometheus.io # Target to probe with https.
- http://example.com:8080 # Target to probe with http on port 8080.
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9115
Blackbox Exporter的配置Job方式與其他作業(yè)不同梳码,這的targets是作為Blackbox Exporter檢測的目標(biāo)地址隐圾。而Blackbox Exporter的服務(wù)地址,通過relabel_configs替換掉address標(biāo)簽的方式設(shè)置掰茶。
十暇藏、Pushgateway方式推送監(jiān)控?cái)?shù)據(jù)
Prometheus主要是基于拉取的架構(gòu)來運(yùn)行作業(yè),同時(shí)也提供了Pushgateway服務(wù)來支持Push方式濒蒋。
Pushgateway位于發(fā)送指標(biāo)的應(yīng)用程序與Prometheus服務(wù)器之間盐碱,接收指標(biāo),同時(shí)作為目標(biāo)被抓取啊胶。
Pushgateway只能用作有限的解決方案使用甸各,特別是監(jiān)控其他無法訪問的資源。
- 安裝Pushgateway
$ wget https://github.com/prometheus/pushgateway/releases/download/v1.0.0/pushgateway-1.0.0.linux-amd64.tar.gz
$ tar -xzf pushgateway-1.0.0.linux-amd64.tar.gz
$ sudo cp pushgateway-1.0.0.linux-amd64/pushgateway /usr/local/bin
- 配置和運(yùn)行Pushgateway
$ pushgateway --web.listen-address="0.0.0.0:9091" --persistence.file="/tmp/pushgateway_persist" --persistence.interval=5m
--web.listen-address:指定服務(wù)端口焰坪。pushgateway默認(rèn)端口是9091.
--persistence.file:指標(biāo)持久化到路徑。默認(rèn)情況下聘惦,pushgateway所有指標(biāo)存儲在內(nèi)存中某饰,如果pushgateway停止服務(wù)或者重新啟動(dòng),所有數(shù)據(jù)將會(huì)丟失善绎。
--persistence.interval:指標(biāo)持久化寫入周期黔漂。默認(rèn)5m
- 向pushgateway服務(wù)發(fā)送指標(biāo)
$ echo "batchjob1_user_counter 2" | curl --data-binary @- http://localhost:9091/metrics/job/batchjob1/instance/sidekiq_server
將為作業(yè)batchjob1添加一個(gè)新的指標(biāo)
batchjob1_user_counter{instance="sidekiq_server"} 2
$ cat <<EOF | curl --data-binary @- http://localhost:9091/metrics/job/batchjob1/instance/sidekiq_server
# TYPE batchjob1_user_counter counter
# HELP batchjob1_user_counter A metric from BatchJob1.
batchjob1_user_counter{job_id="123ABC"} 2
也可以同時(shí)發(fā)送多個(gè)指標(biāo)。
- 在pushgateway上查看指標(biāo)
$ curl http://localhost:9091/metrics
- 刪除pushgateway上的指標(biāo)
$ curl -x DELETE localhost:9091/metrics/job/batchjob1 #刪除job batchjob1下的所有指標(biāo)
$ curl -x DELETE localhost:9091/metrics/job/batchjob1/instance/sidekiq_server # 刪除job batchjob1下標(biāo)簽滿足instance=sidekiq_server的指標(biāo)
- Promethes上添加Pushgateway Job
- job_name: 'pushgateway'
honor_labels: true
static_configs:
- targets: ['localhost:9091']
honor_labels設(shè)置為true禀酱,Prometheus使用Pushgateway上的job和instance標(biāo)簽炬守,否則會(huì)在前面加上exported_前綴。
十一剂跟、監(jiān)控OpenShift
OpenShift平臺的監(jiān)控方案默認(rèn)為Prometheus開源監(jiān)控方案减途,它不僅帶有一整套完成的監(jiān)控酣藻,而且還預(yù)配置了一組告警,以及一組豐富的Grafana儀表盤鳍置。
可以通過Prometheus Operator方便地創(chuàng)建辽剧、配置和管理Prometheus及Alertmanager。
從上圖可以看到税产,除了Prometheus與Alertmanager服務(wù)怕轿,OpenShift的監(jiān)控方案中還裝了node exporter與kube-state-metrics獲取集群的狀態(tài)指標(biāo)。
OpenShift使用ansible安裝時(shí)辟拷,默認(rèn)會(huì)安裝的cluster monitoring operator撞羽。除非在inventory中指定openshift_cluster_monitoring_operator_install為false。