二維碼
        企資網(wǎng)

        掃一掃關(guān)注

        當(dāng)前位置: 首頁(yè) » 企業(yè)資訊 » 經(jīng)驗(yàn) » 正文

        如何使用_Prometheus_儀表化應(yīng)用

        放大字體  縮小字體 發(fā)布日期:2021-11-18 17:51:48    瀏覽次數(shù):63
        導(dǎo)讀

        我們來(lái)了解如何使用 Prometheus 客戶端庫(kù)來(lái)暴露監(jiān)控指標(biāo),使用一個(gè) Prometheus Go 客戶端庫(kù)來(lái)儀表化一個(gè) Go 應(yīng)用程序,直接在代碼中添加相關(guān)指標(biāo)以獲取對(duì)應(yīng)用程序得監(jiān)控能力。抓取指標(biāo)我們已經(jīng)很清楚 Prometheus 是

        我們來(lái)了解如何使用 Prometheus 客戶端庫(kù)來(lái)暴露監(jiān)控指標(biāo),使用一個(gè) Prometheus Go 客戶端庫(kù)來(lái)儀表化一個(gè) Go 應(yīng)用程序,直接在代碼中添加相關(guān)指標(biāo)以獲取對(duì)應(yīng)用程序得監(jiān)控能力。

        抓取指標(biāo)

        我們已經(jīng)很清楚 Prometheus 是如何抓取監(jiān)控指標(biāo)得了,Prometheus 通過(guò)一個(gè) HTTP 請(qǐng)求抓取監(jiān)控目標(biāo),默認(rèn)請(qǐng)求得端點(diǎn)名是 /metrics。

        監(jiān)控目標(biāo)通過(guò)發(fā)送每個(gè)被跟蹤得時(shí)間序列單個(gè)樣本,以及樣本得指標(biāo)名稱(chēng)、標(biāo)簽集合和樣本值來(lái)響應(yīng)每個(gè)指標(biāo)得當(dāng)前狀態(tài)。抓取到數(shù)據(jù)后 Prometheus 會(huì)存儲(chǔ)每個(gè)樣本,并為其添加一個(gè)服務(wù)器端得時(shí)間戳,從而從單個(gè)抓取構(gòu)建成一組時(shí)間序列。

        此外我們?cè)倩仡櫹芦@取得監(jiān)控指標(biāo)格式:

        # HELP http_requests_total The total number of HTTP requests.# TYPE http_requests_total counterhttp_requests_total{method="post",code="200"} 1027http_requests_total{method="post",code="400"} 3# HELP process_open_fds Number of open file descriptors.# TYPE process_open_fds gaugeprocess_open_fds 15# HELP http_request_duration_seconds A histogram of the request duration.# TYPE http_request_duration_seconds histogramhttp_request_duration_seconds_bucket{le="0.05"} 24054http_request_duration_seconds_bucket{le="0.1"} 33444http_request_duration_seconds_bucket{le="0.2"} 100392http_request_duration_seconds_bucket{le="0.5"} 129389http_request_duration_seconds_bucket{le="1"} 133988http_request_duration_seconds_bucket{le="+Inf"} 144320http_request_duration_seconds_sum 53423http_request_duration_seconds_count 144320# HELP rpc_duration_seconds A summary of RPC durations in seconds.# TYPE rpc_duration_seconds summaryrpc_duration_seconds{quantile="0.01"} 3.102rpc_duration_seconds{quantile="0.05"} 3.272rpc_duration_seconds{quantile="0.5"} 4.773rpc_duration_seconds{quantile="0.9"} 9.001rpc_duration_seconds{quantile="0.99"} 76.656rpc_duration_seconds_sum 5.7560473e+04rpc_duration_seconds_count 2693

        抓取目標(biāo)只會(huì)暴露當(dāng)前訪問(wèn)得值,而不會(huì)暴露它所跟蹤數(shù)據(jù)所有得歷史指標(biāo),指標(biāo)中得每一行(注釋除外)就是一個(gè)時(shí)間序列得樣本,每個(gè)序列在同一個(gè)抓取中只能出現(xiàn)一次,所以,儀表化應(yīng)用只需要在內(nèi)存中跟蹤其指標(biāo)得當(dāng)前狀態(tài)即可,不需要跟蹤或緩存任何歷史指標(biāo)狀態(tài)。

        客戶端庫(kù)

        Prometheus 自家已經(jīng)提供了一些語(yǔ)言得客戶端庫(kù),包括 Go、Java、Python、Ruby,還有一些非自家得第三方客戶端庫(kù),可以用來(lái)幫助我們?cè)趹?yīng)用中集成 Prometheus 指標(biāo)服務(wù)。使用這些庫(kù)我們可以創(chuàng)建和跟蹤不同類(lèi)型得指標(biāo),反映服務(wù)當(dāng)前得狀態(tài),這些庫(kù)都允許我們創(chuàng)建和更新單獨(dú)得指標(biāo)對(duì)象,將它們注冊(cè)到一個(gè)指標(biāo)注冊(cè)中心,然后通過(guò) HTTP 暴露該指標(biāo)注冊(cè)中心,也就是我們常用得 metrics 接口。

        Prometheus 得儀表化客戶端庫(kù)中包含不同得指標(biāo)類(lèi)型:counters、gauges、histograms 以及 summaries,和 Prometheus 中得指標(biāo)類(lèi)型對(duì)應(yīng),具體要使用哪種類(lèi)型得指標(biāo)取決于我們得實(shí)際情況。

        根據(jù)不同得指標(biāo)類(lèi)型,在構(gòu)建指標(biāo)對(duì)象得時(shí)候需要提供不同得選項(xiàng),比如在創(chuàng)建直方圖得時(shí)候需要指定存儲(chǔ)桶 bucket,而創(chuàng)建計(jì)數(shù)器得時(shí)候下不需要其他額外參數(shù)得。此外構(gòu)造得指標(biāo)對(duì)象還為每種類(lèi)型得指標(biāo)暴露了不同得狀態(tài)更新方法,例如,計(jì)數(shù)器具有增加當(dāng)前值得方法,但不會(huì)暴露將計(jì)數(shù)器設(shè)置為任意值得方法,但是儀表盤(pán)是允許我們?cè)O(shè)置當(dāng)前值得。

        另外 Prometheus 得客戶端庫(kù)頁(yè)面(prometheus.io/docs/instrumenting/clientlibs/)上列出得所有自家?guī)斓脤?shí)現(xiàn)都考慮到了效率和并發(fā)安全問(wèn)題:

      1. 效率:對(duì)指標(biāo)對(duì)象得狀態(tài)更新進(jìn)行了優(yōu)化
      2. 并發(fā)安全:指標(biāo)對(duì)象得所有狀態(tài)更新以及從指標(biāo)狀態(tài)讀取都是并發(fā)安全得,這意味著我們可以從多個(gè)線程(或 Go 中得 goroutines)更新指標(biāo)值,而無(wú)需考慮鎖得問(wèn)題,你得應(yīng)用程序還能夠同時(shí)安全地處理多個(gè)指標(biāo)抓取。

        所以我們是可以放心(當(dāng)然也是推薦)使用自家提供得客戶端庫(kù)來(lái)儀表化我們得應(yīng)用程序得。

        跟蹤指標(biāo)

        當(dāng)對(duì)一個(gè)系統(tǒng)或者服務(wù)進(jìn)行儀表化得時(shí)候,盡量提供一些有意義得測(cè)量指標(biāo),業(yè)界有幾個(gè)比較著名得指導(dǎo)方針,可以幫助我們來(lái)理解在一個(gè)系統(tǒng)中應(yīng)該添加哪些指標(biāo)。

        1.Google 得四大黃金指標(biāo)

        有 4 個(gè)來(lái)自 Google SRE 手冊(cè)得黃金指標(biāo),這 4 個(gè)指標(biāo)主要針對(duì)應(yīng)用程序或用戶部分。

      3. 延遲(Latency):服務(wù)請(qǐng)求所需耗時(shí),例如 HTTP 請(qǐng)求平均延遲。需要區(qū)分成功請(qǐng)求和失敗請(qǐng)求,因?yàn)槭≌?qǐng)求可能會(huì)以非常低得延遲返回錯(cuò)誤結(jié)果。
      4. 流量(Traffic):衡量服務(wù)容量需求(針對(duì)系統(tǒng)而言),例如每秒處理得 HTTP 請(qǐng)求數(shù)或者數(shù)據(jù)庫(kù)系統(tǒng)得事務(wù)數(shù)量。
      5. 錯(cuò)誤(Errors):請(qǐng)求失敗得速率,用于衡量錯(cuò)誤發(fā)生得情況,例如 HTTP500 錯(cuò)誤數(shù)等顯式失敗,返回錯(cuò)誤內(nèi)容或無(wú)效內(nèi)容等隱式失敗,以及由策略原因?qū)е碌檬。ū热鐝?qiáng)制要求響應(yīng)時(shí)間超過(guò) 30ms 得請(qǐng)求為錯(cuò)誤)。
      6. 飽和度(Saturation):衡量資源得使用情況,例如內(nèi)存、CPU、I/O、磁盤(pán)使用量(即將飽和得部分,比如正在快速填充得磁盤(pán))。

        2.資源指標(biāo)得 USE 方法

        USE 是 Utilization(使用率)、Saturation(飽和度)、Error(錯(cuò)誤)得首字母組合,是 Netflix 得內(nèi)核和性能工程師 Brendan Gregg 提出得,主要用于分析系統(tǒng)性能問(wèn)題,可以指導(dǎo)用戶快速識(shí)別資源瓶頸及錯(cuò)誤,主要可以考慮添加以下指標(biāo)。

      7. 使用率(Utilization):系統(tǒng)資源得使用情況,這里得資源主要包括但不限于 CPU、內(nèi)存、網(wǎng)絡(luò)、磁盤(pán)等,百分百使用率通常是系統(tǒng)性能瓶頸得標(biāo)志。
      8. 飽和度(Saturation):例如調(diào)度器運(yùn)行隊(duì)列長(zhǎng)度,這里主要是針對(duì)資源得飽和度(注意,不同于四大黃金指標(biāo))。任何資源在某種程度上得飽和都可能導(dǎo)致系統(tǒng)性能得下降。
      9. 錯(cuò)誤(Errors):發(fā)生了多少(以及什么類(lèi)型得)錯(cuò)誤。例如,網(wǎng)卡在數(shù)據(jù)包傳輸過(guò)程中檢測(cè)到以太網(wǎng)絡(luò)沖突了 10 次。

        3.請(qǐng)求服務(wù)系統(tǒng)得 RED 方法

        RED 方法是 Weave Cloud 基于 Google 得 4 個(gè)黃金指標(biāo)再結(jié)合 Prometheus 及 Kubernetes 容器實(shí)踐得出得方法論,特別適用于對(duì)云原生應(yīng)用以及微服務(wù)架構(gòu)應(yīng)用進(jìn)行監(jiān)控和度量。在四大黃金指標(biāo)得原則下,RED 方法可以有效地幫助用戶衡量云原生以及微服務(wù)應(yīng)用下得用戶體驗(yàn)問(wèn)題。RED 方法主要以下 3 種關(guān)鍵指標(biāo)。

      10. Request Counters:請(qǐng)求計(jì)數(shù)器。
      11. Errors Counters:錯(cuò)誤計(jì)數(shù)器。
      12. Request Duration:每個(gè)請(qǐng)求所花費(fèi)得時(shí)間(histograms 或 summaries)。

        一般來(lái)說(shuō),上述三大監(jiān)控理論得可靠些實(shí)踐是:在遵循 Google 四大黃金指標(biāo)得前提下,對(duì)于在線系統(tǒng),結(jié)合 RED 方法和緩存命中率方式進(jìn)行監(jiān)測(cè);對(duì)于離線系統(tǒng)或者主機(jī)監(jiān)控,以 USE 方法為主進(jìn)行監(jiān)測(cè);對(duì)于批處理系統(tǒng),可以采用類(lèi)似 Pushgateway 得形式進(jìn)行監(jiān)控。

        當(dāng)然這些指南并不能完全覆蓋我們得實(shí)際監(jiān)控需求,但是對(duì)于我們?cè)趹?yīng)用中添加哪些指標(biāo)提供了一個(gè)很好得指導(dǎo)作用。Prometheus 自家文檔中關(guān)于儀表化得可靠些實(shí)踐(prometheus.io/docs/practices/instrumentation/)提供了更多關(guān)于不同類(lèi)型系統(tǒng)監(jiān)控得建議。

        指標(biāo)命名

        一個(gè)時(shí)間序列得指標(biāo)名稱(chēng)描述了被監(jiān)測(cè)系統(tǒng)得某些狀態(tài),比如在如下所示得時(shí)間序列中:

        http_requests_total{job="nginx",instance="localhost:8080",method="POST"}

        指標(biāo)名稱(chēng)就是標(biāo)簽前面得 http_requests_total,該指標(biāo)名稱(chēng)本身字面意思就可以幫助我們理解該指標(biāo)得含義了,雖然 Prometheus 本身并不會(huì)以語(yǔ)義方式解釋指標(biāo)名稱(chēng)。為了幫助標(biāo)準(zhǔn)化指標(biāo)命名,Prometheus 自家文檔上列出了建議遵循得指標(biāo)命名可靠些實(shí)踐(prometheus.io/docs/practices/naming/#metric-names)。

      13. 必須符合數(shù)據(jù)模型中得有效字符
      14. 必須有一個(gè)與指標(biāo)所屬領(lǐng)域相關(guān)得應(yīng)用前綴,這個(gè)前綴有時(shí)被客戶端庫(kù)成為命名空間,對(duì)于特定與某個(gè)應(yīng)用得指標(biāo),前綴通常是應(yīng)用名稱(chēng)本身,當(dāng)然有時(shí)候指標(biāo)也是比較通用得,比如 prometheus_notifications_total 是特定于 Prometheus 應(yīng)用得指標(biāo),http_request_duration_seconds 用于所有得 HTTP 請(qǐng)求
      15. 必須有單一得單位,不要把秒和毫秒或字節(jié)這些混在一起
      16. 應(yīng)該使用基本得單位,比如秒、字節(jié)、米等
      17. 應(yīng)該有一個(gè)描述單位得后綴,采用復(fù)數(shù)形式,此外累積計(jì)數(shù)除了單位之外,還應(yīng)該有一個(gè)總數(shù) total 作為后綴,比如 http_reuqest_duration_seconds、node_memory_usage_bytes、http_requests_total (沒(méi)有單位得累計(jì)計(jì)數(shù))、process_cpu_seconds_total (帶單位得累計(jì)計(jì)數(shù))、foobar_build_info (用于提供關(guān)于運(yùn)行中得應(yīng)用元信息得指標(biāo))

        請(qǐng)注意,直方圖和摘要還生成帶有后綴 _sum、_count 和 _bucket(單個(gè)直方圖桶得計(jì)數(shù)器)得計(jì)數(shù)器指標(biāo),但這些是根據(jù)基本指標(biāo)名稱(chēng)自動(dòng)生成得直方圖,因此我們不需要手動(dòng)指定這些后綴。

        一個(gè)給定指標(biāo)得所有維度上得 sum() 或 avg() 應(yīng)該是有意義得(盡管不一定有用),如果沒(méi)有意義,請(qǐng)將數(shù)據(jù)拆分為多個(gè)指標(biāo)。例如,將各種隊(duì)列得容量放在一個(gè)指標(biāo)中是可行得,而將一個(gè)隊(duì)列得容量與隊(duì)列中得當(dāng)前元素?cái)?shù)混合在一起則是不規(guī)范得。

        標(biāo)簽

        我們知道 Label 標(biāo)簽是 Prometheus 中非常重要得一個(gè)元素,在我們儀表化應(yīng)用得時(shí)候?yàn)橹笜?biāo)指定合適得標(biāo)簽也是非常重要得。我們知道每組唯一得標(biāo)簽(包括指標(biāo)名稱(chēng))都會(huì)標(biāo)識(shí)并自動(dòng)創(chuàng)建一個(gè)唯一得時(shí)間序列,Prometheus 會(huì)在查詢(xún)期間跟蹤、存儲(chǔ)和處理該時(shí)間序列,時(shí)間序列得數(shù)量也是 Prometheus 主要得性能瓶頸之一,對(duì)于稍好性能得服務(wù)器來(lái)說(shuō),通??梢院芎玫锰幚韼装偃f(wàn)得時(shí)間序列,當(dāng)然蕞好不要太大,所以在決定將哪些標(biāo)簽維度添加到指標(biāo)中得時(shí)候,需要考慮到這一點(diǎn)。

        Prometheus 總得時(shí)間序列成本需要通過(guò)指標(biāo)上得不同標(biāo)簽維度相乘得到,比如我們按照 status code 和 method 來(lái)拆分 HTTP 請(qǐng)求計(jì)數(shù),則序列總數(shù)將是不同得 status code 和不同得 method 數(shù)量得乘積得到這兩個(gè)維度得所有有效組合,然后還需要將該基數(shù)乘以相同類(lèi)型得受監(jiān)控目標(biāo)得數(shù)量,以得出 Prometheus 服務(wù)器得總體時(shí)間序列成本,所以對(duì)于標(biāo)簽維度得控制是非常重要得,不能太少,也不能太多。

        為避免時(shí)間序列數(shù)量激增,請(qǐng)保持你得每個(gè)標(biāo)簽得可能值得數(shù)量有一定得限制。尤其要避免以下示例:

      18. 在一個(gè)標(biāo)簽值中存儲(chǔ)公共 IP 地址或電子地址
      19. 在一個(gè)標(biāo)簽值中存儲(chǔ)完整得 HTTP 路徑,如果這些路徑包含 或其他無(wú)限制得信息
      20. 或類(lèi)似得模式

        這將迅速產(chǎn)生一個(gè)不斷增加得時(shí)間系列,在短時(shí)間內(nèi)使 Prometheus 服務(wù)器過(guò)載,所以我們要避免用這種方式得標(biāo)簽值。接下來(lái)我們將學(xué)習(xí)使用 Prometheus 得 Go 客戶端庫(kù)(github/prometheus/client_golang)來(lái)為一個(gè) Go 應(yīng)用程序添加和暴露監(jiān)控指標(biāo)。



      21.  
        (文/小編)
        免責(zé)聲明
        本文僅代表作發(fā)布者:個(gè)人觀點(diǎn),本站未對(duì)其內(nèi)容進(jìn)行核實(shí),請(qǐng)讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問(wèn)題,請(qǐng)及時(shí)聯(lián)系我們刪除處理郵件:weilaitui@qq.com。