Prometheus 是一款基于時(shí)序數(shù)據(jù)庫的開源監(jiān)控告警系統(tǒng),說起 Prometheus 則不得不提 SoundCloud,這是一個(gè)在線音樂分享的平臺(tái),類似于做視頻分享的 YouTube,由于他們在微服務(wù)架構(gòu)的道路上越走越遠(yuǎn),出現(xiàn)了成百上千的服務(wù),使用傳統(tǒng)的監(jiān)控系統(tǒng) StatsD 和 Graphite 存在大量的局限性,于是他們在 2012 年開始著手開發(fā)一套全新的監(jiān)控系統(tǒng)。Prometheus 的原作者是 Matt T. Proud,他也是在 2012 年加入 SoundCloud 的,實(shí)際上,在加入 SoundCloud 之前,Matt 一直就職于 Google,他從 Google 的集群管理器 Borg 和它的監(jiān)控系統(tǒng) Borgmon 中獲取靈感,開發(fā)了開源的監(jiān)控系統(tǒng) Prometheus,和 Google 的很多項(xiàng)目一樣,使用的編程語言是 Go。很顯然,Prometheus 作為一個(gè)微服務(wù)架構(gòu)監(jiān)控系統(tǒng)的解決方案,它和容器也脫不開關(guān)系。早在 2006 年 8 月 9 日,Eric Schmidt 在搜索引擎大會(huì)上首次提出了云計(jì)算(Cloud Computing)的概念,在之后的十幾年里,云計(jì)算的發(fā)展勢如破竹。在 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)中,對 Prometheus 的歷史感興趣的同學(xué)可以看看 SoundCloud 的工程師 Tobias Schmidt 在 2016 年的 PromCon 大會(huì)上的演講:The History of Prometheus at SoundCloud 。一、Prometheus 概述
我們在 SoundCloud 的官方博客中可以找到一篇關(guān)于他們?yōu)槭裁葱枰麻_發(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).
實(shí)際上,多維度數(shù)據(jù)模型和強(qiáng)大的查詢語言這兩個(gè)特性,正是時(shí)序數(shù)據(jù)庫所要求的,所以 Prometheus 不僅僅是一個(gè)監(jiān)控系統(tǒng),同時(shí)也是一個(gè)時(shí)序數(shù)據(jù)庫。那為什么 Prometheus 不直接使用現(xiàn)有的時(shí)序數(shù)據(jù)庫作為后端存儲(chǔ)呢?這是因?yàn)?SoundCloud 不僅希望他們的監(jiān)控系統(tǒng)有著時(shí)序數(shù)據(jù)庫的特點(diǎn),而且還需要部署和維護(hù)非常方便??v觀比較流行的時(shí)序數(shù)據(jù)庫(參見下面的附錄),他們要么組件太多,要么外部依賴繁重,比如:Druid 有 Historical、MiddleManager、Broker、Coordinator、Overlord、Router 一堆的組件,而且還依賴于 ZooKeeper、Deep storage(HDFS 或 S3 等),Metadata store(PostgreSQL 或 MySQL),部署和維護(hù)起來成本非常高。而 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 通過 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ā)展,開始支持越來越多的高級(jí)特性,比如:服務(wù)發(fā)現(xiàn),更豐富的圖表展示,使用外部存儲(chǔ),強(qiáng)大的告警規(guī)則和多樣的通知方式。下圖是 Prometheus 的整體架構(gòu)圖(圖片來源):
從上圖可以看出,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á)式查詢,和告警的生成。接下來我們就來安裝 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
運(yùn)行 Prometheus server:
$ ./prometheus --config.file=prometheus.yml
2.2 使用 Docker 鏡像
使用 Docker 安裝 Prometheus 更簡單,運(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,這樣可以方便編輯和查看,通過 -v 參數(shù)將本地的配置文件掛載到 /etc/prometheus/ 位置,這是 prometheus 在容器中默認(rèn)加載的配置文件位置。如果我們不確定默認(rèn)的配置文件在哪,可以先執(zhí)行上面的不帶 -v 參數(shù)的命令,然后通過 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" ],[...]
2.3 配置 Prometheus
正如上面兩節(jié)看到的,Prometheus 有一個(gè)配置文件,通過參數(shù) --config.file 來指定,配置文件格式為 YAML。我們可以打開默認(rèn)的配置文件 prometheus.yml 看下里面的內(nèi)容:/etc/prometheus $ cat prometheus.yml 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.alerting: alertmanagers: - static_configs: - targets:rule_files:scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090']
Prometheus 默認(rèn)的配置文件分為四大塊:- global 塊:Prometheus 的全局配置,比如
scrape_interval 表示 Prometheus 多久抓取一次數(shù)據(jù),evaluation_interval 表示多久檢測一次告警規(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ì)通過 HTTP 接口暴露自身的指標(biāo)數(shù)據(jù),這就相當(dāng)于 Prometheus 自己監(jiān)控自己,雖然這在真正使用 Prometheus 時(shí)沒啥用處,但是我們可以通過這個(gè)例子來學(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)在可以開始體驗(yàn) Prometheus 了。Prometheus 提供了可視化的 Web UI 方便我們操作,直接訪問 http://localhost:9090/ 即可,它默認(rèn)會(huì)跳轉(zhuǎn)到 Graph 頁面:
第一次訪問這個(gè)頁面可能會(huì)不知所措,我們可以先看看其他菜單下的內(nèi)容,比如:Alerts 展示了定義的所有告警規(guī)則,Status 可以查看各種 Prometheus 的狀態(tài)信息,有 Runtime & Build Information、Command-Line Flags、Configuration、Rules、Targets、Service Discovery 等等。實(shí)際上 Graph 頁面才是 Prometheus 最強(qiáng)大的功能,在這里我們可以使用 Prometheus 提供的一種特殊表達(dá)式來查詢監(jiān)控?cái)?shù)據(jù),這個(gè)表達(dá)式被稱為 PromQL(Prometheus Query Language)。通過 PromQL 不僅可以在 Graph 頁面查詢數(shù)據(jù),而且還可以通過 Prometheus 提供的 HTTP API 來查詢。查詢的監(jiān)控?cái)?shù)據(jù)有列表和曲線圖兩種展現(xiàn)形式(對應(yīng)上圖中 Console 和 Graph 這兩個(gè)標(biāo)簽)。我們上面說過,Prometheus 自身也暴露了很多的監(jiān)控指標(biāo),也可以在 Graph 頁面查詢,展開 Execute 按鈕旁邊的下拉框,可以看到很多指標(biāo)名稱,我們隨便選一個(gè),譬如:promhttp_metric_handler_requests_total,這個(gè)指標(biāo)表示 /metrics 頁面的訪問次數(shù),Prometheus 就是通過這個(gè)頁面來抓取自身的監(jiān)控?cái)?shù)據(jù)的。在 Console 標(biāo)簽中查詢結(jié)果如下:
上面在介紹 Prometheus 的配置文件時(shí),可以看到 scrape_interval 參數(shù)是 15s,也就是說 Prometheus 每 15s 訪問一次 /metrics 頁面,所以我們過 15s 刷新下頁面,可以看到指標(biāo)值會(huì)自增。在 Graph 標(biāo)簽中可以看得更明顯:
3.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。上面說過,Prometheus 是一個(gè)時(shí)序數(shù)據(jù)庫,相同指標(biāo)相同標(biāo)簽的數(shù)據(jù)構(gòu)成一條時(shí)間序列。如果以傳統(tǒng)數(shù)據(jù)庫的概念來理解時(shí)序數(shù)據(jù)庫,可以把指標(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ù)值,但如果我們按類型來分,可以把 Prometheus 的數(shù)據(jù)分成四大類:Counter 用于計(jì)數(shù),例如:請求次數(shù)、任務(wù)完成數(shù)、錯(cuò)誤發(fā)生次數(shù),這個(gè)值會(huì)一直增加,不會(huì)減少。Gauge 就是一般的數(shù)值,可大可小,例如:溫度變化、內(nèi)存使用變化。Histogram 是直方圖,或稱為柱狀圖,常用于跟蹤事件發(fā)生的規(guī)模,例如:請求耗時(shí)、響應(yīng)大小。它特別之處是可以對記錄的內(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/)這里的說明。這四種類型的數(shù)據(jù)只在指標(biāo)的提供方作區(qū)分,也就是上面說的 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)注這塊,不過理解 Prometheus 的數(shù)據(jù)類型,對寫出正確合理的 PromQL 也是有幫助的。3.2 PromQL 入門
我們從一些例子開始學(xué)習(xí) PromQL,最簡單的 PromQL 就是直接輸入指標(biāo)名稱,比如:這條語句會(huì)查出 Prometheus 抓取的所有 target 當(dāng)前運(yùn)行情況,譬如下面這樣: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
這種寫法被稱為 Instant vector selectors,這里不僅可以使用 = 號(hào),還可以使用 !=、=~、!~,比如下面這樣:up{job!="prometheus"}up{job=~"server|mysql"}up{job=~"192\.168\.0\.107.+"}
=~ 是根據(jù)正則表達(dá)式來匹配,必須符合 RE2 的語法。
和 Instant vector selectors 相應(yīng)的,還有一種選擇器,叫做 Range vector selectors,它可以查出一段時(shí)間內(nèi)的所有數(shù)據(jù):這條語句查出 5 分鐘內(nèi)所有抓取的 HTTP 請求數(shù),注意它返回的數(shù)據(jù)類型是 Range vector,沒辦法在 Graph 上顯示成曲線圖,一般情況下,會(huì)用在 Counter 類型的指標(biāo)上,并和 rate() 或 irate() 函數(shù)一起使用(注意 rate 和 irate 的區(qū)別)。# 計(jì)算的是每秒的平均值,適用于變化很慢的 counter# per-second average rate of increase, for slow-moving countersrate(http_requests_total[5m]) # 計(jì)算的是每秒瞬時(shí)增加速率,適用于變化很快的 counter# per-second instant rate of increase, for volatile and fast-moving countersirate(http_requests_total[5m])
此外,PromQL 還支持 count、sum、min、max、topk 等 聚合操作,還支持 rate、abs、ceil、floor 等一堆的 內(nèi)置函數(shù),更多的例子,還是上官網(wǎng)學(xué)習(xí)吧。如果感興趣,我們還可以把 PromQL 和 SQL 做一個(gè)對比,會(huì)發(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ù)的。實(shí)際上,我們在 Prometheus 的 Graph 頁面查詢也是使用了 HTTP API。我們看下 Prometheus 的 HTTP API 官方文檔,它提供了下面這些接口:- GET /api/v1/label/<label_name>/values
- GET /api/v1/targets/metadata
- GET /api/v1/alertmanagers
- GET /api/v1/status/config
從 Prometheus v2.1 開始,又新增了幾個(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è)功能非常簡單,只適合用來調(diào)試。要實(shí)現(xiàn)一個(gè)強(qiáng)大的監(jiān)控系統(tǒng),還需要一個(gè)能定制展示不同指標(biāo)的面板,能支持不同類型的展現(xiàn)方式(曲線圖、餅狀圖、熱點(diǎn)圖、TopN 等),這就是儀表盤(Dashboard)功能。因此 Prometheus 開發(fā)了一套儀表盤系統(tǒng) PromDash,不過很快這套系統(tǒng)就被廢棄了,官方開始推薦使用 Grafana 來對 Prometheus 的指標(biāo)數(shù)據(jù)進(jìn)行可視化,這不僅是因?yàn)?Grafana 的功能非常強(qiáng)大,而且它和 Prometheus 可以完美的無縫融合。Grafana 是一個(gè)用于可視化大型測量數(shù)據(jù)的開源系統(tǒng),它的功能非常強(qiáng)大,界面也非常漂亮,使用它可以創(chuàng)建自定義的控制面板,你可以在面板中配置要顯示的數(shù)據(jù)和顯示方式,它 支持很多不同的數(shù)據(jù)源,比如:Graphite、InfluxDB、OpenTSDB、Elasticsearch、Prometheus 等,而且它也 支持眾多的插件。下面我們就體驗(yàn)下使用 Grafana 來展示 Prometheus 的指標(biāo)數(shù)據(jù)。首先我們來安裝 Grafana,我們使用最簡單的 Docker 安裝方式:$ docker run -d -p 3000:3000 grafana/grafana
運(yùn)行上面的 docker 命令,Grafana 就安裝好了!你也可以采用其他的安裝方式,參考 官方的安裝文檔。安裝完成之后,我們訪問 http://localhost:3000/ 進(jìn)入 Grafana 的登陸頁面,輸入默認(rèn)的用戶名和密碼(admin/admin)即可。
要使用 Grafana,第一步當(dāng)然是要配置數(shù)據(jù)源,告訴 Grafana 從哪里取數(shù)據(jù),我們點(diǎn)擊 Add data source 進(jìn)入數(shù)據(jù)源的配置頁面:
- URL: http://localhost:9090
要注意的是,這里的 Access 指的是 Grafana 訪問數(shù)據(jù)源的方式,有 Browser 和 Proxy 兩種方式。Browser 方式表示當(dāng)用戶訪問 Grafana 面板時(shí),瀏覽器直接通過 URL 訪問數(shù)據(jù)源的;而 Proxy 方式表示瀏覽器先訪問 Grafana 的某個(gè)代理接口(接口地址是 /api/datasources/proxy/),由 Grafana 的服務(wù)端來訪問數(shù)據(jù)源的 URL,如果數(shù)據(jù)源是部署在內(nèi)網(wǎng),用戶通過瀏覽器無法直接訪問時(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)控面板。如果你的公司有條件,可以申請個(gè)大顯示器掛在墻上,將這個(gè)面板投影在大屏上,實(shí)時(shí)觀察線上系統(tǒng)的狀態(tài),可以說是非常 cool 的。
五、使用 Exporter 收集指標(biāo)
目前為止,我們看到的都還只是一些沒有實(shí)際用途的指標(biāo),如果我們要在我們的生產(chǎn)環(huán)境真正使用 Prometheus,往往需要關(guān)注各種各樣的指標(biāo),譬如服務(wù)器的 CPU負(fù)載、內(nèi)存占用量、IO開銷、入網(wǎng)和出網(wǎng)流量等等。正如上面所說,Prometheus 是使用 Pull 的方式來獲取指標(biāo)數(shù)據(jù)的,要讓 Prometheus 從目標(biāo)處獲得數(shù)據(jù),首先必須在目標(biāo)上安裝指標(biāo)收集的程序,并暴露出 HTTP 接口供 Prometheus 查詢,這個(gè)指標(biāo)收集程序被稱為 Exporter,不同的指標(biāo)需要不同的 Exporter 來收集,目前已經(jīng)有大量的 Exporter 可供使用,幾乎囊括了我們常用的各種系統(tǒng)和軟件,官網(wǎng)列出了一份 常用 Exporter 的清單,各個(gè) Exporter 都遵循一份端口約定,避免端口沖突,即從 9100 開始依次遞增,這里是 完整的 Exporter 端口列表。另外值得注意的是,有些軟件和系統(tǒng)無需安裝 Exporter,這是因?yàn)樗麄儽旧砭吞峁┝吮┞?Prometheus 格式的指標(biāo)數(shù)據(jù)的功能,比如 Kubernetes、Grafana、Etcd、Ceph 等。這一節(jié)就讓我們來收集一些有用的數(shù)據(jù)。5.1 收集服務(wù)器指標(biāo)
首先我們來收集服務(wù)器的指標(biāo),這需要安裝 node_exporter,這個(gè) 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 啟動(dòng)之后,我們訪問下 /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 頁面的指標(biāo)下拉框可以看到很多名稱以 node 開頭的指標(biāo),譬如我們輸入 node_load1 觀察服務(wù)器負(fù)載:
如果想在 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)即可。
注意事項(xiàng)
一般情況下,node_exporter 都是直接運(yùn)行在要收集指標(biāo)的服務(wù)器上的,官方不推薦用 Docker 來運(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 也是很好的入門材料。5.2 收集 MySQL 指標(biāo)
mysqld_exporter 是 Prometheus 官方提供的一個(gè) 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 的格式,一個(gè)典型的 DSN 格式像這樣:user:password@(host:port)/。$ export DATA_SOURCE_NAME='root:123456@(192.168.0.107:3306)/'$ ./mysqld_exporter另一種方式是通過配置文
另一種方式是通過配置文件,默認(rèn)的配置文件是 ~/.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)注意事項(xiàng)
這里為簡單起見,在 mysqld_exporter 中直接使用了 root 連接數(shù)據(jù)庫,在真實(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 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,這種方式比第一種要強(qiáng)大的多,安裝要更簡單,支持的指標(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 最新的版本中增加了一個(gè)新接口:/status/format/prometheus,這個(gè)接口可以直接返回 Prometheus 的格式,從這點(diǎn)這也能看出 Prometheus 的影響力,估計(jì) Nginx VTS exporter 很快就要退役了(TODO:待驗(yàn)證)。除此之外,還有很多其他的方式來收集 Nginx 的指標(biāo),比如:nginx_exporter 通過抓取 Nginx 自帶的統(tǒng)計(jì)頁面 /nginx_status 可以獲取一些比較簡單的指標(biāo)(需要開啟 ngx_http_stub_status_module 模塊);nginx_request_exporter 通過 syslog 協(xié)議 收集并分析 Nginx 的 access log 來統(tǒng)計(jì) 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 實(shí)現(xiàn)了針對域名和 Endpoint 級(jí)別的流量統(tǒng)計(jì)。有需要或感興趣的同學(xué)可以對照說明文檔自己安裝體驗(yàn)下,這里就不一一嘗試了。5.4 收集 JMX 指標(biāo)
最后讓我們來看下如何收集 Java 應(yīng)用的指標(biāo),Java 應(yīng)用的指標(biāo)一般是通過 JMX(Java Management Extensions) 來獲取的,顧名思義,JMX 是管理 Java 的一種擴(kuò)展,它可以方便的管理和監(jiān)控正在運(yù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 是一個(gè) Java Agent 程序,在運(yùn)行 Java 程序時(shí)通過 -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ù)是否正確獲?。?/section>$ curl http://localhost:9404/metrics
六、告警和通知
至此,我們能收集大量的指標(biāo)數(shù)據(jù),也能通過強(qiáng)大而美觀的面板展示出來。不過作為一個(gè)監(jiān)控系統(tǒng),最重要的功能,還是應(yīng)該能及時(shí)發(fā)現(xiàn)系統(tǒng)問題,并及時(shí)通知給系統(tǒng)負(fù)責(zé)人,這就是 Alerting(告警)。Prometheus 的告警功能被分成兩部分:一個(gè)是告警規(guī)則的配置和檢測,并將告警發(fā)送給 Alertmanager,另一個(gè)是 Alertmanager,它負(fù)責(zé)管理這些告警,去除重復(fù)數(shù)據(jù),分組,并路由到對應(yīng)的接收方式,發(fā)出報(bào)警。常見的接收方式有:Email、PagerDuty、HipChat、Slack、OpsGenie、WebHook 等。6.1 配置告警規(guī)則
我們在上面介紹 Prometheus 的配置文件時(shí)了解到,它的默認(rèn)配置文件 prometheus.yml 有四大塊:global、alerting、rule_files、scrape_config,其中 rule_files 塊就是告警規(guī)則的配置項(xiàng),alerting 塊用于配置 Alertmanager,這個(gè)我們下一節(jié)再看?,F(xiàn)在,先讓我們在 rule_files 塊中添加一個(gè)告警規(guī)則文件:rule_files: - "alert.rules"
然后參考 官方文檔,創(chuàng)建一個(gè)告警規(guī)則文件 alert.rules:groups:- name: example rules: - alert: InstanceDown expr: up == 0 for: 5m 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: APIHighRequestLatency expr: api_http_request_latencies_second{quantile="0.5"} > 1 for: 10m 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 請求延遲大于 1s 時(shí)(api_http_request_latencies_second{quantile="0.5"} > 1)觸發(fā)告警。配置好后,需要重啟下 Prometheus server,然后訪問 http://localhost:9090/rules 可以看到剛剛配置的規(guī)則:
訪問 http://localhost:9090/alerts 可以看到根據(jù)配置的規(guī)則生成的告警:
這里我們將一個(gè)實(shí)例停掉,可以看到有一條 alert 的狀態(tài)是 PENDING,這表示已經(jīng)觸發(fā)了告警規(guī)則,但還沒有達(dá)到告警條件。這是因?yàn)檫@里配置的 for 參數(shù)是 5m,也就是 5 分鐘后才會(huì)觸發(fā)告警,我們等 5 分鐘,可以看到這條 alert 的狀態(tài)變成了 FIRING。6.2 使用 Alertmanager 發(fā)送告警通知
雖然 Prometheus 的 /alerts 頁面可以看到所有的告警,但是還差最后一步:觸發(fā)告警時(shí)自動(dòng)發(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 啟動(dòng)后默認(rèn)可以通過 http://localhost:9093/ 來訪問,但是現(xiàn)在還看不到告警,因?yàn)槲覀冞€沒有把 Alertmanager 配置到 Prometheus 中,我們回到 Prometheus 的配置文件 prometheus.yml,添加下面幾行:alerting: alertmanagers: - scheme: http 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:
這個(gè)時(shí)候再訪問 Alertmanager,可以看到 Alertmanager 已經(jīng)接收到告警了:
下面的問題就是如何讓 Alertmanager 將告警信息發(fā)送給我們了,我們打開默認(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']
參考 官方的配置手冊 了解各個(gè)配置項(xiàng)的功能,其中 global 塊表示一些全局配置;route 塊表示通知路由,可以根據(jù)不同的標(biāo)簽將告警通知發(fā)送給不同的 receiver,這里沒有配置 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)置了下面這些接收方式:雖然接收方式很豐富,但是在國內(nèi),其中大多數(shù)接收方式都很少使用。最常用到的,莫屬 email_config 和 webhook_config,另外 wechat_configs 可以支持使用微信來告警,也是相當(dāng)符合國情的了。其實(shí)告警的通知方式是很難做到面面俱到的,因?yàn)橄④浖鞣N各樣,每個(gè)國家還可能不同,不可能完全覆蓋到,所以 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)。不過在真正使用時(shí),我們會(huì)發(fā)現(xiàn)更多的問題。7.1 服務(wù)發(fā)現(xiàn)
由于 Prometheus 是通過 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í)候就需要通過服務(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),配置方法可以參考手冊的 Configuration 頁面??梢哉f SD 機(jī)制是非常豐富的,但目前由于開發(fā)資源有限,已經(jīng)不再開發(fā)新的 SD 機(jī)制,只對基于文件的 SD 機(jī)制進(jìn)行維護(hù)。關(guān)于服務(wù)發(fā)現(xiàn)網(wǎng)上有很多教程,譬如 Prometheus 官方博客中這篇文章 Advanced Service Discovery in Prometheus 0.14.0 對此有一個(gè)比較系統(tǒng)的介紹,全面的講解了 relabeling 配置,以及如何使用 DNS-SRV、Consul 和文件來做服務(wù)發(fā)現(xiàn)。另外,官網(wǎng)還提供了 一個(gè)基于文件的服務(wù)發(fā)現(xiàn)的入門例子,Julius Volz 寫的 Prometheus workshop 入門教程中也 使用了 DNS-SRV 來當(dāng)服務(wù)發(fā)現(xiàn)。7.2 告警配置管理
無論是 Prometheus 的配置還是 Alertmanager 的配置,都沒有提供 API 供我們動(dòng)態(tài)的修改。一個(gè)很常見的場景是,我們需要基于 Prometheus 做一套可自定義規(guī)則的告警系統(tǒng),用戶可根據(jù)自己的需要在頁面上創(chuàng)建修改或刪除告警規(guī)則,或者是修改告警通知方式和聯(lián)系人,正如在 Prometheus Google Groups 里的 這個(gè)用戶的問題:How to dynamically add alerts rules in rules.conf and prometheus yml file via API or something?不過遺憾的是,Simon Pasquier 在下面說到,目前并沒有這樣的 API,而且以后也沒有這樣的計(jì)劃來開發(fā)這樣的 API,因?yàn)檫@樣的功能更應(yīng)該交給譬如 Puppet、Chef、Ansible、Salt 這樣的配置管理系統(tǒng)。7.3 使用 Pushgateway
Pushgateway 主要用于收集一些短期的 jobs,由于這類 jobs 存在時(shí)間較短,可能在 Prometheus 來 Pull 之前就消失了。官方對 什么時(shí)候該使用 Pushgateway 有一個(gè)很好的說明。總結(jié)
這篇博客參考了網(wǎng)絡(luò)上大量關(guān)于 Prometheus 的中文資料,有文檔,也有博客,比如 1046102779 的 Prometheus 非官方中文手冊,宋佳洋 的電子書《Prometheus 實(shí)戰(zhàn)》,在這里對這些原作者表示敬意。在 Prometheus 官方文檔的 Media 頁面,也提供了很多學(xué)習(xí)資源。關(guān)于 Prometheus,還有非常重要的一部分內(nèi)容這篇博客沒有涉及到,正如博客一開頭所講的,Prometheus 是繼 Kubernetes 之后第二個(gè)加入 CNCF 的項(xiàng)目,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 來對容器進(jìn)行監(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)控有一個(gè)比較全面的介紹。最近兩年 Prometheus 的發(fā)展非常迅速,社區(qū)也非?;钴S,國內(nèi)研究 Prometheus 的人也越來越多。隨著微服務(wù),DevOps,云計(jì)算,云原生等概念的普及,越來越多的企業(yè)開始使用 Docker 和 Kubernetes 來構(gòu)建自己的系統(tǒng)和應(yīng)用,像 Nagios 和 Cacti 這樣的老牌監(jiān)控系統(tǒng)會(huì)變得越來越不適用,相信 Prometheus 最終會(huì)發(fā)展成一個(gè)最適合云環(huán)境的監(jiān)控系統(tǒng)。附錄:什么是時(shí)序數(shù)據(jù)庫?
上文提到 Prometheus 是一款基于時(shí)序數(shù)據(jù)庫的監(jiān)控系統(tǒng),時(shí)序數(shù)據(jù)庫常簡寫為 TSDB(Time Series Database)。很多流行的監(jiān)控系統(tǒng)都在使用時(shí)序數(shù)據(jù)庫來保存數(shù)據(jù),這是因?yàn)闀r(shí)序數(shù)據(jù)庫的特點(diǎn)和監(jiān)控系統(tǒng)不謀而合。- 增:需要頻繁的進(jìn)行寫操作,而且是按時(shí)間排序順序?qū)懭?/section>
- 刪:不需要隨機(jī)刪除,一般情況下會(huì)直接刪除一個(gè)時(shí)間區(qū)塊的所有數(shù)據(jù)
- 改:不需要對寫入的數(shù)據(jù)進(jìn)行更新
- 查:需要支持高并發(fā)的讀操作,讀操作是按時(shí)間順序升序或降序讀,數(shù)據(jù)量非常大,緩存不起作用
DB-Engines 上有一個(gè)關(guān)于時(shí)序數(shù)據(jù)庫的排名,下面是排名靠前的幾個(gè)(2018年10月):- InfluxDB:https://influxdata.com/
- Graphite:http://graphiteapp.org/
- RRDtool:http://oss.oetiker.ch/rrdtool/
- OpenTSDB:http://opentsdb.net/
- Prometheus:https://prometheus.io/
另外,liubin 在他的博客上寫了一個(gè)關(guān)于時(shí)序數(shù)據(jù)庫的系列文章:時(shí)序列數(shù)據(jù)庫武斗大會(huì)(http://liubin.org/blog/2016/02/18/tsdb-intro/),推薦。參考
- The History of Prometheus at SoundCloud
- Prometheus: Monitoring at SoundCloud
- Google And Friends Add Prometheus To Kubernetes Platform
- 還不了解 CNCF?關(guān)于 CNCF 的三問三答!
- 時(shí)序列數(shù)據(jù)庫武斗大會(huì)之什么是TSDB
- 時(shí)序列數(shù)據(jù)庫武斗大會(huì)之TSDB名錄 Part 1
- 使用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的分布式在線服務(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
·END·
如果您喜歡本文,歡迎點(diǎn)擊右上角,把文章分享到朋友圈~~
作者:Aneasystone
來源:https://www.aneasystone.com/archives/2018/11/prometheus-in-action.html
版權(quán)申明:內(nèi)容來源網(wǎng)絡(luò),版權(quán)歸原創(chuàng)者所有。除非無法確認(rèn),我們都會(huì)標(biāo)明作者及出處,如有侵權(quán)煩請告知,我們會(huì)立即刪除并表示歉意。謝謝!