一般來講,對於一個運行時的複雜系統,若是系統出了問題是很難排查的。由於你是不太可能在運行時一邊檢查代碼一邊調試的。所以,你須要在各類關鍵點加上監控,經過監控獲取的數據,指導咱們進一步工做,解決問題。node
用開車做爲例子:車子自己是一個極其複雜的系統,而當你的車在高速上以 120 千米的速度狂奔時出現了噪音,你是不可能這時候邊開車邊打開發動機蓋子來查緣由的。一般來講,好一點的車會有內置電腦,在車子出問題時,告訴你左邊輪胎胎壓有問題,或是發動機缺水了之類。而這些檢測,就是系統監控的一個例子。linux
對於車輛自己,駕駛員關心的指標以下:git
經過儀表盤,你不必定能清楚地瞭解車子出問題的具體緣由,但至少能夠給你一個大概的方向。好比說,若是水溫很高時出現了問題,你大機率能夠嘗試加點水降溫來嘗試是否解決問題。golang
把上面的車類比計算機系統或者一個軟件系統:Grafana就是儀表盤,它和車輛的速度表、水溫表是一類的,經過這些錶盤你能夠實時瞭解系統運行狀況。而Prometheus做爲一個時序數據庫,其實它和你們熟知的Mysql是一類的東西,都是存儲數據,提供查詢的,它存儲了計算機系統在各個時間點上的監控數據。而Grafana儀表盤上的數據,就是經過查詢Prometheus獲取的。web
是一個監控儀表系統,由Grafana Labs公司開源的的一個系統監測 (System Monitoring) 工具。幫助用戶簡化監控的複雜度,用戶只須要提供須要監控的數據,它就能夠生成各類可視化儀表。同時它還支持報警功能,能夠在系統出現問題時通知用戶。而且Grafana不只僅只支持Prometheus做爲查詢的數據庫,它還支持以下:正則表達式
Prometheus是一個時間序列數據庫。可是,它不只僅是一個時間序列數據庫。它涵蓋了能夠綁定的整個生態系統工具集及其功能。Prometheus主要用於對基礎設施的監控,包括服務器(CPU、MEM等)、數據庫(MYSQL、PostgreSQL等)、Web服務等,幾乎全部東西均可以經過Prometheus進行監控。而它的數據,則是經過配置,創建與數據源的聯繫來獲取的。sql
雖然Grafana能夠從多種數據(如Prometheus、MySQL/PostgreSQL、OpenTSDB)等等中獲取數據,不過Prometheus天生就是爲了監控而生,因此咱們用的最多的仍是Prometheus。這也是咱們的標配哦~數據庫
在Prometheus的架構設計中,Prometheus並不直接服務監控特定的目標,就好比咱們監控linux系統,Prometheus不會本身親自去監控linux的各項指標。其主要任務負責數據的收集,存儲而且對外提供數據查詢支持。express
所以爲了可以監控到某些東西,如主機的CPU使用率,咱們須要使用到Exporter。Exporter是一個相對開放的概念,不是專門指某一個程序。它能夠是一個獨立運行的程序,獨立於監控目標之外(如Node Exporter程序,獨立於操做系統,卻能獲取到系統各種指標)。也能夠是直接內置在監控目標中的代碼(如在項目代碼層面接入普羅米修斯API,實現指標上報)。總結下來就是,只要可以向Prometheus提供標準格式的監控樣本數據,那就是一個Exporter。segmentfault
而Prometheus週期性的從Exporter暴露的HTTP服務地址(一般是/metrics)拉取監控樣本數據。
對於你們常見的監控主機運行的指標如CPU, 內存,磁盤等信息,咱們能夠爲linux系統下載Node Exporter程序,該程序會監控linux各項指標,並經過:http://<IP>:9100/metrics
來展現各項指標。而其給咱們返回的內容以下圖所示:
看完本圖,你們確定仍是對圖中的各類內容比較疑惑。不過你們不用着急,我會在下一個章節給你們解釋~
如今咱們有了如下3個部分:
在上一節中,咱們訪問Node Exporter暴露的HTTP服務,獲取到了一系列的監控指標。而這些監控指標即是Prometheus能夠採集到當前主機全部監控指標的樣本數據。這裏再把圖放一遍,並進行解釋。
Prometheus會將全部採集到的樣本數據以時間序列(time-series)的方式保存在內存數據庫中,而且定時保存到硬盤上。時間序列保存方式是指按照時間戳和值的序列順序存放,也稱之爲向量(vector)。 每條時間序列經過指標名稱(metrics name)和一組標籤集(labelset)命名。以下圖所示,能夠將向量理解爲一個以時間爲X軸,值爲Y軸的數字矩陣:
在時間序列中的每個點(即圖上的小黑點)稱爲一個樣本(sample),樣本由如下三部分組成:
A{a="x",b="y"}
;即樣本可表示爲:
A{a="x",b="y"}@1434417560938 => 94355
其中1434417560938是時間戳,94355是值。
在形式上,全部的指標(Metric)都經過以下格式標示:
<metric name>{<label name>=<label value>, ...}
指標的名稱(metric name)能夠反映被監控樣本的含義(好比,http_request\_total - 表示當前系統接收到的HTTP請求總量)。指標名稱只能由ASCII字符、數字、下劃線以及冒號組成並必須符合正則表達式[a-zA-Z_:]a-zA-Z0-9\_:*。
標籤反映了當前樣本的特徵維度,經過這些維度Prometheus能夠對樣本數據進行過濾,聚合等。標籤的名稱只能由ASCII字符、數字以及下劃線組成並知足正則表達式a-zA-Z\_*。
其中以\_做爲前綴的標籤,是系統保留的關鍵字,只能在系統內部使用。標籤的值則能夠包含任何Unicode編碼的字符。
ps:本文只對PromQL作一個簡單介紹,提供經常使用方法,若是要深刻了解,能夠查看:prometheus-book。
Prometheus經過指標名稱(metrics name)以及對應的一組標籤(labelset)惟必定義一條時間序列。指標名稱反映了監控樣本的基本標識,而label則在這個基本特徵上爲採集到的數據提供了多種特徵維度。用戶能夠基於這些特徵維度過濾,聚合,統計從而產生新的計算後的一條時間序列。
PromQL是Prometheus內置的數據查詢語言,其提供對時間序列數據豐富的查詢,聚合以及邏輯運算能力的支持。而且被普遍應用在Prometheus的平常應用當中,包括對數據查詢、可視化、告警處理當中。能夠這麼說,PromQL是Prometheus全部應用場景的基礎,理解和掌握PromQL是Prometheus入門的第一課。
當Prometheus經過Exporter採集到相應的監控指標樣本數據後,咱們就能夠經過PromQL對監控樣本數據進行查詢。當咱們直接使用監控指標名稱查詢時,能夠查詢該指標下的全部時間序列(不帶篩選條件)。如:
http_requests_total
等同於:
http_requests_total{}
該表達式會返回指標名稱爲http\_requests\_total的全部時間序列。
PromQL還支持用戶根據時間序列的標籤匹配模式來對時間序列進行過濾,目前主要支持兩種匹配模式:徹底匹配和正則匹配。
徹底匹配:
PromQL支持使用=和!=兩種徹底匹配模式:
例如,若是咱們只須要查詢全部http\_requests\_total時間序列中知足標籤instance爲localhost:9090的時間序列,則可使用以下表達式:
不徹底匹配:
除了使用徹底匹配的方式對時間序列進行過濾之外,PromQL還能夠支持使用正則表達式做爲匹配條件,多個表達式之間使用|進行分離:
例如,若是想查詢多個環節下的時間序列序列可使用以下表達式:
http_requests_total{environment=~"staging|testing|development",method!="GET"}
直接經過相似於PromQL表達式http\_requests\_total查詢時間序列時,返回值中只會包含該時間序列中的最新的一個樣本值,這樣的返回結果咱們稱之爲瞬時向量。而相應的這樣的表達式稱之爲瞬時向量表達式。
而若是咱們想過去一段時間範圍內的樣本數據時,咱們則須要使用區間向量表達式。區間向量表達式和瞬時向量表達式之間的差別在於在區間向量表達式中咱們須要定義時間選擇的範圍,時間範圍經過時間範圍選擇器[]進行定義。經過區間向量表達式查詢到的結果咱們稱爲區間向量。
例如,經過如下表達式能夠選擇最近5分鐘內的全部樣本數據:
http_requests_total{}[5m]
該表達式將會返回查詢到的時間序列中最近5分鐘的全部樣本數據。
除了使用m表示分鐘之外,PromQL的時間範圍選擇器支持其它時間單位:
s - 秒 m - 分鐘 h - 小時 d - 天 w - 周 y - 年
在瞬時向量表達式或者區間向量表達式中,都是以當前時間爲基準:
http_request_total{} # 瞬時向量表達式,選擇當前最新的數據 http_request_total{}[5m] # 區間向量表達式,選擇以當前時間爲基準,5分鐘內的數據
而若是咱們想查詢,5分鐘前的瞬時樣本數據,或昨天一天的區間內的樣本數據呢? 這個時候咱們就可使用位移操做,位移操做的關鍵字爲offset。
可使用offset時間位移操做:
http_request_total{} offset 5m http_request_total{}[1d] offset 1d
通常來講,若是描述樣本特徵的標籤(label)在並不是惟一的狀況下,經過PromQL查詢數據,會返回多條知足這些特徵維度的時間序列。而PromQL提供的聚合操做能夠用來對這些時間序列進行處理,造成一條新的時間序列。
支持的聚合函數有:
sum (求和) min (最小值) max (最大值) avg (平均值) stddev (標準差) stdvar (標準方差) count (計數) count_values (對value進行計數) bottomk (後n條時序) topk (前n條時序) quantile (分位數)
使用聚合操做的語法以下:
<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]
根據上面的函數,咱們就能夠經過聚合函數進行以下查詢:
# 查詢系統全部http請求的總量 sum(http_request_total) # 按照label:mode計算主機CPU的平均使用時間 avg(node_cpu) by (mode) # count_values用於時間序列中每個樣本值出現的次數。count_values # 會爲每個惟一的樣本值輸出一個時間序列,而且每個時間序列包含一個額外的標籤。 count_values("count", http_requests_total)
注意:注意:搭建方式依託於騰訊雲TSF服務(騰訊微服務平臺),即監控的內容是咱們在騰訊雲上搭建的集羣的各項指標,接下來的例子咱們以golang代碼裏接入普羅米修斯,代碼層面實現指標上報這種模式爲例。若是不借助騰訊雲,部份內容可能會有出入。如只是簡單使用,監控一些服務器資源等信息,可自行安裝Prometheus、Grafana和Node-exporter等,具體方法參照:配置 Prometheus 服務器監控和 Grafana 看板
登錄騰訊雲,在「雲產品」處搜索「普羅米修斯」,進入Prometheus服務頁面購買服務。特別注意單個普羅米修斯服務只能在單個vpc(私有網絡)下使用的,因此購買時必定要確認清楚本身須要監控的服務所在的vpc,即對應下圖框內「網絡」的第一個下拉框。而第二個「子網」下拉框,則描述了新購買的普羅米修斯服務所安裝的子網。
Grafana密碼按照平臺要求設置並牢記,這個密碼在後面登錄Grafana用戶界面用得上。
在部署咱們的TSF服務時,須要注意將普羅米修斯上報端口(即容器端口)映射到主機端口上,這樣普羅米修斯才能獲取到對應的上報數據。
接下來就須要到容器中安裝監控組件啦。
第一步,進入騰訊雲」控制檯「,在「雲產品」處搜索tke(容器服務),進入容器服務集羣列表。這時候找到在TSF(騰訊微服務平臺)上建立的集羣對應的同名容器集羣,點擊集羣名稱,再點擊「基本信息」,往下找到「內網訪問」,開啓它,並按照描述在訪問機上配置域名。
第二步,回到普羅米修斯控制檯,點擊新購買的Prometheus服務的名稱,進入到服務詳情。點擊「集成容器服務「,找到和以前在TSF服務中建立的「集羣」同名的「容器集羣」,點擊任務欄右側的「安裝」按鈕,安裝監控服務。
ps:這一步就至關於在安裝數據源,也就至關於前文提到的Node Exporter這個角色。不過在騰訊雲上,安裝的東西會更多,讓咱們能監控更多內容~
在上面的步驟執行完後,咱們的集羣」監控狀態「變成了「已安裝」,繼續點擊集羣名稱,在「服務發現」Tab頁點擊「新建」按鈕。接下來按下圖提示來新建服務發現吧。服務發現的上報端口,也就是咱們在「TSF服務部署」那一步中開放的容器端口。
至此,只要對應部署組的服務中上報了metrics(基於golang代碼裏接入普羅米修斯,代碼層面實現指標上報),且容器建立時,開放了上報端口,則數據就會被採集到Prometheus。後續咱們在Grafana上選擇Prometheus做爲數據源,便能獲取到服務的監控信息。
在Prometheus服務頁面點擊下圖紅框內按鈕,進入Grafana。帳號爲admin,密碼爲以前購買普羅米修斯時設置的Grafana密碼。
進入Grafana後,按照如下步驟創建數據源:
http://<Prometheus服務的ip>:9090/
)。
首先明確咱們接下來是在建立golang的web服務的儀表盤,若是讀者只是想監控服務器狀態等,徹底能夠從官方的](https://grafana.com/dashboards?dataSource=prometheus)導入一些現成的看板。
首先明確一下Grafana中的幾個組件:
它們之間的關係以下圖所示:
在理解了這幾個基本概念後,加上咱們以前學習到的PromQL,咱們就能夠開始建立儀表盤啦~
在Dashboards上點擊「add new pannel」進入儀表盤編輯模式,在這裏咱們找到本身服務,並找到下掛的Metrics(指標),選擇後便可在pannel上展現出對應的數據,若是還須要展現別的指標,能夠點擊下方的「+ Query」按鈕,便可繼續添加指標。若是須要對指標進行操做,好比聚合計算,那麼咱們只須要在Metrics後的文本欄中對內容進行修改。編輯完成後,點擊保存,即獲得了一個儀表盤~
本文章採用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可。
原做者: yuann,歡迎轉載,但請註明出處。
原文連接:《一文搞懂Prometheus、Grafana(含騰訊雲上實戰)》
發佈日期:2021-01-06