一昂验、Prometheus
?Prometheus(普羅米修斯)是一套開源的監(jiān)控店煞、報(bào)警获讳、時(shí)間序列數(shù)據(jù)庫(kù)的組合申鱼,前身是由SoundCloud公司開發(fā)的警告工具包愤诱。該項(xiàng)目的開發(fā)人員和用戶社區(qū)非常活躍润讥,越來越多的開發(fā)人員和用戶參與到該項(xiàng)目中转锈。目前它是一個(gè)獨(dú)立的開源項(xiàng)目,且不依賴與任何公司楚殿。為了強(qiáng)調(diào)這點(diǎn)和明確該項(xiàng)目治理結(jié)構(gòu)撮慨,Prometheus在2016年繼Kurberntes之后,加入了Cloud Native Computing Foundation脆粥。Google SRE的書內(nèi)也曾提到跟他們BorgMon監(jiān)控系統(tǒng)相似的實(shí)現(xiàn)是Prometheus∑瞿纾現(xiàn)在最常見的Kubernetes容器管理系統(tǒng)中,通常會(huì)搭配Prometheus進(jìn)行監(jiān)控变隔。
?Prometheus基本原理是通過HTTP協(xié)議周期性抓取被監(jiān)控組件的狀態(tài)规伐,這樣做的好處是任意組件只要提供HTTP接口就可以接入監(jiān)控系統(tǒng),不需要任何SDK或者其他的集成過程匣缘。這樣做非常適合虛擬化環(huán)境比如VM或者Docker 猖闪。
?Prometheus應(yīng)該是為數(shù)不多的適合Docker、Mesos肌厨、Kubernetes環(huán)境的監(jiān)控系統(tǒng)之一培慌。
?與其他監(jiān)控系統(tǒng)相比,Prometheus的主要特點(diǎn)是:
- 一個(gè)多維數(shù)據(jù)模型(時(shí)間序列由指標(biāo)名稱定義和設(shè)置鍵/值尺寸)柑爸。
- 非常高效的存儲(chǔ)吵护,平均一個(gè)采樣數(shù)據(jù)占~3.5bytes左右,320萬的時(shí)間序列表鳍,每30秒采樣馅而,保持60天,消耗磁盤大概228G譬圣。
- 一種靈活的查詢語言瓮恭。
- 不依賴分布式存儲(chǔ),單個(gè)服務(wù)器節(jié)點(diǎn)厘熟。
- 時(shí)間集合通過HTTP上的PULL模型進(jìn)行偎血。
- 通過中間網(wǎng)關(guān)支持推送時(shí)間诸衔。
- 通過服務(wù)發(fā)現(xiàn)或靜態(tài)配置發(fā)現(xiàn)目標(biāo)盯漂。
- 多種模式的圖形和儀表板支持颇玷。
二、Prometheus架構(gòu)概覽
可以理解為:Prometheus daemon定時(shí)抓取目標(biāo)metrics(指標(biāo)) 數(shù)據(jù)就缆,每個(gè)抓取目標(biāo)需要暴露一個(gè)http服務(wù)的接口帖渠。
Prometheus:支持通過配置文件、文本文件竭宰、zookeeper空郊、Consul、DNS SRV lookup等方式指定抓取目標(biāo)切揭。支持很多方式的圖表可視化狞甚,例如十分精美的Grafana,自帶的Promdash廓旬,以及自身提供的模版引擎等等哼审,還提供HTTP API的查詢方式,自定義所需要的輸出孕豹。
Alertmanager:是獨(dú)立于Prometheus的一個(gè)組件涩盾,可以支持Prometheus的查詢語句,提供十分靈活的報(bào)警方式励背。
PushGateway:這個(gè)組件是支持Client主動(dòng)推送metrics到PushGateway春霍,而Prometheus只是定時(shí)去Gateway上抓取數(shù)據(jù)。
Exporter 輸出被監(jiān)控組件信息的HTTP接口被叫做exporter 叶眉。目前互聯(lián)網(wǎng)公司常用的組件大部分都有exporter可以直接使用址儒,比如Varnish、Haproxy衅疙、Nginx莲趣、MySQL、Linux 系統(tǒng)信息 (包括磁盤炼蛤、內(nèi)存妖爷、CPU、網(wǎng)絡(luò)等等)理朋。
如果有使用過statsd的用戶絮识,則會(huì)覺得這十分相似,只是statsd是直接發(fā)送給服務(wù)器端嗽上,而Prometheus主要還是靠進(jìn)程主動(dòng)去抓取次舌。
大多數(shù)Prometheus組件都是用Go編寫的,它們可以輕松地構(gòu)建和部署為靜態(tài)二進(jìn)制文件兽愤。訪問prometheus.io以獲取完整的文檔彼念,示例和指南挪圾。
三、Prometheus的數(shù)據(jù)模型
Prometheus從根本上所有的存儲(chǔ)都是按時(shí)間序列去實(shí)現(xiàn)的逐沙,相同的metrics(指標(biāo)名稱) 和label(一個(gè)或多個(gè)標(biāo)簽) 組成一條時(shí)間序列哲思,不同的label表示不同的時(shí)間序列。為了支持一些查詢吩案,有時(shí)還會(huì)臨時(shí)產(chǎn)生一些時(shí)間序列存儲(chǔ)棚赔。
metrics name&label指標(biāo)名稱和標(biāo)簽
每條時(shí)間序列是由唯一的”指標(biāo)名稱”和一組”標(biāo)簽(key=value)”的形式組成。
指標(biāo)名稱:一般是給監(jiān)測(cè)對(duì)像起一名字徘郭,例如http_requests_total這樣靠益,它有一些命名規(guī)則,可以包字母數(shù)字之類的的残揉。通常是以應(yīng)用名稱開頭監(jiān)測(cè)對(duì)像數(shù)值類型單位這樣胧后。例如:push_total、userlogin_mysql_duration_seconds抱环、app_memory_usage_bytes壳快。
標(biāo)簽:就是對(duì)一條時(shí)間序列不同維度的識(shí)別了,例如一個(gè)http請(qǐng)求用的是POST還是GET江醇,它的endpoint是什么濒憋,這時(shí)候就要用標(biāo)簽去標(biāo)記了。最終形成的標(biāo)識(shí)便是這樣了:http_requests_total{method=”POST”,endpoint=”/api/tracks”}陶夜。
記住凛驮,針對(duì)http_requests_total這個(gè)metrics name無論是增加標(biāo)簽還是刪除標(biāo)簽都會(huì)形成一條新的時(shí)間序列。
查詢語句就可以跟據(jù)上面標(biāo)簽的組合來查詢聚合結(jié)果了条辟。
如果以傳統(tǒng)數(shù)據(jù)庫(kù)的理解來看這條語句黔夭,則可以考慮http_requests_total是表名,標(biāo)簽是字段羽嫡,而timestamp是主鍵本姥,還有一個(gè)float64字段是值了。(Prometheus里面所有值都是按float64存儲(chǔ))杭棵。
四婚惫、Prometheus四種數(shù)據(jù)類型
Counter
Counter用于累計(jì)值,例如記錄請(qǐng)求次數(shù)魂爪、任務(wù)完成數(shù)先舷、錯(cuò)誤發(fā)生次數(shù)。一直增加滓侍,不會(huì)減少蒋川。重啟進(jìn)程后,會(huì)被重置撩笆。
例如:http_response_total{method=”GET”,endpoint=”/api/tracks”} 100捺球,10秒后抓取http_response_total{method=”GET”,endpoint=”/api/tracks”} 100缸浦。
Gauge
Gauge常規(guī)數(shù)值,例如 溫度變化氮兵、內(nèi)存使用變化裂逐。可變大胆剧,可變小絮姆。重啟進(jìn)程后,會(huì)被重置秩霍。
例如: memory_usage_bytes{host=”master-01″} 100 < 抓取值、memory_usage_bytes{host=”master-01″} 30蚁阳、memory_usage_bytes{host=”master-01″} 50铃绒、memory_usage_bytes{host=”master-01″} 80 < 抓取值。
Histogram
Histogram(直方圖)可以理解為柱狀圖的意思螺捐,常用于跟蹤事件發(fā)生的規(guī)模颠悬,例如:請(qǐng)求耗時(shí)、響應(yīng)大小定血。它特別之處是可以對(duì)記錄的內(nèi)容進(jìn)行分組赔癌,提供count和sum全部值的功能。
例如:{小于10=5次澜沟,小于20=1次灾票,小于30=2次},count=7次茫虽,sum=7次的求和值刊苍。
Summary
Summary和Histogram十分相似,常用于跟蹤事件發(fā)生的規(guī)模濒析,例如:請(qǐng)求耗時(shí)正什、響應(yīng)大小。同樣提供 count 和 sum 全部值的功能号杏。
例如:count=7次婴氮,sum=7次的值求值。它提供一個(gè)quantiles的功能盾致,可以按%比劃分跟蹤的結(jié)果主经。例如:quantile取值0.95,表示取采樣值里面的95%數(shù)據(jù)绰上。
五旨怠、安裝運(yùn)行Prometheus
首先安裝go
$ yum install go
如果是烏班圖,則是 $ sudo apt-get install golang-go
$ go version
下載安裝Prometheus
$ wget https://github.com/prometheus/prometheus/releases/download/v1.6.2/prometheus-1.6.2.linux-amd64.tar.gz
$ tar xvf prometheus-1.6.2.linux-amd64.tar.gz -C /usr/local/
$ cd /usr/local/prometheus
變更Prometheus的配置文件
$ vim prometheus.yml
這里要注意的是蜈块,target處要填寫exporter對(duì)應(yīng)listen的端口鉴腻。
而且prometheus與exporter盡量不要部署在一臺(tái)服務(wù)器迷扇。
變更配置后,記得重啟下服務(wù)爽哎。
在編輯配置文件時(shí)蜓席,要注意縮進(jìn)。
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: ['127.0.0.1:9090']
- job_name: 'mysql'
static_configs:
- targets: ['ip:port']
labels:
instance: mysql-label
啟動(dòng)服務(wù)
$ ./prometheus -config.file=prometheus.yml &
安裝并運(yùn)行exporter
在被監(jiān)控服務(wù)主機(jī)或任意一臺(tái)salver安裝go環(huán)境
$ yum install go
$ go version
下載node_exporter及mysqld_exporter
$ wget https://github.com/prometheus/node_exporter/releases/download/v0.14.0/node_exporter-0.14.0.linux-amd64.tar.gz
$ wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.10.0/mysqld_exporter-0.10.0.linux-amd64.tar.gz
$ tar xvf node_exporter-0.14.0.linux-amd64.tar.gz -C /usr/local/
$ tar xvf mysqld_exporter-0.10.0.linux-amd64.tar.gz -C /usr/local/
運(yùn)行node_exporter服務(wù)
$ nohup /usr/local/node_exporter-0.14.0.linux-amd64/node_exporter &
配置被監(jiān)控的mysql
配置文件位置可以指定课锌。
$ cd /usr/local/
$ cd mysqld_exporter-0.10.0.linux-amd64/
$ vim .myrds.cnf
可以使用現(xiàn)有體系內(nèi)的賬號(hào)厨内,但賬號(hào)必須有replication client權(quán)限。
[client]
host=host
port=port
user=user
password=pwd
啟動(dòng)mysqld_exporter服務(wù)
$ /usr/local/mysqld_exporter-0.10.0.linux-amd64/mysqld_exporter -config.my-cnf=/usr/local/mysqld_exporter-0.10.0.linux-amd64/.myrds.cnf --web.listen-address=0.0.0.0:9104
不指定端口的話渺贤,默認(rèn)為9190雏胃。其他參數(shù)可以通過--help查看。
redis監(jiān)控相對(duì)而言較簡(jiǎn)單志鞍,不需要配置文件瞭亮,在命令中指定ip端口及pwd即可(前提是node_exporter服務(wù)已部署)。
下載redis_exporter服務(wù)
$ wget https://github.com/oliver006/redis_exporter/releases/download/v0.13/redis_exporter-v0.13.linux-amd64.tar.gz
$ tar xvf redis_exporter-v0.20.2.linux-amd64.tar.gz -C /usr/local/
我下載的時(shí)候是被墻了固棚⊥臭妫可以下載到本地再上傳到服務(wù)器。
redis_exporter不需要配置文件此洲,在啟動(dòng)時(shí)夾帶參數(shù)厂汗。
啟動(dòng)redis_export服務(wù)
$ ./redis_exporter -redis.addr 你的redis ip:端口 -redis.password 密碼 --web.listen-address="0.0.0.0:9106" &
同樣的,后面的參數(shù)代表監(jiān)聽的端口呜师,可以任意指定娶桦。