<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>

          監(jiān)控新星 | 實戰(zhàn)Prometheus搭建監(jiān)控系統(tǒng)

          共 22558字,需瀏覽 46分鐘

           ·

          2021-04-28 23:42

          點擊上方藍色字體,選擇“設(shè)為星標(biāo)
          回復(fù)”資源“獲取更多資源

          Prometheus是一款基于時序數(shù)據(jù)庫的開源監(jiān)控告警系統(tǒng),說起Prometheus則不得不提SoundCloud,這是一個在線音樂分享的平臺,類似于做視頻分享的YouTube,由于他們在微服務(wù)架構(gòu)的道路上越走越遠,出現(xiàn)了成百上千的服務(wù),使用傳統(tǒng)的監(jiān)控系統(tǒng)StatsD和Graphite存在大量的局限性,于是他們在2012年開始著手開發(fā)一套全新的監(jiān)控系統(tǒng)。Prometheus的原作者是Matt T. Proud,他也是在2012年加入SoundCloud的,實際上,在加入SoundCloud之前,Matt一直就職于Google,他從Google的集群管理器Borg和它的監(jiān)控系統(tǒng)Borgmon中獲取靈感,開發(fā)了開源的監(jiān)控系統(tǒng)Prometheus,和Google的很多項目一樣,使用的編程語言是Go。

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

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


          一、Prometheus概述

          我們在SoundCloud的官方博客中可以找到一篇關(guān)于他們?yōu)槭裁葱枰麻_發(fā)一個監(jiān)控系統(tǒng)的文章Prometheus: Monitoring at SoundCloud,在這篇文章中,他們介紹到,他們需要的監(jiān)控系統(tǒng)必須滿足下面四個特性:
          • 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).
          簡單來說,就是下面四個特性:
          • 多維度數(shù)據(jù)模型

          • 方便的部署和維護

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

          • 強大的查詢語言

          實際上,多維度數(shù)據(jù)模型和強大的查詢語言這兩個特性,正是時序數(shù)據(jù)庫所要求的,所以Prometheus不僅僅是一個監(jiān)控系統(tǒng),同時也是一個時序數(shù)據(jù)庫。那為什么Prometheus不直接使用現(xiàn)有的時序數(shù)據(jù)庫作為后端存儲呢?這是因為SoundCloud不僅希望他們的監(jiān)控系統(tǒng)有著時序數(shù)據(jù)庫的特點,而且還需要部署和維護非常方便??v觀比較流行的時序數(shù)據(jù)庫(參見下面的附錄),他們要么組件太多,要么外部依賴繁重,比如:Druid有Historical、MiddleManager、Broker、Coordinator、Overlord、Router一堆的組件,而且還依賴于ZooKeeper、Deep storage(HDFS或S3等),Metadata store(PostgreSQL或MySQL),部署和維護起來成本非常高。而Prometheus采用去中心化架構(gòu),可以獨立部署,不依賴于外部的分布式存儲,你可以在幾分鐘的時間里就可以搭建出一套監(jiān)控系統(tǒng)。
          此外,Prometheus數(shù)據(jù)采集方式也非常靈活。要采集目標(biāo)的監(jiān)控數(shù)據(jù),首先需要在目標(biāo)處安裝數(shù)據(jù)采集組件,這被稱之為Exporter,它會在目標(biāo)處收集監(jiān)控數(shù)據(jù),并暴露出一個HTTP接口供Prometheus查詢,Prometheus通過Pull的方式來采集數(shù)據(jù),這和傳統(tǒng)的Push模式不同。不過Prometheus也提供了一種方式來支持Push模式,你可以將你的數(shù)據(jù)推送到Push Gateway,Prometheus通過Pull 的方式從Push Gateway獲取數(shù)據(jù)。目前的Exporter已經(jīng)可以采集絕大多數(shù)的第三方數(shù)據(jù),比如Docker、HAProxy、StatsD、JMX等等,官網(wǎng)有一份Exporter的列表。
          除了這四大特性,隨著Prometheus的不斷發(fā)展,開始支持越來越多的高級特性,比如:服務(wù)發(fā)現(xiàn),更豐富的圖表展示,使用外部存儲,強大的告警規(guī)則和多樣的通知方式。下圖是 Prometheus 的整體架構(gòu)圖:

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

          二、安裝Prometheus server

          Prometheus可以支持多種安裝方式,包括Docker、Ansible、Chef、Puppet、Saltstack等。下面介紹最簡單的兩種方式,一種是直接使用編譯好的可執(zhí)行文件,開箱即用,另一種是使用Docker鏡像,更多的安裝方式可以參考這里。(https://love2.io/@1046102779/doc/prometheus/introductions/install.md)

          2.1 開箱即用

          首先從 官網(wǎng)的下載頁面 獲取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 --versionprometheus, version 2.4.3 (branch: HEAD, revision: 167a4b4e73a8eca8df648d2d2043e21bdb9a7449)  build user:       root@1e42b46043e9  build date:       20181004-08:42:02  go version:       go1.11.1
          運行Prometheus server:
          $ ./prometheus --config.file=prometheus.yml
          2.2 使用Docker鏡像
          使用Docker安裝Prometheus更簡單,運行下面的命令即可:
          $ sudo docker run -d -p 9090:9090 prom/prometheus
          一般情況下,我們還會指定配置文件的位置:
          $ sudo docker run -d -p 9090:9090 \    -v ~/docker/prometheus/:/etc/prometheus/ \    prom/prometheus
          我們把配置文件放在本地~/docker/prometheus/prometheus.yml,這樣可以方便編輯和查看,通過-v參數(shù)將本地的配置文件掛載到/etc/prometheus/位置,這是prometheus在容器中默認加載的配置文件位置。如果我們不確定默認的配置文件在哪,可以先執(zhí)行上面的不帶-v參數(shù)的命令,然后通過docker inspect命名看看容器在運行時默認的參數(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"        ],[...]

          2.3 配置Prometheus

          正如上面兩節(jié)看到的,Prometheus有一個配置文件,通過參數(shù)--config.file來指定,配置文件格式為YAML。我們可以打開默認的配置文件prometheus.yml看下里面的內(nèi)容:
          /etc/prometheus $ cat prometheus.yml # my global configglobal: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 configurationalerting: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 默認的配置文件分為四大塊:
          • global塊:Prometheus的全局配置,比如scrape_interval表示Prometheus多久抓取一次數(shù)據(jù),evaluation_interval表示多久檢測一次告警規(guī)則;

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

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

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

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

          三、學(xué)習(xí)PromQL

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

          第一次訪問這個頁面可能會不知所措,我們可以先看看其他菜單下的內(nèi)容,比如:Alerts展示了定義的所有告警規(guī)則,Status可以查看各種Prometheus的狀態(tài)信息,有Runtime & Build Information、Command-Line Flags、Configuration、Rules、Targets、Service Discovery等等。
          實際上Graph頁面才是Prometheus最強大的功能,在這里我們可以使用Prometheus提供的一種特殊表達式來查詢監(jiān)控數(shù)據(jù),這個表達式被稱為PromQL(Prometheus Query Language)。通過PromQL不僅可以在Graph頁面查詢數(shù)據(jù),而且還可以通過Prometheus提供的HTTP API來查詢。查詢的監(jiān)控數(shù)據(jù)有列表和曲線圖兩種展現(xiàn)形式(對應(yīng)上圖中Console和Graph這兩個標(biāo)簽)。
          我們上面說過,Prometheus自身也暴露了很多的監(jiān)控指標(biāo),也可以在Graph頁面查詢,展開Execute按鈕旁邊的下拉框,可以看到很多指標(biāo)名稱,我們隨便選一個,譬如:promhttp_metric_handler_requests_total,這個指標(biāo)表示/metrics頁面的訪問次數(shù),Prometheus就是通過這個頁面來抓取自身的監(jiān)控數(shù)據(jù)的。在Console標(biāo)簽中查詢結(jié)果如下:

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

          3.1 數(shù)據(jù)模型

          要學(xué)習(xí)PromQL,首先我們需要了解下Prometheus的數(shù)據(jù)模型,一條Prometheus數(shù)據(jù)由一個指標(biāo)名稱(metric)和N個標(biāo)簽(label,N>=0)組成的,比如下面這個例子:
          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,并且包含三個標(biāo)簽codeinstancejob,這條記錄的值為106。上面說過,Prometheus是一個時序數(shù)據(jù)庫,相同指標(biāo)相同標(biāo)簽的數(shù)據(jù)構(gòu)成一條時間序列。如果以傳統(tǒng)數(shù)據(jù)庫的概念來理解時序數(shù)據(jù)庫,可以把指標(biāo)名當(dāng)作表名,標(biāo)簽是字段,timestamp是主鍵,還有一個float64類型的字段表示值(Prometheus里面所有值都是按float64存儲)。
          這種數(shù)據(jù)模型和OpenTSDB的數(shù)據(jù)模型是比較類似的,詳細的信息可以參考官網(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里存儲的數(shù)據(jù)都是float64的一個數(shù)值,但如果我們按類型來分,可以把Prometheus的數(shù)據(jù)分成四大類:
          • Counter

          • Gauge

          • Histogram

          • Summary

          Counter用于計數(shù),例如:請求次數(shù)、任務(wù)完成數(shù)、錯誤發(fā)生次數(shù),這個值會一直增加,不會減少。Gauge就是一般的數(shù)值,可大可小,例如:溫度變化、內(nèi)存使用變化。Histogram是直方圖,或稱為柱狀圖,常用于跟蹤事件發(fā)生的規(guī)模,例如:請求耗時、響應(yīng)大小。它特別之處是可以對記錄的內(nèi)容進行分組,提供count和sum的功能。Summary和Histogram十分相似,也用于跟蹤事件發(fā)生的規(guī)模,不同之處是,它提供了一個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/)這里的說明。
          這四種類型的數(shù)據(jù)只在指標(biāo)的提供方作區(qū)分,也就是上面說的Exporter,如果你需要編寫自己的Exporter或者在現(xiàn)有系統(tǒng)中暴露供Prometheus抓取的指標(biāo),你可以使用Prometheus client libraries(https://prometheus.io/docs/instrumenting/clientlibs/),這個時候你就需要考慮不同指標(biāo)的數(shù)據(jù)類型了。如果你不用自己實現(xiàn),而是直接使用一些現(xiàn)成的Exporter,然后在Prometheus里查查相關(guān)的指標(biāo)數(shù)據(jù),那么可以不用太關(guān)注這塊,不過理解Prometheus的數(shù)據(jù)類型,對寫出正確合理的PromQL也是有幫助的。

          3.2 PromQL入門

          我們從一些例子開始學(xué)習(xí)PromQL,最簡單的PromQL就是直接輸入指標(biāo)名稱,比如:
          # 表示 Prometheus 能否抓取 target 的指標(biāo),用于 target 的健康檢查up
          這條語句會查出Prometheus抓取的所有target當(dāng)前運行情況,譬如下面這樣:
          up{instance="192.168.0.107:9090",job="prometheus"}    1up{instance="192.168.0.108:9090",job="prometheus"}    1up{instance="192.168.0.107:9100",job="server"}    1up{instance="192.168.0.108:9104",job="mysql"}    0
          也可以指定某個label來查詢:
          up{job="prometheus"}
          這種寫法被稱為Instant vector selectors,這里不僅可以使用=號,還可以使用!==~、!~,比如下面這樣:
          up{job!="prometheus"}up{job=~"server|mysql"}up{job=~"192\.168\.0\.107.+"}
          =~ 是根據(jù)正則表達式來匹配,必須符合RE2的語法。
          和Instant vector selectors相應(yīng)的,還有一種選擇器,叫做Range vector selectors,它可以查出一段時間內(nèi)的所有數(shù)據(jù):
          http_requests_total[5m]
          這條語句查出5分鐘內(nèi)所有抓取的HTTP請求數(shù),注意它返回的數(shù)據(jù)類型是Range vector,沒辦法在Graph上顯示成曲線圖,一般情況下,會用在Counter類型的指標(biāo)上,并和rate()irate()函數(shù)一起使用(注意rate和irate的區(qū)別)。
          # 計算的是每秒的平均值,適用于變化很慢的 counter# per-second average rate of increase, for slow-moving countersrate(http_requests_total[5m])
          # 計算的是每秒瞬時增加速率,適用于變化很快的 counter# per-second instant rate of increase, for volatile and fast-moving countersirate(http_requests_total[5m])
          此外,PromQL還支持countsum、min、maxtopk等 聚合操作,還支持rate、abs、ceil、floor等一堆的 內(nèi)置函數(shù),更多的例子,還是上官網(wǎng)學(xué)習(xí)吧。如果感興趣,我們還可以把PromQL和SQL做一個對比,會發(fā)現(xiàn)PromQL語法更簡潔,查詢性能也更高。

          3.3 HTTP API

          我們不僅僅可以在Prometheus的Graph 頁面查詢PromQL,Prometheus還提供了一種HTTP API的方式,可以更靈活的將PromQL整合到其他系統(tǒng)中使用,譬如下面要介紹的Grafana,就是通過Prometheus的HTTP API來查詢指標(biāo)數(shù)據(jù)的。實際上,我們在Prometheus的Graph頁面查詢也是使用了HTTP API。
          我們看下Prometheus的HTTP API官方文檔,它提供了下面這些接口:
          • GET /api/v1/query

          • GET /api/v1/query_range

          • GET /api/v1/series

          • GET /api/v1/label/<label_name>/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開始,又新增了幾個用于管理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)的視圖,但是這個功能非常簡單,只適合用來調(diào)試。要實現(xiàn)一個強大的監(jiān)控系統(tǒng),還需要一個能定制展示不同指標(biāo)的面板,能支持不同類型的展現(xiàn)方式(曲線圖、餅狀圖、熱點圖、TopN等),這就是儀表盤(Dashboard)功能。因此Prometheus開發(fā)了一套儀表盤系統(tǒng)PromDash,不過很快這套系統(tǒng)就被廢棄了,官方開始推薦使用Grafana來對Prometheus的指標(biāo)數(shù)據(jù)進行可視化,這不僅是因為Grafana的功能非常強大,而且它和Prometheus可以完美的無縫融合。
          Grafana是一個用于可視化大型測量數(shù)據(jù)的開源系統(tǒng),它的功能非常強大,界面也非常漂亮,使用它可以創(chuàng)建自定義的控制面板,你可以在面板中配置要顯示的數(shù)據(jù)和顯示方式,它支持很多不同的數(shù)據(jù)源,比如:Graphite、InfluxDB、OpenTSDB、Elasticsearch、Prometheus等,而且它也支持眾多的插件。
          下面我們就體驗下使用Grafana來展示Prometheus的指標(biāo)數(shù)據(jù)。首先我們來安裝Grafana,我們使用最簡單的Docker安裝方式:
          $ docker run -d -p 3000:3000 grafana/grafana
          運行上面的docker命令,Grafana就安裝好了!你也可以采用其他的安裝方式,參考官方的安裝文檔。安裝完成之后,我們訪問http://localhost:3000/進入Grafana的登陸頁面,輸入默認的用戶名和密碼(admin/admin)即可。

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

          我們在這里依次填上:
          • Name: prometheus

          • Type: Prometheus

          • URL: http://localhost:9090

          • Access: Browser

          要注意的是,這里的Access指的是Grafana訪問數(shù)據(jù)源的方式,有Browser和Proxy兩種方式。Browser方式表示當(dāng)用戶訪問Grafana面板時,瀏覽器直接通過URL訪問數(shù)據(jù)源的;而Proxy方式表示瀏覽器先訪問Grafana的某個代理接口(接口地址是/api/datasources/proxy/),由Grafana的服務(wù)端來訪問數(shù)據(jù)源的URL,如果數(shù)據(jù)源是部署在內(nèi)網(wǎng),用戶通過瀏覽器無法直接訪問時,這種方式非常有用。
          配置好數(shù)據(jù)源,Grafana會默認提供幾個已經(jīng)配置好的面板供你使用,如下圖所示,默認提供了三個面板:Prometheus Stats、Prometheus 2.0 Stats和Grafana metrics。點擊Import就可以導(dǎo)入并使用該面板。

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

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

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

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

          首先我們來收集服務(wù)器的指標(biāo),這需要安裝node_exporter,這個exporter用于收集*NIX內(nèi)核的系統(tǒng),如果你的服務(wù)器是Windows,可以使用WMI exporter。
          和Prometheus server一樣,node_exporter也是開箱即用的:
          $ 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啟動之后,我們訪問下/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信號也可以讓Prometheus重新加載配置:
          $ killall -HUP prometheus
          在Prometheus Web UI的Status -> Targets中,可以看到新加的服務(wù)器:

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

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

          注意事項

          一般情況下,node_exporter都是直接運行在要收集指標(biāo)的服務(wù)器上的,官方不推薦用Docker來運行node_exporter。如果逼不得已一定要運行在Docker里,要特別注意,這是因為Docker的文件系統(tǒng)和網(wǎng)絡(luò)都有自己的namespace,收集的數(shù)據(jù)并不是宿主機真實的指標(biāo)??梢允褂靡恍┳兺ǖ姆椒?,比如運行Docker時加上下面這樣的參數(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也是很好的入門材料。

          5.2 收集MySQL指標(biāo)

          mysqld_exporter是Prometheus官方提供的一個exporter,我們首先 下載最新版本 并解壓(開箱即用):
          $ 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),可以通過兩種方式來設(shè)置mysqld數(shù)據(jù)源。第一種是通過環(huán)境變量DATA_SOURCE_NAME,這被稱為DSN(數(shù)據(jù)源名稱),它必須符合DSN的格式,一個典型的DSN格式像這樣:user:password@(host:port)/。
          $ export DATA_SOURCE_NAME='root:123456@(192.168.0.107:3306)/'$ ./mysqld_exporter另一種方式是通過配置文
          另一種方式是通過配置文件,默認的配置文件是~/.my.cnf,或者通過--config.my-cnf 參數(shù)指定:
          $ ./mysqld_exporter --config.my-cnf=".my.cnf"
          配置文件的格式如下:
          $ cat .my.cnf[client]host=localhostport=3306user=rootpassword=123456
          如果要把MySQL的指標(biāo)導(dǎo)入Grafana,可以參考這些Dashboard JSON。(https://github.com/percona/grafana-dashboards)

          注意事項

          這里為簡單起見,在mysqld_exporter中直接使用了root連接數(shù)據(jù)庫,在真實環(huán)境中,可以為mysqld_exporter創(chuàng)建一個單獨的用戶,并賦予它受限的權(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 CLIENT, SELECT ON *.* TO 'exporter'@'localhost';

          5.3 收集Nginx指標(biāo)

          官方提供了兩種收集Nginx指標(biāo)的方式。第一種是Nginx metric library,這是一段Lua腳本(prometheus.lua),Nginx需要開啟Lua支持(libnginx-mod-http-lua模塊)。為方便起見,也可以使用OpenResty的 OPM(OpenResty Package Manager) 或者luarocks(The Lua package manager)來安裝。第二種是Nginx VTS exporter,這種方式比第一種要強大的多,安裝要更簡單,支持的指標(biāo)也更豐富,它依賴于nginx-module-vts 模塊,vts模塊可以提供大量的Nginx指標(biāo)數(shù)據(jù),可以通過JSON、HTML等形式查看這些指標(biāo)。Nginx VTS exporter就是通過抓取/status/format/json接口來將vts的數(shù)據(jù)格式轉(zhuǎn)換為Prometheus的格式。不過,在nginx-module-vts最新的版本中增加了一個新接口:/status/format/prometheus,這個接口可以直接返回Prometheus的格式,從這點這也能看出Prometheus的影響力,估計Nginx VTS exporter很快就要退役了(TODO:待驗證)。
          除此之外,還有很多其他的方式來收集Nginx的指標(biāo),比如:nginx_exporter 通過抓取Nginx自帶的統(tǒng)計頁面/nginx_status可以獲取一些比較簡單的指標(biāo)(需要開啟ngx_http_stub_status_module模塊);nginx_request_exporter通過syslog協(xié)議收集并分析Nginx的access log來統(tǒng)計HTTP請求相關(guān)的一些指標(biāo);nginx-prometheus-shiny-exporter和nginx_request_exporter類似,也是使用syslog協(xié)議來收集access log,不過它是使用Crystal語言寫的。還有vovolie/lua-nginx-prometheus基于Openresty、Prometheus、Consul、Grafana實現(xiàn)了針對域名和Endpoint級別的流量統(tǒng)計。
          有需要或感興趣的同學(xué)可以對照說明文檔自己安裝體驗下,這里就不一一嘗試了。

          5.4 收集JMX指標(biāo)

          最后讓我們來看下如何收集Java應(yīng)用的指標(biāo),Java應(yīng)用的指標(biāo)一般是通過JMX(Java Management Extensions)來獲取的,顧名思義,JMX是管理Java的一種擴展,它可以方便的管理和監(jiān)控正在運行的Java程序。
          JMX Exporter用于收集JMX指標(biāo),很多使用Java的系統(tǒng),都可以使用它來收集指標(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是一個Java Agent程序,在運行Java程序時通過-javaagent參數(shù)來加載:
          $ 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的配置說明 。然后檢查下指標(biāo)數(shù)據(jù)是否正確獲?。?/span>
          $ curl http://localhost:9404/metrics

          六、告警和通知

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

          6.1 配置告警規(guī)則

          我們在上面介紹Prometheus的配置文件時了解到,它的默認配置文件prometheus.yml有四大塊:global、alerting、rule_files、scrape_config,其中rule_files塊就是告警規(guī)則的配置項,alerting塊用于配置Alertmanager,這個我們下一節(jié)再看。現(xiàn)在,先讓我們在rule_files塊中添加一個告警規(guī)則文件:
          rule_files:  - "alert.rules"
          然后參考官方文檔,創(chuàng)建一個告警規(guī)則文件 alert.rules
          groups:- name: examplerules:  # Alert for any instance that is unreachable for >5 minutes.- alert: InstanceDownexpr: up == 0for: 5mlabels:severity: pageannotations: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: APIHighRequestLatencyexpr: api_http_request_latencies_second{quantile="0.5"} > 1for: 10mannotations:summary: "High request latency on {{ $labels.instance }}"description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"
          這個規(guī)則文件里,包含了兩條告警規(guī)則:InstanceDownAPIHighRequestLatency。顧名思義,InstanceDown表示當(dāng)實例宕機時(up === 0)觸發(fā)告警,APIHighRequestLatency表示有一半的API請求延遲大于1s時(api_http_request_latencies_second{quantile="0.5"} > 1)觸發(fā)告警。配置好后,需要重啟下Prometheus server,然后訪問http://localhost:9090/rules可以看到剛剛配置的規(guī)則:

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

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

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

          雖然Prometheus的/alerts頁面可以看到所有的告警,但是還差最后一步:觸發(fā)告警時自動發(fā)送通知。這是由Alertmanager來完成的,我們首先 下載并安裝Alertmanager,和其他Prometheus的組件一樣,Alertmanager也是開箱即用的:
          $ 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啟動后默認可以通過http://localhost:9093/來訪問,但是現(xiàn)在還看不到告警,因為我們還沒有把Alertmanager配置到Prometheus中,我們回到Prometheus的配置文件prometheus.yml,添加下面幾行:
          alerting:alertmanagers:- scheme: httpstatic_configs:- targets:- "192.168.0.107:9093"
          這個配置告訴Prometheus,當(dāng)發(fā)生告警時,將告警信息發(fā)送到Alertmanager,Alertmanager的地址為http://192.168.0.107:9093。也可以使用命名行的方式指定Alertmanager:
          $ ./prometheus -alertmanager.url=http://192.168.0.107:9093
          這個時候再訪問Alertmanager,可以看到Alertmanager已經(jīng)接收到告警了:

          下面的問題就是如何讓Alertmanager將告警信息發(fā)送給我們了,我們打開默認的配置文件alertmanager.ym
          global:resolve_timeout: 5m
          route:group_by: ['alertname']group_wait: 10sgroup_interval: 10srepeat_interval: 1hreceiver: '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']
          參考官方的配置手冊了解各個配置項的功能,其中g(shù)lobal塊表示一些全局配置;route塊表示通知路由,可以根據(jù)不同的標(biāo)簽將告警通知發(fā)送給不同的 receiver,這里沒有配置routes項,表示所有的告警都發(fā)送給下面定義的web.hook這個receiver;如果要配置多個路由,可以參考這個例子:
          routes:- receiver: 'database-pager'group_wait: 10smatch_re:service: mysql|cassandra
          - receiver: 'frontend-pager'group_by: [product, environment]match:team: frontend
          緊接著,receivers 塊表示告警通知的接收方式,每個receiver包含一個name和一個xxx_configs,不同的配置代表了不同的接收方式,Alertmanager內(nèi)置了下面這些接收方式:
          • email_config

          • hipchat_config

          • pagerduty_config

          • pushover_config

          • slack_config

          • opsgenie_config

          • victorops_config

          • wechat_configs

          • webhook_config

          雖然接收方式很豐富,但是在國內(nèi),其中大多數(shù)接收方式都很少使用。最常用到的,莫屬email_config和webhook_config,另外wechat_configs可以支持使用微信來告警,也是相當(dāng)符合國情的了。
          其實告警的通知方式是很難做到面面俱到的,因為消息軟件各種各樣,每個國家還可能不同,不可能完全覆蓋到,所以Alertmanager已經(jīng)決定不再添加新的receiver了,而是推薦使用webhook來集成自定義的接收方式??梢詤⒖?這些集成的例子,譬如將釘釘接入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)。不過在真正使用時,我們會發(fā)現(xiàn)更多的問題。

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

          由于Prometheus是通過Pull的方式主動獲取監(jiān)控數(shù)據(jù),所以需要手工指定監(jiān)控節(jié)點的列表,當(dāng)監(jiān)控的節(jié)點增多之后,每次增加節(jié)點都需要更改配置文件,非常麻煩,這個時候就需要通過服務(wù)發(fā)現(xiàn)(service discovery,SD)機制去解決。Prometheus支持多種服務(wù)發(fā)現(xiàn)機制,可以自動獲取要收集的targets,可以參考這里,包含的服務(wù)發(fā)現(xiàn)機制包括:azure、consul、dns、ec2、openstack、file、gce、kubernetes、marathon、triton、zookeeper(nerve、serverset),配置方法可以參考手冊的Configuration頁面??梢哉fSD機制是非常豐富的,但目前由于開發(fā)資源有限,已經(jīng)不再開發(fā)新的SD機制,只對基于文件的SD機制進行維護。
          關(guān)于服務(wù)發(fā)現(xiàn)網(wǎng)上有很多教程,譬如Prometheus官方博客中這篇文章Advanced Service Discovery in Prometheus 0.14.0對此有一個比較系統(tǒng)的介紹,全面的講解了relabeling配置,以及如何使用DNS-SRV、Consul 和文件來做服務(wù)發(fā)現(xiàn)。另外,官網(wǎng)還提供了一個基于文件的服務(wù)發(fā)現(xiàn)的入門例子,Julius Volz寫的Prometheus workshop入門教程中也使用了DNS-SRV來當(dāng)服務(wù)發(fā)現(xiàn)。

          7.2 告警配置管理

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

          7.3 使用Pushgateway

          Pushgateway主要用于收集一些短期的jobs,由于這類jobs存在時間較短,可能在Prometheus來Pull之前就消失了。官方對什么時候該使用Pushgateway有一個很好的說明。

          總結(jié)

          這篇博客參考了網(wǎng)絡(luò)上大量關(guān)于Prometheus的中文資料,有文檔,也有博客,比如1046102779的Prometheus非官方中文手冊,宋佳洋的電子書《Prometheus實戰(zhàn)》,在這里對這些原作者表示敬意。在Prometheus官方文檔的Media頁面,也提供了很多學(xué)習(xí)資源。
          關(guān)于Prometheus,還有非常重要的一部分內(nèi)容這篇博客沒有涉及到,正如博客一開頭所講的,Prometheus是繼Kubernetes之后第二個加入CNCF的項目,Prometheus和Docker、Kubernetes的結(jié)合非常緊密,使用Prometheus作為Docker和Kubernetes的監(jiān)控系統(tǒng)也越來越主流。關(guān)于Docker的監(jiān)控,可以參考官網(wǎng)的一篇指南:Monitoring Docker container metrics using cAdvisor,它介紹了如何使用cAdvisor來對容器進行監(jiān)控;不過Docker現(xiàn)在也開始原生支持Prometheus的監(jiān)控了,參考Docker的官方文檔Collect Docker metrics with Prometheus;關(guān)于Kubernetes的監(jiān)控,Kubernetes中文社區(qū) 里有不少關(guān)于Promehtheus 的資源,另外,《如何以優(yōu)雅的姿勢監(jiān)控Kubernetes》這本電子書也對Kubernetes的監(jiān)控有一個比較全面的介紹。
          最近兩年P(guān)rometheus的發(fā)展非常迅速,社區(qū)也非?;钴S,國內(nèi)研究Prometheus的人也越來越多。隨著微服務(wù),DevOps,云計算,云原生等概念的普及,越來越多的企業(yè)開始使用Docker和Kubernetes來構(gòu)建自己的系統(tǒng)和應(yīng)用,像Nagios和Cacti這樣的老牌監(jiān)控系統(tǒng)會變得越來越不適用,相信Prometheus最終會發(fā)展成一個最適合云環(huán)境的監(jiān)控系統(tǒng)。

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

          上文提到Prometheus是一款基于時序數(shù)據(jù)庫的監(jiān)控系統(tǒng),時序數(shù)據(jù)庫常簡寫為TSDB(Time Series Database)。很多流行的監(jiān)控系統(tǒng)都在使用時序數(shù)據(jù)庫來保存數(shù)據(jù),這是因為時序數(shù)據(jù)庫的特點和監(jiān)控系統(tǒng)不謀而合。
          • 增:需要頻繁的進行寫操作,而且是按時間排序順序?qū)懭?/span>

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

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

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

          DB-Engines上有一個關(guān)于時序數(shù)據(jù)庫的排名,下面是排名靠前的幾個(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/



          數(shù)據(jù)湖存儲架構(gòu)選型

          嘗鮮!Flink1.12.2+Hudi0.9.0集成開發(fā)

          實操 | Flink1.12.1通過Table API / Flink SQL讀取HBase2.4.0

          數(shù)據(jù)湖架構(gòu)、戰(zhàn)略和分析的8大錯誤認知
          瀏覽 67
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  一级日皮视频 | 偷拍视频青青草 | 成人AV片导航 | 五月丁香综合婷婷 | 高清一区二区三区日本久 |