一直以來急迂,我們會在項目中,使用 APM 去監(jiān)控應(yīng)用的狀況僚碎,分析性能等,這些工具很有效卷中,而且不侵入業(yè)務(wù)渊抽,不需要埋點。
然而十减,有些需求愤估,是 APM 的監(jiān)控滿足不了的,比如應(yīng)用業(yè)務(wù)指標由驹。
監(jiān)控模式
目前昔园,采集指標有兩種方式,一種是『推』润樱,另一種就是『拉』:
推的代表有 ElasticSearch羡棵,InfluxDB,OpenTSDB 等店展,需要你從程序中將指標使用 TCP台妆,UDP 等方式推送至相關(guān)監(jiān)控應(yīng)用玖媚,只是使用 TCP 的話盅安,一旦監(jiān)控應(yīng)用掛掉或存在瓶頸震缭,容易對應(yīng)用本身產(chǎn)生影響糖赔,而使用 UDP 的話,雖然不用擔(dān)心監(jiān)控應(yīng)用逝变,但是容易丟數(shù)據(jù)奋构。
拉的代表,主要代表就是 Prometheus宴咧,讓我們不用擔(dān)心監(jiān)控應(yīng)用本身的狀態(tài)径缅。而且,可以利用 DNS-SRV 或者 Consul 等服務(wù)發(fā)現(xiàn)功能就可以自動添加監(jiān)控。
當(dāng)然兆旬,InfluxDB 加上 collector,或者 ES 加上 metricbeat 也可以變?yōu)?『拉』怎栽,而 Prometheus 加上 Push Gateway 也可以變?yōu)?『推』。
接下來脚祟,我們主要介紹下 Prometheus强饮。
Prometheus
『普羅米修斯』,也是希臘之神行您,取義『先見之明』,應(yīng)該就是監(jiān)控的意義所在吧剪廉。
它跟 k8s 一樣,也是依據(jù) Google 內(nèi)部的應(yīng)用原理設(shè)計來的捌斧,可以看作是 Google 內(nèi)部監(jiān)控系統(tǒng) Borgmon 的一個實現(xiàn)。
架構(gòu)圖如下(來自 Prometheus 官方文檔):
Prometheus 可以從配置或者用服務(wù)發(fā)現(xiàn)妇押,去調(diào)用各個應(yīng)用的 metrics 接口洞难,來采集數(shù)據(jù)队贱,然后存儲在硬盤中,而如果是基礎(chǔ)應(yīng)用比如數(shù)據(jù)庫柱嫌,負載均衡器等,可以在相關(guān)的服務(wù)中安裝 Exporters 來提供 metrics 接口供 Prometheus 拉取与学。
采集到的數(shù)據(jù)有兩個去向嘉抓,一個是報警,另一個是可視化卵佛。
下面將一一介紹敞斋。
Metrics 格式
<metric name>{<label name>=<label value>, ...}
各個部分需符合相關(guān)的正則表達式
- metric name: [a-zA-Z_:][a-zA-Z0-9_:]*
- label name: [a-zA-Z0-9_]*
- label value: .* (即不限制)
需要注意的是植捎,label value 最好使用枚舉值,而不要使用無限制的值焰枢,比如用戶 ID济锄,Email 等,不然會消耗大量內(nèi)存拟淮,也不符合指標采集的意義很泊。
Metrics 接口的實現(xiàn)
大部分語言都有提供客戶端沾谓,比如 Node.js 的客戶端 prom-client:
npm install prom-client --save
目前戳鹅,這個客戶端提供了完整功能,可以在應(yīng)用中埋點采集數(shù)據(jù)妇穴,比如
- 今天注冊了多少用戶隶债,收入了多少錢,可以使用
Counter
; - Node 內(nèi)存以及 CPU 的變化瞒滴,可以使用
Gause
赞警; - API 接口響應(yīng)時間的統(tǒng)計,可以使用
Histogram
或者Summary
世剖,前者可以按照具體數(shù)值笤虫,而后者可以按照百分比去統(tǒng)計響應(yīng)時長;
對了境蜕,這個包內(nèi)部提供了采集默認數(shù)據(jù)的功能凌停,比如 Node 相關(guān)的指標:
const promClient = require('prom-client');
promClient.collectDefaultMetrics({
timeout: 5000,
});
報警
你可以根據(jù)業(yè)務(wù)需求售滤,來定制相關(guān)的規(guī)則去報警完箩,然后關(guān)鍵就來了,你是否在傳統(tǒng)的短信或者郵件報警中感到厭煩呢阻逮?
一方面秩彤,當(dāng)線上問題出現(xiàn)的時候事哭,我們會收到大量的報警消息瓜富,而其中很大一部分是重復(fù)的;另一方面谤辜,收到?jīng)]用的報警价捧,或者報警級別不高,導(dǎo)致這時候如果有重要的報警渠欺,會被我們忽略椎眯。
Prometheus 的 AlertManager 提供了解決這些問題的各種高級報警功能。
- 報警分組:將報警分組舔稀,當(dāng)報警大量出現(xiàn)的時候掌测,只會發(fā)一條消息告訴你數(shù)據(jù)庫掛了的情況出現(xiàn)了 100 次,而不是用 100 條推送轟炸你夜郁;
- 報警抑制:顯然粘勒,當(dāng)數(shù)據(jù)庫出問題的時候庙睡,其它的應(yīng)用可肯定會出問題,這時候你可能不會需要其它的不相干的報警短信乘陪,這個功能將真正有用的信息及時通知你啡邑;
- 報警靜默:一些不重要的報警,可以完全忽略贵扰,因此也就沒有必要通知;
報警通知的方式拔鹰,目前可以通過 webhook, email 等方式列肢,估計微信或者釘釘也可以,我目前使用的是 slack拴还。
可視化
首選當(dāng)然是 Grafana欧聘,Prometheus 自己放棄了 PromDash 的可視化工具,而專注于監(jiān)控數(shù)據(jù)采集與分析怀骤。在 Grafana 中配置 Prometheus 也很簡單蒋伦,在配置好數(shù)據(jù)源之后,可以直接創(chuàng)建圖表痕届。
需要注意的是研叫,你會需要用到 Prometheus 專用的查詢語言去配置數(shù)據(jù),其中如果涉及到的圖表內(nèi)容太多渊啰,你可能會需要用到 Grafana 的模板:
- label_values(label):全局中 label 值的集合渤昌;
- label_values(metric, label):某個 metric 的 label 值的集合走搁;
- metrics(metric):metric 的正則表達集合,返回全部匹配的 metric忌栅;
- query_result(query):返回查詢集合;
Ref
- https://prometheus.io/docs/operating/configuration/
- https://prometheus.io/blog/2015/06/01/advanced-service-discovery/
- http://docs.grafana.org/features/datasources/prometheus/
原鏈接:https://xizhibei.github.io/2017/08/06/monitoring-with-prometheus