《Prometheus監(jiān)控實(shí)戰(zhàn)》讀書筆記

《Prometheus監(jiān)控實(shí)戰(zhàn)》

Prometheus是一個(gè)開源的監(jiān)控系統(tǒng)门躯。


Prometheus架構(gòu)

一膘掰、監(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)控模式

  1. 務(wù)必在項(xiàng)目最開始階段就把監(jiān)控考慮進(jìn)去耽装,它和安全性一樣愤炸,都是應(yīng)用的核心功能。
  2. 根據(jù)服務(wù)價(jià)值設(shè)計(jì)自上而下的監(jiān)控系統(tǒng)是一個(gè)很好的方式掉奄。先是業(yè)務(wù)邏輯规个,再是應(yīng)用程序,最后才是基礎(chǔ)設(shè)施操作系統(tǒng)姓建。
  3. 需要找準(zhǔn)監(jiān)控項(xiàng)诞仓,及時(shí)發(fā)現(xiàn)錯(cuò)誤
  4. 通過多樣化的數(shù)據(jù),如查看數(shù)據(jù)窗口等更智能的技術(shù)分析指標(biāo)與閥值
  5. 增加監(jiān)控的頻率
  6. 盡可能實(shí)現(xiàn)監(jiān)控系統(tǒng)部署實(shí)施自動(dòng)化

監(jiān)控機(jī)制

  1. 探針與內(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)控工具收集。
  2. 拉取與推送:執(zhí)行監(jiān)控檢查的兩種方式措译。
    拉缺鸱铩:提取或檢查遠(yuǎn)程應(yīng)用程序。如Prometheus领虹。
    推送:應(yīng)用程序發(fā)送事件給監(jiān)控系統(tǒng)接收规哪。

監(jiān)控?cái)?shù)據(jù)類型

  1. 指標(biāo):軟件和硬件組件屬性的度量。
    指標(biāo)類型:測量型 Gauge塌衰、計(jì)數(shù)型 Counter诉稍、直方圖 Histogram
  2. 日志:應(yīng)用程序發(fā)出的事件(通常是文本類型)。

監(jiān)控方法論

  1. Brendan Gregg的USE方法 主機(jī)級監(jiān)控
    USE:使用率最疆、飽和度杯巨、錯(cuò)誤。針對每個(gè)資源(如CPU)努酸,檢查使用率(如CPU使用百分比)服爷、飽和度(如等待CPU的進(jìn)程數(shù))和錯(cuò)誤(如錯(cuò)誤事件的計(jì)數(shù))。
  2. Google四個(gè)黃金指標(biāo) 應(yīng)用程序級監(jiān)控
    延遲(如服務(wù)請求時(shí)間)获诈、流量(如每秒HTTP請求數(shù))仍源、錯(cuò)誤(如響應(yīng)時(shí)間走過30ms的請求視為錯(cuò)誤)、飽和度(如內(nèi)存IO)舔涎。
  3. RED方法
    Rate(你的服務(wù)所服務(wù)的每秒的請求數(shù))笼踩、Errors(每秒失敗的請求數(shù))、Duration(每個(gè)請求所花費(fèi)的時(shí)間亡嫌,用時(shí)間間隔表示)

通知系統(tǒng)

通知系統(tǒng)需要關(guān)注以下幾點(diǎn):

  1. 通知清晰嚎于、準(zhǔn)確、可操作挟冠。人易讀于购。
  2. 通知添加上下文,通知應(yīng)包含組件的其他相關(guān)信息圃郊。
  3. 僅發(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ù)。


Prometheus架構(gòu)

名詞解釋

endpoint:端點(diǎn)拜银,Prometheus抓取的指標(biāo)來源
target:目標(biāo)殊鞭,定義執(zhí)行抓取所需的信息,如鏈接尼桶,身份驗(yàn)證操灿,抓取方式
job:一組目標(biāo),具有相同角色的目標(biāo)組

監(jiān)控資源服務(wù)發(fā)現(xiàn)

  1. 用戶提供靜態(tài)資源列表泵督。
  2. 基于文件的發(fā)現(xiàn)趾盐。例如使用配置管理工具生成在Prometheus中可以自動(dòng)更新的資源列表。
  3. 自動(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

  1. 下載Prometheus的二進(jìn)制文件
$ wget https://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz
  1. 解壓文件到相關(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/
  1. 執(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

  1. 將配置文件prometheus.yml移到合適的位置
$ sudo mkdir -p /etc/prometheus
$ sudo cp prometheus.yml /etc/prometheus/
  1. 運(yùn)行prometheus應(yīng)用
$ prometheus --config.file "/etc/prometheus/prometheus.yml"
  1. 如果發(fā)生異常迁杨,可以使用promtool來驗(yàn)證配置文件
$ promtool check config prometheus.yml
Checking prometheus.yml
    SUCCESS: 0 rule files found

查詢數(shù)據(jù)

  1. 查看指定指標(biāo)值
go_gc_duration_seconds{quantile="0.5"}  1.6166e-05
  1. 過濾一些匹配標(biāo)簽
go_gc_duration_seconds{quantile!="0.5"}  
  1. 聚合數(shù)據(jù)求和
sum(promhttp_metric_handler_requests_total) # 求和
  1. PromQL通過子名by,按特定維度聚合
sum(promhttp_metric_handler_requests_total) by (job)
  1. 轉(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ù)器一起使用狐史。

  1. 增加數(shù)量
increase(promhttp_metric_handler_requests_total[1h])

指標(biāo)1小時(shí)內(nèi)增長的值。

容量規(guī)劃

  1. 內(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)存使用情況鲁豪。

  1. 磁盤

默認(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)搀暑。

  1. 安裝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/
  1. 配置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)侠鳄。

  1. 配置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
  1. 啟用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ù)配置巴碗。
  2. 運(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"
  1. 抓取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ù)中具滴。

  1. 過濾收集器
    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)趋艘。

  1. 運(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/可查看

cAdvisor

通過瀏覽器訪問http://192.168.0.3:8080/metrics查看暴露的內(nèi)置Prometheus指標(biāo)
cAdvisor指標(biāo)

  1. 抓取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ù)的生命周期簡化版

