<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          實(shí)戰(zhàn) Prometheus 搭建監(jiān)控系統(tǒng)

          共 28200字,需瀏覽 57分鐘

           ·

          2021-04-23 09:23

          公眾號(hào)關(guān)注“杰哥的IT之旅”,

          選擇“星標(biāo)”,重磅干貨,第一時(shí)間送達(dá)!

          前言

          Prometheus 是一款基于時(shí)序數(shù)據(jù)庫(kù)的開(kāi)源監(jiān)控告警系統(tǒng),說(shuō)起 Prometheus 則不得不提 SoundCloud,這是一個(gè)在線音樂(lè)分享的平臺(tái),類似于做視頻分享的 YouTube,由于他們?cè)谖⒎?wù)架構(gòu)的道路上越走越遠(yuǎn),出現(xiàn)了成百上千的服務(wù),使用傳統(tǒng)的監(jiān)控系統(tǒng) StatsD 和 Graphite 存在大量的局限性,于是他們?cè)?2012 年開(kāi)始著手開(kāi)發(fā)一套全新的監(jiān)控系統(tǒng)。

          Prometheus 的原作者是 Matt T. Proud,他也是在 2012 年加入 SoundCloud 的,實(shí)際上,在加入 SoundCloud 之前,Matt 一直就職于 Google,他從 Google 的集群管理器 Borg 和它的監(jiān)控系統(tǒng) Borgmon 中獲取靈感,開(kāi)發(fā)了開(kāi)源的監(jiān)控系統(tǒng) Prometheus,和 Google 的很多項(xiàng)目一樣,使用的編程語(yǔ)言是 Go。

          很顯然,Prometheus 作為一個(gè)微服務(wù)架構(gòu)監(jiān)控系統(tǒng)的解決方案,它和容器也脫不開(kāi)關(guān)系。早在 2006 年 8 月 9 日,Eric Schmidt 在搜索引擎大會(huì)上首次提出了云計(jì)算(Cloud Computing)的概念,在之后的十幾年里,云計(jì)算的發(fā)展勢(shì)如破竹。在 2013 年,Pivotal 的 Matt Stine 又提出了云原生(Cloud Native)的概念,云原生由微服務(wù)架構(gòu)、DevOps 和以容器為代表的敏捷基礎(chǔ)架構(gòu)組成,幫助企業(yè)快速、持續(xù)、可靠、規(guī)模化地交付軟件。為了統(tǒng)一云計(jì)算接口和相關(guān)標(biāo)準(zhǔn),2015 年 7 月,隸屬于 Linux 基金會(huì)的 云原生計(jì)算基金會(huì)(CNCF,Cloud Native Computing Foundation) 應(yīng)運(yùn)而生。第一個(gè)加入 CNCF 的項(xiàng)目是 Google 的 Kubernetes,而 Prometheus 是第二個(gè)加入的(2016 年)。

          目前 Prometheus 已經(jīng)廣泛用于 Kubernetes 集群的監(jiān)控系統(tǒng)中,對(duì) Prometheus 的歷史感興趣的同學(xué)可以看看 SoundCloud 的工程師 Tobias Schmidt 在 2016 年的 PromCon 大會(huì)上的演講:The History of Prometheus at SoundCloud 。

          prometheus概述

          我們?cè)?SoundCloud 的官方博客中可以找到一篇關(guān)于他們?yōu)槭裁葱枰麻_(kāi)發(fā)一個(gè)監(jiān)控系統(tǒng)的文章 Prometheus: Monitoring at SoundCloud,在這篇文章中,他們介紹到,他們需要的監(jiān)控系統(tǒng)必須滿足下面四個(gè)特性:

          • A multi-dimensional data model, so that data can be sliced and diced at will, along dimensions like instance, service, endpoint, and method.

          • Operational simplicity, so that you can spin up a monitoring server where and when you want, even on your local workstation, without setting up a distributed storage backend or reconfiguring the world.

          • Scalable data collection and decentralized architecture, so that you can reliably monitor the many instances of your services, and independent teams can set up independent monitoring servers.

          • Finally, a powerful query language that leverages the data model for meaningful alerting (including easy silencing) and graphing (for dashboards and for ad-hoc exploration).

          簡(jiǎn)單來(lái)說(shuō),就是下面四個(gè)特性:

          • 多維度數(shù)據(jù)模型

          • 方便的部署和維護(hù)

          • 靈活的數(shù)據(jù)采集

          • 強(qiáng)大的查詢語(yǔ)言

          實(shí)際上,多維度數(shù)據(jù)模型和強(qiáng)大的查詢語(yǔ)言這兩個(gè)特性,正是時(shí)序數(shù)據(jù)庫(kù)所要求的,所以 Prometheus 不僅僅是一個(gè)監(jiān)控系統(tǒng),同時(shí)也是一個(gè)時(shí)序數(shù)據(jù)庫(kù)。那為什么 Prometheus 不直接使用現(xiàn)有的時(shí)序數(shù)據(jù)庫(kù)作為后端存儲(chǔ)呢?這是因?yàn)?SoundCloud 不僅希望他們的監(jiān)控系統(tǒng)有著時(shí)序數(shù)據(jù)庫(kù)的特點(diǎn),而且還需要部署和維護(hù)非常方便。

          縱觀比較流行的時(shí)序數(shù)據(jù)庫(kù)(參見(jiàn)下面的附錄),他們要么組件太多,要么外部依賴繁重,比如:Druid 有 Historical、MiddleManager、Broker、Coordinator、Overlord、Router 一堆的組件,而且還依賴于 ZooKeeper、Deep storage(HDFS 或 S3 等),Metadata store(PostgreSQL 或 MySQL),部署和維護(hù)起來(lái)成本非常高。而 Prometheus 采用去中心化架構(gòu),可以獨(dú)立部署,不依賴于外部的分布式存儲(chǔ),你可以在幾分鐘的時(shí)間里就可以搭建出一套監(jiān)控系統(tǒng)。

          此外,Prometheus 數(shù)據(jù)采集方式也非常靈活。要采集目標(biāo)的監(jiān)控?cái)?shù)據(jù),首先需要在目標(biāo)處安裝數(shù)據(jù)采集組件,這被稱之為 Exporter,它會(huì)在目標(biāo)處收集監(jiān)控?cái)?shù)據(jù),并暴露出一個(gè) HTTP 接口供 Prometheus 查詢,Prometheus 通過(guò) Pull 的方式來(lái)采集數(shù)據(jù),這和傳統(tǒng)的 Push 模式不同。不過(guò) Prometheus 也提供了一種方式來(lái)支持 Push 模式,你可以將你的數(shù)據(jù)推送到 Push Gateway,Prometheus 通過(guò) Pull 的方式從 Push Gateway 獲取數(shù)據(jù)。目前的 Exporter 已經(jīng)可以采集絕大多數(shù)的第三方數(shù)據(jù),比如 Docker、HAProxy、StatsD、JMX 等等,官網(wǎng)有一份 Exporter 的列表。

          除了這四大特性,隨著 Prometheus 的不斷發(fā)展,開(kāi)始支持越來(lái)越多的高級(jí)特性,比如:服務(wù)發(fā)現(xiàn),更豐富的圖表展示,使用外部存儲(chǔ),強(qiáng)大的告警規(guī)則和多樣的通知方式。下圖是 Prometheus 的整體架構(gòu)圖(圖片來(lái)源):

          從上圖可以看出,Prometheus 生態(tài)系統(tǒng)包含了幾個(gè)關(guān)鍵的組件:Prometheus server、Pushgateway、Alertmanager、Web UI 等,但是大多數(shù)組件都不是必需的,其中最核心的組件當(dāng)然是 Prometheus server,它負(fù)責(zé)收集和存儲(chǔ)指標(biāo)數(shù)據(jù),支持表達(dá)式查詢,和告警的生成。接下來(lái)我們就來(lái)安裝 Prometheus server。

          安裝Prometheus server

          Prometheus 可以支持多種安裝方式,包括 Docker、Ansible、Chef、Puppet、Saltstack 等。下面介紹最簡(jiǎn)單的兩種方式,一種是直接使用編譯好的可執(zhí)行文件,開(kāi)箱即用,另一種是使用 Docker 鏡像,更多的安裝方式可以參考  這里

          (https://love2.io/@1046102779/doc/prometheus/introductions/install.md)

          1、開(kāi)箱即用

          首先從 官網(wǎng)的下載頁(yè)面 獲取 Prometheus 的最新版本和下載地址,目前最新版本是 2.4.3(2018年10月),執(zhí)行下面的命令下載并解壓:

          $ wget https://github.com/prometheus/prometheus/releases/download/v2.4.3/prometheus-2.4.3.linux-amd64.tar.gz
          $ tar xvfz prometheus-2.4.3.linux-amd64.tar.gz

          然后切換到解壓目錄,檢查 Prometheus 版本:

          $ cd prometheus-2.4.3.linux-amd64
          $ ./prometheus --version
          prometheus, version 2.4.3 (branch: HEAD, revision: 167a4b4e73a8eca8df648d2d2043e21bdb9a7449)
            build user:       root@1e42b46043e9
            build date:       20181004-08:42:02
            go version:       go1.11.1

          運(yùn)行 Prometheus server:

          $ ./prometheus --config.file=prometheus.yml

          2、使用 Docker 鏡像

          使用 Docker 安裝 Prometheus 更簡(jiǎn)單,運(yùn)行下面的命令即可:

          $ sudo docker run -d -p 9090:9090 prom/prometheus

          一般情況下,我們還會(huì)指定配置文件的位置:

          $ sudo docker run -d -p 9090:9090 \
              -v ~/docker/prometheus/:/etc/prometheus/ \
              prom/prometheus

          我們把配置文件放在本地 ~/docker/prometheus/prometheus.yml,這樣可以方便編輯和查看,通過(guò) -v 參數(shù)將本地的配置文件掛載到 /etc/prometheus/ 位置,這是 prometheus 在容器中默認(rèn)加載的配置文件位置。如果我們不確定默認(rèn)的配置文件在哪,可以先執(zhí)行上面的不帶 -v 參數(shù)的命令,然后通過(guò) docker inspect 命名看看容器在運(yùn)行時(shí)默認(rèn)的參數(shù)有哪些(下面的 Args 參數(shù)):

          $ sudo docker inspect 0c
          [...]
                  "Id""0c4c2d0eed938395bcecf1e8bb4b6b87091fc4e6385ce5b404b6bb7419010f46",
                  "Created""2018-10-15T22:27:34.56050369Z",
                  "Path""/bin/prometheus",
                  "Args": [
                      "--config.file=/etc/prometheus/prometheus.yml",
                      "--storage.tsdb.path=/prometheus",
                      "--web.console.libraries=/usr/share/prometheus/console_libraries",
                      "--web.console.templates=/usr/share/prometheus/consoles"
                  ],
          [...]

          3、配置 Prometheus

          正如上面兩節(jié)看到的,Prometheus 有一個(gè)配置文件,通過(guò)參數(shù) --config.file 來(lái)指定,配置文件格式為 YAML。我們可以打開(kāi)默認(rèn)的配置文件 prometheus.yml 看下里面的內(nèi)容:

          /etc/prometheus $ cat 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']

          Prometheus 默認(rèn)的配置文件分為四大塊:

          • global 塊:Prometheus 的全局配置,比如 scrape_interval 表示 Prometheus 多久抓取一次數(shù)據(jù),evaluation_interval 表示多久檢測(cè)一次告警規(guī)則;

          • alerting 塊:關(guān)于 Alertmanager 的配置,這個(gè)我們后面再看;

          • rule_files 塊:告警規(guī)則,這個(gè)我們后面再看;

          • scrape_config 塊:這里定義了 Prometheus 要抓取的目標(biāo),我們可以看到默認(rèn)已經(jīng)配置了一個(gè)名稱為 prometheus 的 job,這是因?yàn)?Prometheus 在啟動(dòng)的時(shí)候也會(huì)通過(guò) HTTP 接口暴露自身的指標(biāo)數(shù)據(jù),這就相當(dāng)于 Prometheus 自己監(jiān)控自己,雖然這在真正使用 Prometheus 時(shí)沒(méi)啥用處,但是我們可以通過(guò)這個(gè)例子來(lái)學(xué)習(xí)如何使用 Prometheus;可以訪問(wèn) http://localhost:9090/metrics 查看 Prometheus 暴露了哪些指標(biāo);

          更多的配置參數(shù)可以參考 這里 (https://prometheus.io/docs/prometheus/latest/configuration/configuration/)。

          學(xué)習(xí)PromQL

          通過(guò)上面的步驟安裝好 Prometheus 之后,我們現(xiàn)在可以開(kāi)始體驗(yàn) Prometheus 了。Prometheus 提供了可視化的 Web UI 方便我們操作,直接訪問(wèn) http://localhost:9090/ 即可,它默認(rèn)會(huì)跳轉(zhuǎn)到 Graph 頁(yè)面:

          第一次訪問(wèn)這個(gè)頁(yè)面可能會(huì)不知所措,我們可以先看看其他菜單下的內(nèi)容,比如:Alerts 展示了定義的所有告警規(guī)則,Status 可以查看各種 Prometheus 的狀態(tài)信息,有 Runtime & Build Information、Command-Line Flags、Configuration、Rules、Targets、Service Discovery 等等。

          實(shí)際上 Graph 頁(yè)面才是 Prometheus 最強(qiáng)大的功能,在這里我們可以使用 Prometheus 提供的一種特殊表達(dá)式來(lái)查詢監(jiān)控?cái)?shù)據(jù),這個(gè)表達(dá)式被稱為 PromQL(Prometheus Query Language)。通過(guò) PromQL 不僅可以在 Graph 頁(yè)面查詢數(shù)據(jù),而且還可以通過(guò) Prometheus 提供的 HTTP API 來(lái)查詢。查詢的監(jiān)控?cái)?shù)據(jù)有列表和曲線圖兩種展現(xiàn)形式(對(duì)應(yīng)上圖中 Console 和 Graph 這兩個(gè)標(biāo)簽)。

          我們上面說(shuō)過(guò),Prometheus 自身也暴露了很多的監(jiān)控指標(biāo),也可以在 Graph 頁(yè)面查詢,展開(kāi) Execute 按鈕旁邊的下拉框,可以看到很多指標(biāo)名稱,我們隨便選一個(gè),譬如:promhttp_metric_handler_requests_total,這個(gè)指標(biāo)表示 /metrics 頁(yè)面的訪問(wèn)次數(shù),Prometheus 就是通過(guò)這個(gè)頁(yè)面來(lái)抓取自身的監(jiān)控?cái)?shù)據(jù)的。在 Console 標(biāo)簽中查詢結(jié)果如下:

          上面在介紹 Prometheus 的配置文件時(shí),可以看到 scrape_interval 參數(shù)是 15s,也就是說(shuō) Prometheus 每 15s 訪問(wèn)一次 /metrics 頁(yè)面,所以我們過(guò) 15s 刷新下頁(yè)面,可以看到指標(biāo)值會(huì)自增。在 Graph 標(biāo)簽中可以看得更明顯:

          1、數(shù)據(jù)模型

          要學(xué)習(xí) PromQL,首先我們需要了解下 Prometheus 的數(shù)據(jù)模型,一條 Prometheus 數(shù)據(jù)由一個(gè)指標(biāo)名稱(metric)和 N 個(gè)標(biāo)簽(label,N >= 0)組成的,比如下面這個(gè)例子:

          promhttp_metric_handler_requests_total{code="200",instance="192.168.0.107:9090",job="prometheus"} 106

          這條數(shù)據(jù)的指標(biāo)名稱為 promhttp_metric_handler_requests_total,并且包含三個(gè)標(biāo)簽 code、instance 和 job,這條記錄的值為 106。上面說(shuō)過(guò),Prometheus 是一個(gè)時(shí)序數(shù)據(jù)庫(kù),相同指標(biāo)相同標(biāo)簽的數(shù)據(jù)構(gòu)成一條時(shí)間序列。如果以傳統(tǒng)數(shù)據(jù)庫(kù)的概念來(lái)理解時(shí)序數(shù)據(jù)庫(kù),可以把指標(biāo)名當(dāng)作表名,標(biāo)簽是字段,timestamp 是主鍵,還有一個(gè) float64 類型的字段表示值(Prometheus 里面所有值都是按 float64 存儲(chǔ))。

          這種數(shù)據(jù)模型和 OpenTSDB 的數(shù)據(jù)模型是比較類似的,詳細(xì)的信息可以參考官網(wǎng)文檔 Data model。另外,關(guān)于指標(biāo)和標(biāo)簽的命名,官網(wǎng)有一些指導(dǎo)性的建議,可以參考 Metric and label naming 。

          (https://prometheus.io/docs/practices/naming/)

          雖然 Prometheus 里存儲(chǔ)的數(shù)據(jù)都是 float64 的一個(gè)數(shù)值,但如果我們按類型來(lái)分,可以把 Prometheus 的數(shù)據(jù)分成四大類:

          • Counter

          • Gauge

          • Histogram

          • Summary

          Counter 用于計(jì)數(shù),例如:請(qǐng)求次數(shù)、任務(wù)完成數(shù)、錯(cuò)誤發(fā)生次數(shù),這個(gè)值會(huì)一直增加,不會(huì)減少。Gauge 就是一般的數(shù)值,可大可小,例如:溫度變化、內(nèi)存使用變化。Histogram 是直方圖,或稱為柱狀圖,常用于跟蹤事件發(fā)生的規(guī)模,例如:請(qǐng)求耗時(shí)、響應(yīng)大小。它特別之處是可以對(duì)記錄的內(nèi)容進(jìn)行分組,提供 count 和 sum 的功能。Summary 和 Histogram 十分相似,也用于跟蹤事件發(fā)生的規(guī)模,不同之處是,它提供了一個(gè) quantiles 的功能,可以按百分比劃分跟蹤的結(jié)果。例如:quantile 取值 0.95,表示取采樣值里面的 95% 數(shù)據(jù)。更多信息可以參考官網(wǎng)文檔 Metric types(https://prometheus.io/docs/concepts/metric_types/),Summary 和 Histogram 的概念比較容易混淆,屬于比較高階的指標(biāo)類型,可以參考 Histograms and summaries (https://prometheus.io/docs/practices/histograms/)這里的說(shuō)明。

          這四種類型的數(shù)據(jù)只在指標(biāo)的提供方作區(qū)分,也就是上面說(shuō)的 Exporter,如果你需要編寫自己的 Exporter 或者在現(xiàn)有系統(tǒng)中暴露供 Prometheus 抓取的指標(biāo),你可以使用 Prometheus client libraries(https://prometheus.io/docs/instrumenting/clientlibs/),這個(gè)時(shí)候你就需要考慮不同指標(biāo)的數(shù)據(jù)類型了。如果你不用自己實(shí)現(xiàn),而是直接使用一些現(xiàn)成的 Exporter,然后在 Prometheus 里查查相關(guān)的指標(biāo)數(shù)據(jù),那么可以不用太關(guān)注這塊,不過(guò)理解 Prometheus 的數(shù)據(jù)類型,對(duì)寫出正確合理的 PromQL 也是有幫助的。

          2、PromQL 入門

          我們從一些例子開(kāi)始學(xué)習(xí) PromQL,最簡(jiǎn)單的 PromQL 就是直接輸入指標(biāo)名稱,比如:

          # 表示 Prometheus 能否抓取 target 的指標(biāo),用于 target 的健康檢查
          up

          這條語(yǔ)句會(huì)查出 Prometheus 抓取的所有 target 當(dāng)前運(yùn)行情況,譬如下面這樣:

          up{instance="192.168.0.107:9090",job="prometheus"}    1
          up{instance="192.168.0.108:9090",job="prometheus"}    1
          up{instance="192.168.0.107:9100",job="server"}    1
          up{instance="192.168.0.108:9104",job="mysql"}    0

          也可以指定某個(gè) label 來(lái)查詢:

          up{job="prometheus"}

          這種寫法被稱為 Instant vector selectors,這里不僅可以使用 = 號(hào),還可以使用 !=、=~、!~,比如下面這樣:

          up{job!="prometheus"}
          up{job=~"server|mysql"}
          up{job=~"192\.168\.0\.107.+"}

          =~ 是根據(jù)正則表達(dá)式來(lái)匹配,必須符合 RE2 的語(yǔ)法。
          和 Instant vector selectors 相應(yīng)的,還有一種選擇器,叫做 Range vector selectors,它可以查出一段時(shí)間內(nèi)的所有數(shù)據(jù):

          http_requests_total[5m]

          這條語(yǔ)句查出 5 分鐘內(nèi)所有抓取的 HTTP 請(qǐng)求數(shù),注意它返回的數(shù)據(jù)類型是 Range vector,沒(méi)辦法在 Graph 上顯示成曲線圖,一般情況下,會(huì)用在 Counter 類型的指標(biāo)上,并和 rate() 或 irate() 函數(shù)一起使用(注意 rate 和 irate 的區(qū)別)。

          # 計(jì)算的是每秒的平均值,適用于變化很慢的 counter
          # per-second average rate of increase, for slow-moving counters
          rate(http_requests_total[5m])

          #
           計(jì)算的是每秒瞬時(shí)增加速率,適用于變化很快的 counter
          # per-second instant rate of increase, for volatile and fast-moving counters
          irate(http_requests_total[5m])

          此外,PromQL 還支持 count、sum、min、max、topk 等 聚合操作,還支持 rate、abs、ceil、floor 等一堆的 內(nèi)置函數(shù),更多的例子,還是上官網(wǎng)學(xué)習(xí)吧。如果感興趣,我們還可以把 PromQL 和 SQL 做一個(gè)對(duì)比,會(huì)發(fā)現(xiàn) PromQL 語(yǔ)法更簡(jiǎn)潔,查詢性能也更高。

          3、HTTP API

          我們不僅僅可以在 Prometheus 的 Graph 頁(yè)面查詢 PromQL,Prometheus 還提供了一種 HTTP API 的方式,可以更靈活的將 PromQL 整合到其他系統(tǒng)中使用,譬如下面要介紹的 Grafana,就是通過(guò) Prometheus 的 HTTP API 來(lái)查詢指標(biāo)數(shù)據(jù)的。實(shí)際上,我們?cè)?Prometheus 的 Graph 頁(yè)面查詢也是使用了 HTTP API。

          我們看下 Prometheus 的 HTTP API 官方文檔,它提供了下面這些接口:

          • GET /api/v1/query

          • GET /api/v1/query_range

          • GET /api/v1/series

          • GET /api/v1/label/

            /values
          • GET /api/v1/targets

          • GET /api/v1/rules

          • GET /api/v1/alerts

          • GET /api/v1/targets/metadata

          • GET /api/v1/alertmanagers

          • GET /api/v1/status/config

          • GET /api/v1/status/flags

          從 Prometheus v2.1 開(kāi)始,又新增了幾個(gè)用于管理 TSDB 的接口:

          • POST /api/v1/admin/tsdb/snapshot

          • POST /api/v1/admin/tsdb/delete_series

          • POST /api/v1/admin/tsdb/clean_tombstones

          安裝Grafana

          雖然 Prometheus 提供的 Web UI 也可以很好的查看不同指標(biāo)的視圖,但是這個(gè)功能非常簡(jiǎn)單,只適合用來(lái)調(diào)試。要實(shí)現(xiàn)一個(gè)強(qiáng)大的監(jiān)控系統(tǒng),還需要一個(gè)能定制展示不同指標(biāo)的面板,能支持不同類型的展現(xiàn)方式(曲線圖、餅狀圖、熱點(diǎn)圖、TopN 等),這就是儀表盤(Dashboard)功能。因此 Prometheus 開(kāi)發(fā)了一套儀表盤系統(tǒng) PromDash,不過(guò)很快這套系統(tǒng)就被廢棄了,官方開(kāi)始推薦使用 Grafana 來(lái)對(duì) Prometheus 的指標(biāo)數(shù)據(jù)進(jìn)行可視化,這不僅是因?yàn)?Grafana 的功能非常強(qiáng)大,而且它和 Prometheus 可以完美的無(wú)縫融合。

          Grafana 是一個(gè)用于可視化大型測(cè)量數(shù)據(jù)的開(kāi)源系統(tǒng),它的功能非常強(qiáng)大,界面也非常漂亮,使用它可以創(chuàng)建自定義的控制面板,你可以在面板中配置要顯示的數(shù)據(jù)和顯示方式,它 支持很多不同的數(shù)據(jù)源,比如:Graphite、InfluxDB、OpenTSDB、Elasticsearch、Prometheus 等,而且它也 支持眾多的插件。

          下面我們就體驗(yàn)下使用 Grafana 來(lái)展示 Prometheus 的指標(biāo)數(shù)據(jù)。首先我們來(lái)安裝 Grafana,我們使用最簡(jiǎn)單的 Docker 安裝方式:

          $ docker run -d -p 3000:3000 grafana/grafana

          運(yùn)行上面的 docker 命令,Grafana 就安裝好了!你也可以采用其他的安裝方式,參考 官方的安裝文檔。安裝完成之后,我們?cè)L問(wèn) http://localhost:3000/ 進(jìn)入 Grafana 的登陸頁(yè)面,輸入默認(rèn)的用戶名和密碼(admin/admin)即可。

          要使用 Grafana,第一步當(dāng)然是要配置數(shù)據(jù)源,告訴 Grafana 從哪里取數(shù)據(jù),我們點(diǎn)擊 Add data source 進(jìn)入數(shù)據(jù)源的配置頁(yè)面:

          我們?cè)谶@里依次填上:

          • Name: prometheus

          • Type: Prometheus

          • URL: http://localhost:9090

          • Access: Browser

          要注意的是,這里的 Access 指的是 Grafana 訪問(wèn)數(shù)據(jù)源的方式,有 Browser 和 Proxy 兩種方式。Browser 方式表示當(dāng)用戶訪問(wèn) Grafana 面板時(shí),瀏覽器直接通過(guò) URL 訪問(wèn)數(shù)據(jù)源的;而 Proxy 方式表示瀏覽器先訪問(wèn) Grafana 的某個(gè)代理接口(接口地址是 /api/datasources/proxy/),由 Grafana 的服務(wù)端來(lái)訪問(wèn)數(shù)據(jù)源的 URL,如果數(shù)據(jù)源是部署在內(nèi)網(wǎng),用戶通過(guò)瀏覽器無(wú)法直接訪問(wèn)時(shí),這種方式非常有用。

          配置好數(shù)據(jù)源,Grafana 會(huì)默認(rèn)提供幾個(gè)已經(jīng)配置好的面板供你使用,如下圖所示,默認(rèn)提供了三個(gè)面板:Prometheus Stats、Prometheus 2.0 Stats 和 Grafana metrics。點(diǎn)擊 Import 就可以導(dǎo)入并使用該面板。

          我們導(dǎo)入 Prometheus 2.0 Stats 這個(gè)面板,可以看到下面這樣的監(jiān)控面板。如果你的公司有條件,可以申請(qǐng)個(gè)大顯示器掛在墻上,將這個(gè)面板投影在大屏上,實(shí)時(shí)觀察線上系統(tǒng)的狀態(tài),可以說(shuō)是非常 cool 的。

          使用Exporter收集指標(biāo)

          目前為止,我們看到的都還只是一些沒(méi)有實(shí)際用途的指標(biāo),如果我們要在我們的生產(chǎn)環(huán)境真正使用 Prometheus,往往需要關(guān)注各種各樣的指標(biāo),譬如服務(wù)器的 CPU負(fù)載、內(nèi)存占用量、IO開(kāi)銷、入網(wǎng)和出網(wǎng)流量等等。正如上面所說(shuō),Prometheus 是使用 Pull 的方式來(lái)獲取指標(biāo)數(shù)據(jù)的,要讓 Prometheus 從目標(biāo)處獲得數(shù)據(jù),首先必須在目標(biāo)上安裝指標(biāo)收集的程序,并暴露出 HTTP 接口供 Prometheus 查詢,這個(gè)指標(biāo)收集程序被稱為 Exporter,不同的指標(biāo)需要不同的 Exporter 來(lái)收集,目前已經(jīng)有大量的 Exporter 可供使用,幾乎囊括了我們常用的各種系統(tǒng)和軟件,官網(wǎng)列出了一份 常用 Exporter 的清單,各個(gè) Exporter 都遵循一份端口約定,避免端口沖突,即從 9100 開(kāi)始依次遞增,這里是 完整的 Exporter 端口列表。另外值得注意的是,有些軟件和系統(tǒng)無(wú)需安裝 Exporter,這是因?yàn)樗麄儽旧砭吞峁┝吮┞?Prometheus 格式的指標(biāo)數(shù)據(jù)的功能,比如 Kubernetes、Grafana、Etcd、Ceph 等。

          這一節(jié)就讓我們來(lái)收集一些有用的數(shù)據(jù)。

          1、收集服務(wù)器指標(biāo)

          首先我們來(lái)收集服務(wù)器的指標(biāo),這需要安裝 node_exporter,這個(gè) exporter 用于收集 *NIX 內(nèi)核的系統(tǒng),如果你的服務(wù)器是 Windows,可以使用 WMI exporter。

          和 Prometheus server 一樣,node_exporter 也是開(kāi)箱即用的:

          $ wget https://github.com/prometheus/node_exporter/releases/download/v0.16.0/node_exporter-0.16.0.linux-amd64.tar.gz
          $ tar xvfz node_exporter-0.16.0.linux-amd64.tar.gz
          $ cd node_exporter-0.16.0.linux-amd64
          $ ./node_exporter

          node_exporter 啟動(dòng)之后,我們?cè)L問(wèn)下 /metrics 接口看看是否能正常獲取服務(wù)器指標(biāo):

          $ curl http://localhost:9100/metrics

          如果一切 OK,我們可以修改 Prometheus 的配置文件,將服務(wù)器加到 scrape_configs 中:

          scrape_configs:
            - job_name: 'prometheus'
              static_configs:
                - targets: ['192.168.0.107:9090']
            - job_name: 'server'
              static_configs:
                - targets: ['192.168.0.107:9100']

          修改配置后,需要重啟 Prometheus 服務(wù),或者發(fā)送 HUP 信號(hào)也可以讓 Prometheus 重新加載配置:

          $ killall -HUP prometheus

          在 Prometheus Web UI 的 Status -> Targets 中,可以看到新加的服務(wù)器:

          在 Graph 頁(yè)面的指標(biāo)下拉框可以看到很多名稱以 node 開(kāi)頭的指標(biāo),譬如我們輸入 node_load1 觀察服務(wù)器負(fù)載:

          如果想在 Grafana 中查看服務(wù)器的指標(biāo),可以在 Grafana 的 Dashboards 頁(yè)面 搜索 node exporter,有很多的面板模板可以直接使用,譬如:Node Exporter Server Metrics 或者 Node Exporter Full 等。我們打開(kāi) Grafana 的 Import dashboard 頁(yè)面,輸入面板的 URL(https://grafana.com/dashboards/405)或者 ID(405)即可。

          注意事項(xiàng)

          一般情況下,node_exporter 都是直接運(yùn)行在要收集指標(biāo)的服務(wù)器上的,官方不推薦用 Docker 來(lái)運(yùn)行 node_exporter。如果逼不得已一定要運(yùn)行在 Docker 里,要特別注意,這是因?yàn)?Docker 的文件系統(tǒng)和網(wǎng)絡(luò)都有自己的 namespace,收集的數(shù)據(jù)并不是宿主機(jī)真實(shí)的指標(biāo)。可以使用一些變通的方法,比如運(yùn)行 Docker 時(shí)加上下面這樣的參數(shù):

          docker run -d \
            --net="host" \
            --pid="host" \
            -v "/:/host:ro,rslave" \
            quay.io/prometheus/node-exporter \
            --path.rootfs /host

          關(guān)于 node_exporter 的更多信息,可以參考 node_exporter 的文檔 和 Prometheus 的官方指南 Monitoring Linux host metrics with the Node Exporter,另外,Julius Volz 的這篇文章 How To Install Prometheus using Docker on Ubuntu 14.04 也是很好的入門材料。

          2、收集 MySQL 指標(biāo)

          mysqld_exporter 是 Prometheus 官方提供的一個(gè) exporter,我們首先 下載最新版本 并解壓(開(kāi)箱即用):

          $ wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.linux-amd64.tar.gz
          $ tar xvfz mysqld_exporter-0.11.0.linux-amd64.tar.gz
          $ cd mysqld_exporter-0.11.0.linux-amd64/

          mysqld_exporter 需要連接到 mysqld 才能收集它的指標(biāo),可以通過(guò)兩種方式來(lái)設(shè)置 mysqld 數(shù)據(jù)源。第一種是通過(guò)環(huán)境變量 DATA_SOURCE_NAME,這被稱為 DSN(數(shù)據(jù)源名稱),它必須符合 DSN 的格式,一個(gè)典型的 DSN 格式像這樣:user:password@(host:port)/。

          $ export DATA_SOURCE_NAME='root:123456@(192.168.0.107:3306)/'
          $ ./mysqld_exporter
          另一種方式是通過(guò)配置文

          另一種方式是通過(guò)配置文件,默認(rèn)的配置文件是 ~/.my.cnf,或者通過(guò) --config.my-cnf 參數(shù)指定:

          $ ./mysqld_exporter --config.my-cnf=".my.cnf"

          配置文件的格式如下:

          $ cat .my.cnf
          [client]
          host=localhost
          port=3306
          user=root
          password=123456

          如果要把 MySQL 的指標(biāo)導(dǎo)入 Grafana,可以參考 這些 Dashboard JSON。

          (https://github.com/percona/grafana-dashboards)

          注意事項(xiàng)

          這里為簡(jiǎn)單起見(jiàn),在 mysqld_exporter 中直接使用了 root 連接數(shù)據(jù)庫(kù),在真實(shí)環(huán)境中,可以為 mysqld_exporter 創(chuàng)建一個(gè)單獨(dú)的用戶,并賦予它受限的權(quán)限(PROCESS、REPLICATION CLIENT、SELECT),最好還限制它的最大連接數(shù)(MAX_USER_CONNECTIONS)。

          CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'password' WITH MAX_USER_CONNECTIONS 3;
          GRANT PROCESS, REPLICATION CLIENTSELECT ON *.* TO 'exporter'@'localhost';

          3、收集 Nginx 指標(biāo)

          官方提供了兩種收集 Nginx 指標(biāo)的方式。第一種是 Nginx metric library,這是一段 Lua 腳本(prometheus.lua),Nginx 需要開(kāi)啟 Lua 支持(libnginx-mod-http-lua 模塊)。為方便起見(jiàn),也可以使用 OpenResty 的 OPM(OpenResty Package Manager) 或者 luarocks(The Lua package manager) 來(lái)安裝。第二種是 Nginx VTS exporter,這種方式比第一種要強(qiáng)大的多,安裝要更簡(jiǎn)單,支持的指標(biāo)也更豐富,它依賴于 nginx-module-vts 模塊,vts 模塊可以提供大量的 Nginx 指標(biāo)數(shù)據(jù),可以通過(guò) JSON、HTML 等形式查看這些指標(biāo)。Nginx VTS exporter 就是通過(guò)抓取 /status/format/json 接口來(lái)將 vts 的數(shù)據(jù)格式轉(zhuǎn)換為 Prometheus 的格式。

          不過(guò),在 nginx-module-vts 最新的版本中增加了一個(gè)新接口:/status/format/prometheus,這個(gè)接口可以直接返回 Prometheus 的格式,從這點(diǎn)這也能看出 Prometheus 的影響力,估計(jì) Nginx VTS exporter 很快就要退役了(TODO:待驗(yàn)證)。

          除此之外,還有很多其他的方式來(lái)收集 Nginx 的指標(biāo),比如:nginx_exporter 通過(guò)抓取 Nginx 自帶的統(tǒng)計(jì)頁(yè)面 /nginx_status 可以獲取一些比較簡(jiǎn)單的指標(biāo)(需要開(kāi)啟 ngx_http_stub_status_module 模塊);nginx_request_exporter 通過(guò) syslog 協(xié)議 收集并分析 Nginx 的 access log 來(lái)統(tǒng)計(jì) HTTP 請(qǐng)求相關(guān)的一些指標(biāo);nginx-prometheus-shiny-exporter 和 nginx_request_exporter 類似,也是使用 syslog 協(xié)議來(lái)收集 access log,不過(guò)它是使用 Crystal 語(yǔ)言 寫的。還有 vovolie/lua-nginx-prometheus 基于 Openresty、Prometheus、Consul、Grafana 實(shí)現(xiàn)了針對(duì)域名和 Endpoint 級(jí)別的流量統(tǒng)計(jì)。

          有需要或感興趣的同學(xué)可以對(duì)照說(shuō)明文檔自己安裝體驗(yàn)下,這里就不一一嘗試了。

          4、收集 JMX 指標(biāo)

          最后讓我們來(lái)看下如何收集 Java 應(yīng)用的指標(biāo),Java 應(yīng)用的指標(biāo)一般是通過(guò) JMX(Java Management Extensions) 來(lái)獲取的,顧名思義,JMX 是管理 Java 的一種擴(kuò)展,它可以方便的管理和監(jiān)控正在運(yùn)行的 Java 程序。

          JMX Exporter 用于收集 JMX 指標(biāo),很多使用 Java 的系統(tǒng),都可以使用它來(lái)收集指標(biāo),比如:Kafaka、Cassandra 等。首先我們下載 JMX Exporter:

          $ wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.3.1/jmx_prometheus_javaagent-0.3.1.jar

          JMX Exporter 是一個(gè) Java Agent 程序,在運(yùn)行 Java 程序時(shí)通過(guò) -javaagent 參數(shù)來(lái)加載:

          $ java -javaagent:jmx_prometheus_javaagent-0.3.1.jar=9404:config.yml -jar spring-boot-sample-1.0-SNAPSHOT.jar

          其中,9404 是 JMX Exporter 暴露指標(biāo)的端口,config.yml 是 JMX Exporter 的配置文件,它的內(nèi)容可以 參考 JMX Exporter 的配置說(shuō)明 。然后檢查下指標(biāo)數(shù)據(jù)是否正確獲取:

          $ curl http://localhost:9404/metrics

          告警和通知

          至此,我們能收集大量的指標(biāo)數(shù)據(jù),也能通過(guò)強(qiáng)大而美觀的面板展示出來(lái)。不過(guò)作為一個(gè)監(jiān)控系統(tǒng),最重要的功能,還是應(yīng)該能及時(shí)發(fā)現(xiàn)系統(tǒng)問(wèn)題,并及時(shí)通知給系統(tǒng)負(fù)責(zé)人,這就是 Alerting(告警)。Prometheus 的告警功能被分成兩部分:一個(gè)是告警規(guī)則的配置和檢測(cè),并將告警發(fā)送給 Alertmanager,另一個(gè)是 Alertmanager,它負(fù)責(zé)管理這些告警,去除重復(fù)數(shù)據(jù),分組,并路由到對(duì)應(yīng)的接收方式,發(fā)出報(bào)警。常見(jiàn)的接收方式有:Email、PagerDuty、HipChat、Slack、OpsGenie、WebHook 等。

          1、配置告警規(guī)則

          我們?cè)谏厦娼榻B Prometheus 的配置文件時(shí)了解到,它的默認(rèn)配置文件 prometheus.yml 有四大塊:global、alerting、rule_files、scrape_config,其中 rule_files 塊就是告警規(guī)則的配置項(xiàng),alerting 塊用于配置 Alertmanager,這個(gè)我們下一節(jié)再看。現(xiàn)在,先讓我們?cè)?rule_files 塊中添加一個(gè)告警規(guī)則文件:

          rule_files:
            - "alert.rules"

          然后參考 官方文檔,創(chuàng)建一個(gè)告警規(guī)則文件 alert.rules:

          groups:
          - name: example
            rules:

            # Alert for any instance that is unreachable for >5 minutes.
            - alert: InstanceDown
              expr: up == 0
              for5m
              labels:
                severity: page
              annotations:
                summary: "Instance {{ $labels.instance }} down"
                description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."

            # Alert for any instance that has a median request latency >1s.
            - alert: APIHighRequestLatency
              expr: api_http_request_latencies_second{quantile="0.5"} > 1
              for10m
              annotations:
                summary: "High request latency on {{ $labels.instance }}"
                description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"

          這個(gè)規(guī)則文件里,包含了兩條告警規(guī)則:InstanceDown 和 APIHighRequestLatency。顧名思義,InstanceDown 表示當(dāng)實(shí)例宕機(jī)時(shí)(up === 0)觸發(fā)告警,APIHighRequestLatency 表示有一半的 API 請(qǐng)求延遲大于 1s 時(shí)(api_http_request_latencies_second{quantile="0.5"} > 1)觸發(fā)告警。配置好后,需要重啟下 Prometheus server,然后訪問(wèn) http://localhost:9090/rules 可以看到剛剛配置的規(guī)則:

          訪問(wèn) http://localhost:9090/alerts 可以看到根據(jù)配置的規(guī)則生成的告警:

          這里我們將一個(gè)實(shí)例停掉,可以看到有一條 alert 的狀態(tài)是 PENDING,這表示已經(jīng)觸發(fā)了告警規(guī)則,但還沒(méi)有達(dá)到告警條件。這是因?yàn)檫@里配置的 for 參數(shù)是 5m,也就是 5 分鐘后才會(huì)觸發(fā)告警,我們等 5 分鐘,可以看到這條 alert 的狀態(tài)變成了 FIRING。

          2、使用 Alertmanager 發(fā)送告警通知

          雖然 Prometheus 的 /alerts 頁(yè)面可以看到所有的告警,但是還差最后一步:觸發(fā)告警時(shí)自動(dòng)發(fā)送通知。這是由 Alertmanager 來(lái)完成的,我們首先 下載并安裝 Alertmanager,和其他 Prometheus 的組件一樣,Alertmanager 也是開(kāi)箱即用的:

          $ wget https://github.com/prometheus/alertmanager/releases/download/v0.15.2/alertmanager-0.15.2.linux-amd64.tar.gz
          $ tar xvfz alertmanager-0.15.2.linux-amd64.tar.gz
          $ cd alertmanager-0.15.2.linux-amd64
          $ ./alertmanager

          Alertmanager 啟動(dòng)后默認(rèn)可以通過(guò) http://localhost:9093/ 來(lái)訪問(wèn),但是現(xiàn)在還看不到告警,因?yàn)槲覀冞€沒(méi)有把 Alertmanager 配置到 Prometheus 中,我們回到 Prometheus 的配置文件 prometheus.yml,添加下面幾行:

          alerting:
            alertmanagers:
            - schemehttp
              static_configs:
              - targets:
                - "192.168.0.107:9093"

          這個(gè)配置告訴 Prometheus,當(dāng)發(fā)生告警時(shí),將告警信息發(fā)送到 Alertmanager,Alertmanager 的地址為 http://192.168.0.107:9093。也可以使用命名行的方式指定 Alertmanager:

          $ ./prometheus -alertmanager.url=http://192.168.0.107:9093

          這個(gè)時(shí)候再訪問(wèn) Alertmanager,可以看到 Alertmanager 已經(jīng)接收到告警了:

          下面的問(wèn)題就是如何讓 Alertmanager 將告警信息發(fā)送給我們了,我們打開(kāi)默認(rèn)的配置文件 alertmanager.ym:

          global:
            resolve_timeout: 5m

          route:
            group_by: ['alertname']
            group_wait: 10s
            group_interval: 10s
            repeat_interval: 1h
            receiver: 'web.hook'
          receivers:
          - name: 'web.hook'
            webhook_configs:
            - url: 'http://127.0.0.1:5001/'
          inhibit_rules:
            - source_match:
                severity: 'critical'
              target_match:
                severity: 'warning'
              equal: ['alertname''dev''instance']

          參考 官方的配置手冊(cè) 了解各個(gè)配置項(xiàng)的功能,其中 global 塊表示一些全局配置;route 塊表示通知路由,可以根據(jù)不同的標(biāo)簽將告警通知發(fā)送給不同的 receiver,這里沒(méi)有配置 routes 項(xiàng),表示所有的告警都發(fā)送給下面定義的 web.hook 這個(gè) receiver;如果要配置多個(gè)路由,可以參考 這個(gè)例子:

          routes:
          - receiver: 'database-pager'
            group_wait: 10s
            match_re:
              service: mysql|cassandra

          - receiver: 'frontend-pager'
            group_by: [product, environment]
            match:
              team: frontend

          緊接著,receivers 塊表示告警通知的接收方式,每個(gè) receiver 包含一個(gè) name 和一個(gè) xxx_configs,不同的配置代表了不同的接收方式,Alertmanager 內(nèi)置了下面這些接收方式:

          • email_config

          • hipchat_config

          • pagerduty_config

          • pushover_config

          • slack_config

          • opsgenie_config

          • victorops_config

          • wechat_configs

          • webhook_config

          雖然接收方式很豐富,但是在國(guó)內(nèi),其中大多數(shù)接收方式都很少使用。最常用到的,莫屬 email_config 和 webhook_config,另外 wechat_configs 可以支持使用微信來(lái)告警,也是相當(dāng)符合國(guó)情的了。

          其實(shí)告警的通知方式是很難做到面面俱到的,因?yàn)橄④浖鞣N各樣,每個(gè)國(guó)家還可能不同,不可能完全覆蓋到,所以 Alertmanager 已經(jīng)決定不再添加新的 receiver 了,而是推薦使用 webhook 來(lái)集成自定義的接收方式。可以參考 這些集成的例子,譬如 將釘釘接入 Prometheus AlertManager WebHook。

          (http://theo.im/blog/2017/10/16/release-prometheus-alertmanager-webhook-for-dingtalk/)

          學(xué)習(xí)更多

          到這里,我們已經(jīng)學(xué)習(xí)了 Prometheus 的大多數(shù)功能,結(jié)合 Prometheus + Grafana + Alertmanager 完全可以搭建一套非常完整的監(jiān)控系統(tǒng)。不過(guò)在真正使用時(shí),我們會(huì)發(fā)現(xiàn)更多的問(wèn)題。

          1、服務(wù)發(fā)現(xiàn)

          由于 Prometheus 是通過(guò) Pull 的方式主動(dòng)獲取監(jiān)控?cái)?shù)據(jù),所以需要手工指定監(jiān)控節(jié)點(diǎn)的列表,當(dāng)監(jiān)控的節(jié)點(diǎn)增多之后,每次增加節(jié)點(diǎn)都需要更改配置文件,非常麻煩,這個(gè)時(shí)候就需要通過(guò)服務(wù)發(fā)現(xiàn)(service discovery,SD)機(jī)制去解決。Prometheus 支持多種服務(wù)發(fā)現(xiàn)機(jī)制,可以自動(dòng)獲取要收集的 targets,可以參考 這里,包含的服務(wù)發(fā)現(xiàn)機(jī)制包括:azure、consul、dns、ec2、openstack、file、gce、kubernetes、marathon、triton、zookeeper(nerve、serverset),配置方法可以參考手冊(cè)的 Configuration 頁(yè)面。可以說(shuō) SD 機(jī)制是非常豐富的,但目前由于開(kāi)發(fā)資源有限,已經(jīng)不再開(kāi)發(fā)新的 SD 機(jī)制,只對(duì)基于文件的 SD 機(jī)制進(jìn)行維護(hù)。

          關(guān)于服務(wù)發(fā)現(xiàn)網(wǎng)上有很多教程,譬如 Prometheus 官方博客中這篇文章 Advanced Service Discovery in Prometheus 0.14.0 對(duì)此有一個(gè)比較系統(tǒng)的介紹,全面的講解了 relabeling 配置,以及如何使用 DNS-SRV、Consul 和文件來(lái)做服務(wù)發(fā)現(xiàn)。另外,官網(wǎng)還提供了 一個(gè)基于文件的服務(wù)發(fā)現(xiàn)的入門例子,Julius Volz 寫的 Prometheus workshop 入門教程中也 使用了 DNS-SRV 來(lái)當(dāng)服務(wù)發(fā)現(xiàn)。

          2、告警配置管理

          無(wú)論是 Prometheus 的配置還是 Alertmanager 的配置,都沒(méi)有提供 API 供我們動(dòng)態(tài)的修改。一個(gè)很常見(jiàn)的場(chǎng)景是,我們需要基于 Prometheus 做一套可自定義規(guī)則的告警系統(tǒng),用戶可根據(jù)自己的需要在頁(yè)面上創(chuàng)建修改或刪除告警規(guī)則,或者是修改告警通知方式和聯(lián)系人,正如在 Prometheus Google Groups 里的 這個(gè)用戶的問(wèn)題:How to dynamically add alerts rules in rules.conf and prometheus yml file via API or something?不過(guò)遺憾的是,Simon Pasquier 在下面說(shuō)到,目前并沒(méi)有這樣的 API,而且以后也沒(méi)有這樣的計(jì)劃來(lái)開(kāi)發(fā)這樣的 API,因?yàn)檫@樣的功能更應(yīng)該交給譬如 Puppet、Chef、Ansible、Salt 這樣的配置管理系統(tǒng)。

          3、使用 Pushgateway

          Pushgateway 主要用于收集一些短期的 jobs,由于這類 jobs 存在時(shí)間較短,可能在 Prometheus 來(lái) Pull 之前就消失了。官方對(duì) 什么時(shí)候該使用 Pushgateway 有一個(gè)很好的說(shuō)明。

          總結(jié)

          這篇博客參考了網(wǎng)絡(luò)上大量關(guān)于 Prometheus 的中文資料,有文檔,也有博客,比如 1046102779 的 Prometheus 非官方中文手冊(cè),宋佳洋 的電子書(shū)《Prometheus 實(shí)戰(zhàn)》,在這里對(duì)這些原作者表示敬意。在 Prometheus 官方文檔的 Media 頁(yè)面,也提供了很多學(xué)習(xí)資源。

          關(guān)于 Prometheus,還有非常重要的一部分內(nèi)容這篇博客沒(méi)有涉及到,正如博客一開(kāi)頭所講的,Prometheus 是繼 Kubernetes 之后第二個(gè)加入 CNCF 的項(xiàng)目,Prometheus 和 Docker、Kubernetes 的結(jié)合非常緊密,使用 Prometheus 作為 Docker 和 Kubernetes 的監(jiān)控系統(tǒng)也越來(lái)越主流。關(guān)于 Docker 的監(jiān)控,可以參考官網(wǎng)的一篇指南:Monitoring Docker container metrics using cAdvisor,它介紹了如何使用 cAdvisor 來(lái)對(duì)容器進(jìn)行監(jiān)控;不過(guò) Docker 現(xiàn)在也開(kāi)始原生支持 Prometheus 的監(jiān)控了,參考 Docker 的官方文檔 Collect Docker metrics with Prometheus;關(guān)于 Kubernetes 的監(jiān)控,Kubernetes 中文社區(qū) 里有不少關(guān)于 Promehtheus 的資源,另外,《如何以優(yōu)雅的姿勢(shì)監(jiān)控 Kubernetes》這本電子書(shū)也對(duì) Kubernetes 的監(jiān)控有一個(gè)比較全面的介紹。

          最近兩年 Prometheus 的發(fā)展非常迅速,社區(qū)也非常活躍,國(guó)內(nèi)研究 Prometheus 的人也越來(lái)越多。隨著微服務(wù),DevOps,云計(jì)算,云原生等概念的普及,越來(lái)越多的企業(yè)開(kāi)始使用 Docker 和 Kubernetes 來(lái)構(gòu)建自己的系統(tǒng)和應(yīng)用,像 Nagios 和 Cacti 這樣的老牌監(jiān)控系統(tǒng)會(huì)變得越來(lái)越不適用,相信 Prometheus 最終會(huì)發(fā)展成一個(gè)最適合云環(huán)境的監(jiān)控系統(tǒng)。

          附錄:什么是時(shí)序數(shù)據(jù)庫(kù)?

          上文提到 Prometheus 是一款基于時(shí)序數(shù)據(jù)庫(kù)的監(jiān)控系統(tǒng),時(shí)序數(shù)據(jù)庫(kù)常簡(jiǎn)寫為 TSDB(Time Series Database)。很多流行的監(jiān)控系統(tǒng)都在使用時(shí)序數(shù)據(jù)庫(kù)來(lái)保存數(shù)據(jù),這是因?yàn)闀r(shí)序數(shù)據(jù)庫(kù)的特點(diǎn)和監(jiān)控系統(tǒng)不謀而合。

          • 增:需要頻繁的進(jìn)行寫操作,而且是按時(shí)間排序順序?qū)懭?/span>

          • 刪:不需要隨機(jī)刪除,一般情況下會(huì)直接刪除一個(gè)時(shí)間區(qū)塊的所有數(shù)據(jù)

          • 改:不需要對(duì)寫入的數(shù)據(jù)進(jìn)行更新

          • 查:需要支持高并發(fā)的讀操作,讀操作是按時(shí)間順序升序或降序讀,數(shù)據(jù)量非常大,緩存不起作用

          DB-Engines 上有一個(gè)關(guān)于時(shí)序數(shù)據(jù)庫(kù)的排名,下面是排名靠前的幾個(gè)(2018年10月):

          • InfluxDB:https://influxdata.com/

          • Kdb+:http://kx.com/

          • Graphite:http://graphiteapp.org/

          • RRDtool:http://oss.oetiker.ch/rrdtool/

          • OpenTSDB:http://opentsdb.net/

          • Prometheus:https://prometheus.io/

          • Druid:http://druid.io/

          另外,liubin 在他的博客上寫了一個(gè)關(guān)于時(shí)序數(shù)據(jù)庫(kù)的系列文章:時(shí)序列數(shù)據(jù)庫(kù)武斗大會(huì)(http://liubin.org/blog/2016/02/18/tsdb-intro/),推薦。

          參考

          • Prometheus 官方文檔【英文】

          • Prometheus 官方文檔【中文】

          • The History of Prometheus at SoundCloud

          • Prometheus: Monitoring at SoundCloud

          • Google And Friends Add Prometheus To Kubernetes Platform

          • 云原生架構(gòu)概述

          • 還不了解 CNCF?關(guān)于 CNCF 的三問(wèn)三答!

          • 時(shí)序列數(shù)據(jù)庫(kù)武斗大會(huì)之什么是TSDB

          • 時(shí)序列數(shù)據(jù)庫(kù)武斗大會(huì)之TSDB名錄 Part 1

          • Prometheus 入門

          • Prometheus 初探

          • 監(jiān)控利器之 Prometheus

          • 使用Prometheus+Grafana監(jiān)控MySQL實(shí)踐

          • 使用Prometheus+grafana打造高逼格監(jiān)控平臺(tái)

          • 初試 Prometheus + Grafana 監(jiān)控系統(tǒng)搭建并監(jiān)控 Mysql

          • 使用Prometheus和Grafana監(jiān)控Mysql服務(wù)器性能

          • 使用Prometheus監(jiān)控服務(wù)器

          • Prometheus 入門與實(shí)踐

          • 基于Prometheus的分布式在線服務(wù)監(jiān)控實(shí)踐

          • grafana+ prometheus+php 監(jiān)控系統(tǒng)實(shí)踐

          • Grafana+prometheus+php 自動(dòng)創(chuàng)建監(jiān)控圖

          • Prometheus+Grafana監(jiān)控部署實(shí)踐

          • How To Install Prometheus using Docker on Ubuntu 14.04

          作者:Aneasystone
          來(lái)源:

          https://www.aneasystone.com/archives/2018/11/prometheus-in-action.html

          推薦閱讀

          深入淺出 Prometheus

          Prometheus 如何做到“活學(xué)活用”,大牛總結(jié)的避坑指南

          GitHub 熱榜:適合初學(xué)者學(xué)習(xí)的 Prometheus 監(jiān)控系統(tǒng)

          IT運(yùn)維面試問(wèn)題總結(jié)-數(shù)據(jù)庫(kù)、監(jiān)控、網(wǎng)絡(luò)管理(NoSQL、MongoDB、MySQL、Prometheus、Zabbix)

          Grafana 中文入門教程 | 構(gòu)建你的第一個(gè)儀表盤

          瀏覽 84
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久丝袜足交视频 | 美女裸身十八禁 | 欧美成人高清 | 操批视频在线观看 | 影音先锋成人影院 |