Prometheus 是一款基于時序數(shù)據(jù)庫的開源監(jiān)控告警系統(tǒng)蕾域,說起 Prometheus 則不得不提 SoundCloud旨巷,這是一個在線音樂分享的平臺巨缘,類似于做視頻分享的 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 作為一個微服務(wù)架構(gòu)監(jiān)控系統(tǒng)的解決方案,它和容器也脫不開關(guān)系思喊。早在 2006 年 8 月 9 日诬留,Eric Schmidt 在搜索引擎大會上首次提出了云計(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 基金會的 云原生計(jì)算基金會(CNCF浑度,Cloud Native Computing Foundation) 應(yīng)運(yùn)而生俺泣。第一個加入 CNCF 的項(xiàng)目是 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ù)模型
- 方便的部署和維護(hù)
- 靈活的數(shù)據(jù)采集
- 強(qiáng)大的查詢語言
實(shí)際上,多維度數(shù)據(jù)模型和強(qiáng)大的查詢語言這兩個特性二蓝,正是時序數(shù)據(jù)庫所要求的誉券,所以 Prometheus 不僅僅是一個監(jiān)控系統(tǒng),同時也是一個時序數(shù)據(jù)庫刊愚。那為什么 Prometheus 不直接使用現(xiàn)有的時序數(shù)據(jù)庫作為后端存儲呢踊跟?這是因?yàn)?SoundCloud 不僅希望他們的監(jiān)控系統(tǒng)有著時序數(shù)據(jù)庫的特點(diǎn),而且還需要部署和維護(hù)非常方便鸥诽。
縱觀比較流行的時序數(shù)據(jù)庫(參見下面的附錄)商玫,他們要么組件太多,要么外部依賴繁重牡借,比如:Druid 有 Historical炬藤、MiddleManager畅买、Broker、Coordinator湃缎、Overlord、Router 一堆的組件,而且還依賴于 ZooKeeper偿洁、Deep storage(HDFS 或 S3 等),Metadata store(PostgreSQL 或 MySQL)宾肺,部署和維護(hù)起來成本非常高。而 Prometheus 采用去中心化架構(gòu),可以獨(dú)立部署跪者,不依賴于外部的分布式存儲,你可以在幾分鐘的時間里就可以搭建出一套監(jiān)控系統(tǒng)忘衍。
此外,Prometheus 數(shù)據(jù)采集方式也非常靈活星掰。要采集目標(biāo)的監(jiān)控?cái)?shù)據(jù),首先需要在目標(biāo)處安裝數(shù)據(jù)采集組件播玖,這被稱之為 Exporter掰吕,它會在目標(biāo)處收集監(jiān)控?cái)?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)眼五,更豐富的圖表展示,使用外部存儲桌吃,強(qiáng)大的告警規(guī)則和多樣的通知方式。下圖是 Prometheus 的整體架構(gòu)圖:
圖片
從上圖可以看出翎卓,Prometheus 生態(tài)系統(tǒng)包含了幾個關(guān)鍵的組件:Prometheus server微饥、Pushgateway矩肩、Alertmanager黍檩、Web UI 等,但是大多數(shù)組件都不是必需的,其中最核心的組件當(dāng)然是 Prometheus server,它負(fù)責(zé)收集和存儲指標(biāo)數(shù)據(jù),支持表達(dá)式查詢麦轰,和告警的生成侧纯。接下來我們就來安裝 Prometheus server妹笆。
二、安裝 Prometheus server
Prometheus 可以支持多種安裝方式海渊,包括 Docker徙菠、Ansible芙盘、Chef记餐、Puppet囚衔、Saltstack 等他宛。下面介紹最簡單的兩種方式拗馒,一種是直接使用編譯好的可執(zhí)行文件杈女,開箱即用,另一種是使用 Docker 鏡像。
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 --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.2 使用 Docker 鏡像
使用 Docker 安裝 Prometheus 更簡單砰碴,運(yùn)行下面的命令即可:
$ 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 在容器中默認(rèn)加載的配置文件位置兰珍。如果我們不確定默認(rèn)的配置文件在哪,可以先執(zhí)行上面的不帶 -v
參數(shù)的命令斧蜕,然后通過 docker inspect
命名看看容器在運(yùn)行時默認(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 有一個配置文件肛搬,通過參數(shù) --config.file
來指定,配置文件格式為 YAML雄驹。我們可以打開默認(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
表示多久檢測一次告警規(guī)則; - alerting 塊:關(guān)于 Alertmanager 的配置悄谐,這個我們后面再看望伦;
- rule_files 塊:告警規(guī)則,這個我們后面再看艺栈;
- scrape_config 塊:這里定義了 Prometheus 要抓取的目標(biāo)堰塌,我們可以看到默認(rèn)已經(jīng)配置了一個名稱為
prometheus
的 job空闲,這是因?yàn)?Prometheus 在啟動的時候也會通過 HTTP 接口暴露自身的指標(biāo)數(shù)據(jù)残邀,這就相當(dāng)于 Prometheus 自己監(jiān)控自己皆辽,雖然這在真正使用 Prometheus 時沒啥用處,但是我們可以通過這個例子來學(xué)習(xí)如何使用 Prometheus芥挣;可以訪問http://localhost:9090/metrics
查看 Prometheus 暴露了哪些指標(biāo)驱闷;
三、學(xué)習(xí) PromQL
通過上面的步驟安裝好 Prometheus 之后空免,我們現(xiàn)在可以開始體驗(yàn) Prometheus 了空另。Prometheus 提供了可視化的 Web UI 方便我們操作,直接訪問 http://localhost:9090/
即可蹋砚,它默認(rèn)會跳轉(zhuǎn)到 Graph 頁面:
第一次訪問這個頁面可能會不知所措扼菠,我們可以先看看其他菜單下的內(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ù)帽撑,這個表達(dá)式被稱為 PromQL(Prometheus Query Language)振劳。通過 PromQL 不僅可以在 Graph 頁面查詢數(shù)據(jù),而且還可以通過 Prometheus 提供的 HTTP API 來查詢油狂。查詢的監(jiān)控?cái)?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)控?cái)?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)簽 code
、instance
和 job
柿菩,這條記錄的值為 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ù)模型是比較類似的醇份,詳細(xì)的信息可以參考官網(wǎng)文檔 Data model。另外吼具,關(guān)于指標(biāo)和標(biāo)簽的命名僚纷,官網(wǎng)有一些指導(dǎo)性的建議,可以參考 Metric and label naming 拗盒。
雖然 Prometheus 里存儲的數(shù)據(jù)都是 float64 的一個數(shù)值怖竭,但如果我們按類型來分,可以把 Prometheus 的數(shù)據(jù)分成四大類:
- Counter
- Gauge
- Histogram
- Summary
Counter 用于計(jì)數(shù)陡蝇,例如:請求次數(shù)痊臭、任務(wù)完成數(shù)哮肚、錯誤發(fā)生次數(shù),這個值會一直增加广匙,不會減少允趟。Gauge 就是一般的數(shù)值,可大可小鸦致,例如:溫度變化潮剪、內(nèi)存使用變化。Histogram 是直方圖分唾,或稱為柱狀圖抗碰,常用于跟蹤事件發(fā)生的規(guī)模,例如:請求耗時绽乔、響應(yīng)大小弧蝇。
它特別之處是可以對記錄的內(nèi)容進(jìn)行分組,提供 count 和 sum 的功能迄汛。Summary 和 Histogram 十分相似捍壤,也用于跟蹤事件發(fā)生的規(guī)模骤视,不同之處是鞍爱,它提供了一個 quantiles 的功能,可以按百分比劃分跟蹤的結(jié)果专酗。例如:quantile 取值 0.95睹逃,表示取采樣值里面的 95% 數(shù)據(jù)。更多信息可以參考官網(wǎng)文檔 Metric types祷肯,Summary 和 Histogram 的概念比較容易混淆沉填,屬于比較高階的指標(biāo)類型,可以參考 Histograms and summaries 這里的說明佑笋。
這四種類型的數(shù)據(jù)只在指標(biāo)的提供方作區(qū)分翼闹,也就是上面說的 Exporter,如果你需要編寫自己的 Exporter 或者在現(xiàn)有系統(tǒng)中暴露供 Prometheus 抓取的指標(biāo)蒋纬,你可以使用 Prometheus client libraries猎荠,這個時候你就需要考慮不同指標(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)名稱宪睹,比如:
# 表示 Prometheus 能否抓取 target 的指標(biāo)愁茁,用于 target 的健康檢查
up
這條語句會查出 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
也可以指定某個 label 來查詢:
up{job="prometheus"}
這種寫法被稱為 Instant vector selectors横堡,這里不僅可以使用 =
號埋市,還可以使用 !=
、=~
命贴、!~
道宅,比如下面這樣:
up{job!="prometheus"}
up{job=~"server|mysql"}
up{job=~"192\.168\.0\.107.+"}
=~
是根據(jù)正則表達(dá)式來匹配,必須符合 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ū)別)嚷量。
# 計(jì)算的是每秒的平均值陋桂,適用于變化很慢的 counter
# per-second average rate of increase, for slow-moving counters
rate(http_requests_total[5m])
# 計(jì)算的是每秒瞬時增加速率,適用于變化很快的 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 做一個對比岛请,會發(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/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)試刮吧。要實(shí)現(xiàn)一個強(qiáng)大的監(jiān)控系統(tǒng)湖饱,還需要一個能定制展示不同指標(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 是一個用于可視化大型測量數(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ù)源的配置頁面:
圖片
我們在這里依次填上:
- 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 會默認(rèn)提供幾個已經(jīng)配置好的面板供你使用酗失,如下圖所示义钉,默認(rèn)提供了三個面板:Prometheus Stats、Prometheus 2.0 Stats 和 Grafana metrics规肴。點(diǎn)擊 Import 就可以導(dǎo)入并使用該面板捶闸。
我們導(dǎo)入 Prometheus 2.0 Stats 這個面板,可以看到下面這樣的監(jiān)控面板拖刃。如果你的公司有條件删壮,可以申請個大顯示器掛在墻上,將這個面板投影在大屏上兑牡,實(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 查詢引润,這個指標(biāo)收集程序被稱為 Exporter巩趁,不同的指標(biāo)需要不同的 Exporter 來收集,目前已經(jīng)有大量的 Exporter 可供使用淳附,幾乎囊括了我們常用的各種系統(tǒng)和軟件议慰。
官網(wǎng)列出了一份 常用 Exporter 的清單,各個 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道偷,這個 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ù)器負(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ù):
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
另一種方式是通過配置文件岖是,默認(rèn)的配置文件是 ~/.my.cnf
帮毁,或者通過 --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豺撑。
注意事項(xiàng)
這里為簡單起見烈疚,在 mysqld_exporter 中直接使用了 root 連接數(shù)據(jù)庫,在真實(shí)環(huán)境中聪轿,可以為 mysqld_exporter 創(chuàng)建一個單獨(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 最新的版本中增加了一個新接口:/status/format/prometheus
骗炉,這個接口可以直接返回 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 級別的流量統(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 是一個 Java Agent 程序诡挂,在運(yùn)行 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ù)是否正確獲取:
$ curl http://localhost:9404/metrics
六城豁、告警和通知
至此苟穆,我們能收集大量的指標(biāo)數(shù)據(jù),也能通過強(qiáng)大而美觀的面板展示出來唱星。不過作為一個監(jiān)控系統(tǒng)雳旅,最重要的功能,還是應(yīng)該能及時發(fā)現(xiàn)系統(tǒng)問題间聊,并及時通知給系統(tǒng)負(fù)責(zé)人攒盈,這就是 Alerting(告警)。
Prometheus 的告警功能被分成兩部分:一個是告警規(guī)則的配置和檢測哎榴,并將告警發(fā)送給 Alertmanager型豁,另一個是 Alertmanager,它負(fù)責(zé)管理這些告警尚蝌,去除重復(fù)數(shù)據(jù)迎变,分組,并路由到對應(yīng)的接收方式飘言,發(fā)出報(bào)警衣形。常見的接收方式有:Email、PagerDuty姿鸿、HipChat泵喘、Slack、OpsGenie般妙、WebHook 等纪铺。
6.1 配置告警規(guī)則
我們在上面介紹 Prometheus 的配置文件時了解到,它的默認(rèn)配置文件 prometheus.yml 有四大塊:global
碟渺、alerting
鲜锚、rule_files
、scrape_config
苫拍,其中 rule_files
塊就是告警規(guī)則的配置項(xiàng)芜繁,alerting 塊用于配置 Alertmanager,這個我們下一節(jié)再看∪藜現(xiàn)在骏令,先讓我們在 rule_files
塊中添加一個告警規(guī)則文件:
rule_files:
- "alert.rules"
然后參考 官方文檔,創(chuàng)建一個告警規(guī)則文件 alert.rules
:
groups:
- name: example
rules:
# Alert for any instance that is unreachable for >5 minutes.
- 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 for any instance that has a median request latency >1s.
- 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)"
這個規(guī)則文件里垄提,包含了兩條告警規(guī)則:InstanceDown
和 APIHighRequestLatency
榔袋。顧名思義周拐,InstanceDown 表示當(dāng)實(shí)例宕機(jī)時(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ī)則生成的告警:
圖片
這里我們將一個實(shí)例停掉吏够,可以看到有一條 alert 的狀態(tài)是 PENDING
勾给,這表示已經(jīng)觸發(fā)了告警規(guī)則,但還沒有達(dá)到告警條件锅知。這是因?yàn)檫@里配置的 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 啟動后默認(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"
這個配置告訴 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ā)送給我們了胞四,我們打開默認(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']
參考 官方的配置手冊 了解各個配置項(xiàng)的功能,其中 global 塊表示一些全局配置伶椿;route 塊表示通知路由辜伟,可以根據(jù)不同的標(biāo)簽將告警通知發(fā)送給不同的 receiver,這里沒有配置 routes 項(xiàng)脊另,表示所有的告警都發(fā)送給下面定義的 web.hook 這個 receiver导狡;如果要配置多個路由,可以參考 這個例子:
routes:
- receiver: 'database-pager'
group_wait: 10s
match_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)符合國情的了料皇。
其實(shí)告警的通知方式是很難做到面面俱到的,因?yàn)橄④浖鞣N各樣星压,每個國家還可能不同践剂,不可能完全覆蓋到,所以 Alertmanager 已經(jīng)決定不再添加新的 receiver 了娜膘,而是推薦使用 webhook 來集成自定義的接收方式逊脯。可以參考 這些集成的例子竣贪,譬如 將釘釘接入 Prometheus AlertManager WebHook军洼。
七、學(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)控?cái)?shù)據(jù),所以需要手工指定監(jiān)控節(jié)點(diǎn)的列表歹叮,當(dāng)監(jiān)控的節(jié)點(diǎn)增多之后跑杭,每次增加節(jié)點(diǎn)都需要更改配置文件,非常麻煩咆耿,這個時候就需要通過服務(wù)發(fā)現(xiàn)(service discovery德谅,SD)機(jī)制去解決。
Prometheus 支持多種服務(wù)發(fā)現(xiàn)機(jī)制萨螺,可以自動獲取要收集的 targets窄做,可以參考 這里,包含的服務(wù)發(fā)現(xiàn)機(jī)制包括:azure屑迂、consul浸策、dns、ec2惹盼、openstack庸汗、file、gce手报、kubernetes蚯舱、marathon改化、triton、zookeeper(nerve枉昏、serverset)陈肛,配置方法可以參考手冊的 Configuration 頁面⌒至眩可以說 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 對此有一個比較系統(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腻贰,而且以后也沒有這樣的計(jì)劃來開發(fā)這樣的 API,因?yàn)檫@樣的功能更應(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 實(shí)戰(zhàn)》,在這里對這些原作者表示敬意狂巢。在 Prometheus 官方文檔的 Media 頁面撑毛,也提供了很多學(xué)習(xí)資源。
關(guān)于 Prometheus唧领,還有非常重要的一部分內(nèi)容這篇博客沒有涉及到藻雌,正如博客一開頭所講的,Prometheus 是繼 Kubernetes 之后第二個加入 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)控有一個比較全面的介紹谤草。
最近兩年 Prometheus 的發(fā)展非常迅速,社區(qū)也非齿杭椋活躍丑孩,國內(nèi)研究 Prometheus 的人也越來越多。隨著微服務(wù)灭贷,DevOps温学,云計(jì)算,云原生等概念的普及甚疟,越來越多的企業(yè)開始使用 Docker 和 Kubernetes 來構(gòu)建自己的系統(tǒng)和應(yīng)用仗岖,像 Nagios 和 Cacti 這樣的老牌監(jiān)控系統(tǒng)會變得越來越不適用,相信 Prometheus 最終會發(fā)展成一個最適合云環(huán)境的監(jiān)控系統(tǒng)览妖。最后轧拄,關(guān)注Java知音公眾號,回復(fù)“后端面試”讽膏,送你一份面試題寶典檩电!
附錄:什么是時序數(shù)據(jù)庫?
上文提到 Prometheus 是一款基于時序數(shù)據(jù)庫的監(jiān)控系統(tǒng),時序數(shù)據(jù)庫常簡寫為 TSDB(Time Series Database)是嗜。很多流行的監(jiān)控系統(tǒng)都在使用時序數(shù)據(jù)庫來保存數(shù)據(jù)愈案,這是因?yàn)闀r序數(shù)據(jù)庫的特點(diǎn)和監(jiān)控系統(tǒng)不謀而合。
- 增:需要頻繁的進(jìn)行寫操作鹅搪,而且是按時間排序順序?qū)懭?/li>
- 刪:不需要隨機(jī)刪除站绪,一般情況下會直接刪除一個時間區(qū)塊的所有數(shù)據(jù)
- 改:不需要對寫入的數(shù)據(jù)進(jìn)行更新
- 查:需要支持高并發(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/
另外甫题,liubin 在他的博客上寫了一個關(guān)于時序數(shù)據(jù)庫的系列文章:時序列數(shù)據(jù)庫武斗大會馁筐,推薦。
參考
- 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 的三問三答敏沉!
- 時序列數(shù)據(jù)庫武斗大會之什么是TSDB
- 時序列數(shù)據(jù)庫武斗大會之TSDB名錄 Part 1
- Prometheus 入門
- Prometheus 初探
- 監(jiān)控利器之 Prometheus
- 使用Prometheus+Grafana監(jiān)控MySQL實(shí)踐
- 使用Prometheus+grafana打造高逼格監(jiān)控平臺
- 初試 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 自動創(chuàng)建監(jiān)控圖
- Prometheus+Grafana監(jiān)控部署實(shí)踐
- How To Install Prometheus using Docker on Ubuntu 14.04
來源:http://aneasystone.com/archives/2018/11/prometheus-in-action.html
本文首發(fā)于公眾號:Java版web項(xiàng)目,歡迎關(guān)注獲取更多精彩內(nèi)容