可以看到在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í)間序列

  1. 標(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)簽層次結(jié)構(gòu)參考
  2. 重新標(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_statecontainer_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)

  1. CPU使用率
100 - avg(irate(node_cpu_seconds_total{job="node", mode="idle"}[5m])) by (instance) * 100
  1. CPU飽和度
node_load1 > on (instance) 2 * count by (instance)(node_cpu_seconds_total{mode="idle"})
  1. 內(nèi)存使用率
(node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Cached_bytes + node_memory_Buffers_bytes)) / node_memory_MemTotal_bytes * 100
  1. 內(nèi)存飽和度
1024 * sum by (instance) ((rate(node_vmstat_pgpgin[1m]) + rate(node_vmstat_pgpgout[1m])))
  1. 磁盤使用率
(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ì)用完。

  1. 服務(wù)狀態(tài)
node_systemd_unit_state{name="docker.service", state="active"}
  1. exporter的可用性和up指標(biāo)
up {job="node", instance="192.168.0.3:9100"}
  1. 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

  1. 安裝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

  1. 啟動(dòng)與配置Grafana
    配置文件位于/etc/grafana/grafana.ini
$ systemctl start grafana-server
  1. 瀏覽器訪問http://localhost:3000,默認(rèn)用戶名和密碼為admin和admin氓奈。
    Grafana儀表盤實(shí)例查看地址:https://grafana.com/grafana/dashboards
    Grafana

五翘魄、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)行

  1. 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/
  1. 配置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的接收器。

  1. 運(yùn)行Alertmanager
$ alertmanager --config.file alertmanager.yml

通過瀏覽器訪問alertmanager掸鹅,http://localhost:9093

Prometheus配置Alertmanager

  1. 在prometheus.yml配置中設(shè)置alerting模塊塞帐。
alerting:
  alertmanagers:
  - static_configs:
    -targets:
      - alertmanager:9093
  1. 監(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']
  1. 添加警報(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命令工具
  1. 使用amtool添加silence履植。默認(rèn)為1h過期時(shí)間,可以指定--expires和--expire-on參數(shù)指定更長的時(shí)間與窗口
$ amtool --alertmanager.url=http://localhost:9093 silence add alertname=InstancesGone service=application1
  1. 使用query命令查詢silence列表
$ amtool  --alertmanager.url=http://localhost:9093 silence query
  1. 指定silence過期
$ amtool  --alertmanager.url=http://localhost:9093 silence expire $SILENCE_ID
  1. 使用正則創(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庫提供的集群功能溪椎。

  1. 在多臺主機(jī)上安裝Alertmanager
  2. 啟動(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
  1. 在Alertmanager的控制臺狀態(tài)頁面/status上查看集群狀態(tài)
  2. 為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)。

  1. 安裝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/
  1. 使用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)出到定義的任何目的地搞旭。

  1. 運(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)控藕筋。

  1. 安裝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/
  1. 配置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
  1. 啟動(dòng)exporter
$ sudo blackbox_exporter --config.file="/etc/prober/prober.yml"

默認(rèn)在端口9115下運(yùn)行服務(wù):http://localhost:9115/metrics

  1. 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)控其他無法訪問的資源。

  1. 安裝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
  1. 配置和運(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

  1. 向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)。

  1. 在pushgateway上查看指標(biāo)
$ curl http://localhost:9091/metrics
  1. 刪除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)
  1. 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儀表盤鳍置。

OpenShift Prometheus架構(gòu)

可以通過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。

OpenShift中Prometheus默認(rèn)監(jiān)控目標(biāo)Targets
OpenShift中Prometheus默認(rèn)添加的告警規(guī)則

擴(kuò)展資料

Awesome Prometheus alerts
Rich Exporter
Exporter Operator

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衫冻,一起剝皮案震驚了整個(gè)濱河市诀紊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羽杰,老刑警劉巖渡紫,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異考赛,居然都是意外死亡惕澎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門颜骤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唧喉,“玉大人,你說我怎么就攤上這事忍抽“诵ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵鸠项,是天一觀的道長干跛。 經(jīng)常有香客問我,道長祟绊,這世上最難降的妖魔是什么楼入? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮牧抽,結(jié)果婚禮上嘉熊,老公的妹妹穿的比我還像新娘。我一直安慰自己扬舒,他們只是感情好阐肤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般孕惜。 火紅的嫁衣襯著肌膚如雪愧薛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天诊赊,我揣著相機(jī)與錄音厚满,去河邊找鬼。 笑死碧磅,一個(gè)胖子當(dāng)著我的面吹牛碘箍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鲸郊,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼丰榴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了秆撮?” 一聲冷哼從身側(cè)響起四濒,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎职辨,沒想到半個(gè)月后盗蟆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舒裤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年喳资,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腾供。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仆邓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伴鳖,到底是詐尸還是另有隱情节值,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布榜聂,位于F島的核電站搞疗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏须肆。R本人自食惡果不足惜贴汪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望休吠。 院中可真熱鬧,春花似錦业簿、人聲如沸瘤礁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柜思。三九已至岩调,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赡盘,已是汗流浹背号枕。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陨享,地道東北人葱淳。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像抛姑,于是被迫代替她去往敵國和親赞厕。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容