Prometheus 普羅米修斯

Prometheus 簡(jiǎn)介

Prometheus 適用于記錄文本格式的時(shí)間序列,它既適用于以機(jī)器為中心的監(jiān)控,也適用于高度動(dòng)態(tài)的面向服務(wù)架構(gòu)的監(jiān)控。在微服務(wù)的世界中,它對(duì)多維數(shù)據(jù)收集和查詢的支持有特殊優(yōu)勢(shì)。Prometheus 是專為提高系統(tǒng)可靠性而設(shè)計(jì)的,它可以在斷電期間快速診斷問(wèn)題,每個(gè) Prometheus Server 都是相互獨(dú)立的,不依賴于網(wǎng)絡(luò)存儲(chǔ)或其他遠(yuǎn)程服務(wù)。當(dāng)基礎(chǔ)架構(gòu)出現(xiàn)故障時(shí),你可以通過(guò) Prometheus 快速定位故障點(diǎn),而且不會(huì)消耗大量的基礎(chǔ)架構(gòu)資源。

數(shù)據(jù)模型

每一條時(shí)間序列由指標(biāo)名稱(Metrics Name)以及一組標(biāo)簽(鍵值對(duì))唯一標(biāo)識(shí)。在時(shí)間序列中的每一個(gè)點(diǎn)稱為一個(gè)樣本(sample),樣本由以下三部分組成:

指標(biāo)(metric):指標(biāo)名稱和描述當(dāng)前樣本特征的 labelsets;
時(shí)間戳(timestamp):一個(gè)精確到毫秒的時(shí)間戳;
樣本值(value): 一個(gè) folat64 的浮點(diǎn)型數(shù)據(jù)表示當(dāng)前樣本的值。

通過(guò)如下表達(dá)方式表示指定指標(biāo)名稱和指定標(biāo)簽集合的時(shí)間序列:
<metric name>{<label name>=<label value>, ...}
例如,指標(biāo)名稱為 api_http_requests_total,標(biāo)簽為 method="POST"handler="/messages" 的時(shí)間序列可以表示為:
api_http_requests_total{method="POST", handler="/messages"}

指標(biāo)類型

Counter(計(jì)數(shù)器)

Counter 類型代表一種樣本數(shù)據(jù)單調(diào)遞增的指標(biāo),即只增不減,除非監(jiān)控系統(tǒng)發(fā)生了重置。例如,你可以使用 counter 類型的指標(biāo)來(lái)表示服務(wù)的請(qǐng)求數(shù)、已完成的任務(wù)數(shù)、錯(cuò)誤發(fā)生的次數(shù)等。counter 主要有兩個(gè)方法:

//將counter值加1.
Inc()
// 將指定值加到counter值上,如果指定值<0 會(huì)panic.
Add(float64)

Counter 類型數(shù)據(jù)可以讓用戶方便的了解事件產(chǎn)生的速率的變化,在 PromQL 內(nèi)置的相關(guān)操作函數(shù)可以提供相應(yīng)的分析,比如以 HTTP 應(yīng)用請(qǐng)求量來(lái)進(jìn)行說(shuō)明:

//通過(guò)rate()函數(shù)獲取HTTP請(qǐng)求量的增長(zhǎng)率
rate(http_requests_total[5m])
//查詢當(dāng)前系統(tǒng)中,訪問(wèn)量前10的HTTP地址
topk(10, http_requests_total)

不要將 counter 類型應(yīng)用于樣本數(shù)據(jù)非單調(diào)遞增的指標(biāo),例如:當(dāng)前運(yùn)行的進(jìn)程數(shù)量(應(yīng)該用 Guage 類型)。
調(diào)用示例
Go

Guage(儀表盤(pán))

Guage 類型代表一種樣本數(shù)據(jù)可以任意變化的指標(biāo),即可增可減。guage 通常用于像溫度或者內(nèi)存使用率這種指標(biāo)數(shù)據(jù),也可以表示能隨時(shí)增加或減少的“總數(shù)”,例如,計(jì)算 CPU 溫度在兩小時(shí)內(nèi)的差異:

dalta(cpu_temp_celsius{host="zeus"}[2h])

你還可以通過(guò)PromQL 內(nèi)置函數(shù) predict_linear() 基于簡(jiǎn)單線性回歸的方式,對(duì)樣本數(shù)據(jù)的變化趨勢(shì)做出預(yù)測(cè)。例如,基于 2 小時(shí)的樣本數(shù)據(jù),來(lái)預(yù)測(cè)主機(jī)可用磁盤(pán)空間在 4 個(gè)小時(shí)之后的剩余情況:

predict_linear(node_filesystem_free{job="node"}[2h], 4 * 3600) < 0

Histogram(直方圖)

在大多數(shù)情況下人們都傾向于使用某些量化指標(biāo)的平均值,例如 CPU 的平均使用率、頁(yè)面的平均響應(yīng)時(shí)間。長(zhǎng)尾問(wèn)題例如:按照請(qǐng)求延遲的范圍進(jìn)行分組,統(tǒng)計(jì)延遲在 0~10ms 之間的請(qǐng)求數(shù)有多少而 10~20ms 之間的請(qǐng)求數(shù)又有多少。通過(guò)這種方式可以快速分析系統(tǒng)慢的原因。
Histogram 類型的樣本會(huì)提供三種指標(biāo)(假設(shè)指標(biāo)名稱為 <basename>):

  • 樣本的值分布在 bucket 中的數(shù)量,命名為 <basename>_bucket{le="<上邊界>"}。解釋的更通俗易懂一點(diǎn),這個(gè)值表示指標(biāo)值小于等于上邊界的所有樣本數(shù)量。

      // 在總共2次請(qǐng)求當(dāng)中。http 請(qǐng)求響應(yīng)時(shí)間 <=0.005 秒 的請(qǐng)求次數(shù)為0
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.005",} 0.0
      // 在總共2次請(qǐng)求當(dāng)中。http 請(qǐng)求響應(yīng)時(shí)間 <=0.01 秒 的請(qǐng)求次數(shù)為0
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.01",} 0.0
      // 在總共2次請(qǐng)求當(dāng)中。http 請(qǐng)求響應(yīng)時(shí)間 <=0.025 秒 的請(qǐng)求次數(shù)為0
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.025",} 0.0
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.05",} 0.0
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.075",} 0.0
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.1",} 0.0
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.25",} 0.0
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.5",} 0.0
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.75",} 0.0
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="1.0",} 0.0
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="2.5",} 0.0
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="5.0",} 0.0
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="7.5",} 2.0
      // 在總共2次請(qǐng)求當(dāng)中。http 請(qǐng)求響應(yīng)時(shí)間 <=10 秒 的請(qǐng)求次數(shù)為 2
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="10.0",} 2.0
      io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="+Inf",} 2.0
    
  • 所有樣本值的大小總和,命名為 <basename>_sum。

      // 實(shí)際含義: 發(fā)生的2次 http 請(qǐng)求總的響應(yīng)時(shí)間為 13.107670803000001 秒
      io_namespace_http_requests_latency_seconds_histogram_sum{path="/",method="GET",code="200",} 13.107670803000001
    
  • 樣本總數(shù),命名為 <basename>_count。值和 <basename>_bucket{le="+Inf"} 相同。

      // 實(shí)際含義: 當(dāng)前一共發(fā)生了 2 次 http 請(qǐng)求
      io_namespace_http_requests_latency_seconds_histogram_count{path="/",method="GET",code="200",} 2.0
    

** 注意**

bucket 可以理解為是對(duì)數(shù)據(jù)指標(biāo)值域的一個(gè)劃分,劃分的依據(jù)應(yīng)該基于數(shù)據(jù)值的分布。注意后面的采樣點(diǎn)是包含前面的采樣點(diǎn)的,假設(shè) xxx_bucket{...,le="0.01"} 的值為 10,而 xxx_bucket{...,le="0.05"} 的值為 30,那么意味著這 30 個(gè)采樣點(diǎn)中,有 10 個(gè)是小于 10 ms 的,其余 20 個(gè)采樣點(diǎn)的響應(yīng)時(shí)間是介于 10 ms 和 50 ms 之間的。

可以通過(guò) histogram_quantile() 函數(shù)來(lái)計(jì)算 Histogram 類型樣本的分位數(shù)。分位數(shù)可能不太好理解,你可以理解為分割數(shù)據(jù)的點(diǎn)。我舉個(gè)例子,假設(shè)樣本的 9 分位數(shù)(quantile=0.9)的值為 x,即表示小于 x 的采樣值的數(shù)量占總體采樣值的 90%。Histogram 還可以用來(lái)計(jì)算應(yīng)用性能指標(biāo)值(Apdex score)。

不同語(yǔ)言關(guān)于 Histogram 的客戶端庫(kù)使用文檔:

Summary(摘要)

與 Histogram 類型類似,用于表示一段時(shí)間內(nèi)的數(shù)據(jù)采樣結(jié)果(通常是請(qǐng)求持續(xù)時(shí)間或響應(yīng)大小等),但它直接存儲(chǔ)了分位數(shù)(通過(guò)客戶端計(jì)算,然后展示出來(lái)),而不是通過(guò)區(qū)間來(lái)計(jì)算。

Summary 類型的樣本也會(huì)提供三種指標(biāo)(假設(shè)指標(biāo)名稱為

  • 樣本值的分位數(shù)分布情況,命名為 <basename>{quantile="<φ>"}

      // 含義:這 12 次 http 請(qǐng)求中有 50% 的請(qǐng)求響應(yīng)時(shí)間是 3.052404983s
      io_namespace_http_requests_latency_seconds_summary{path="/",method="GET",code="200",quantile="0.5",} 3.052404983
      // 含義:這 12 次 http 請(qǐng)求中有 90% 的請(qǐng)求響應(yīng)時(shí)間是 8.003261666s
      io_namespace_http_requests_latency_seconds_summary{path="/",method="GET",code="200",quantile="0.9",} 8.003261666
    
  • 所有樣本值的大小總和,命名為 <basename>_sum。

      // 含義:這12次 http 請(qǐng)求的總響應(yīng)時(shí)間為 51.029495508s
      io_namespace_http_requests_latency_seconds_summary_sum{path="/",method="GET",code="200",} 51.029495508
    
  • 樣本總數(shù),命名為 <basename>_count

      // 含義:當(dāng)前一共發(fā)生了 12 次 http 請(qǐng)求
      io_namespace_http_requests_latency_seconds_summary_count{path="/",method="GET",code="200",} 12.0
    

現(xiàn)在可以總結(jié)一下 Histogram 與 Summary 的異同:

  • 它們都包含了 <basename>_sum<basename>_count 指標(biāo)
  • Histogram 需要通過(guò) <basename>_bucket 來(lái)計(jì)算分位數(shù),而 Summary 則直接存儲(chǔ)了分位數(shù)的值。

關(guān)于 Summary 與 Histogram 的詳細(xì)用法,請(qǐng)參考 histograms and summaries

不同語(yǔ)言關(guān)于 Summary 的客戶端庫(kù)使用文檔:

PromQL表達(dá)式語(yǔ)言數(shù)據(jù)類型

  • 瞬時(shí)向量(Instant vector) - 一組時(shí)間序列,每個(gè)時(shí)間序列包含單個(gè)樣本,它們共享相同的時(shí)間戳。也就是說(shuō),表達(dá)式的返回值中只會(huì)包含該時(shí)間序列中的最新的一個(gè)樣本值。而相應(yīng)的這樣的表達(dá)式稱之為瞬時(shí)向量表達(dá)式。例如<metric name>{label=value}的形式,以下表達(dá)式選擇指標(biāo)名稱以 job: 開(kāi)頭的所有指標(biāo)::
    {__name__=~"job:.*"} 等價(jià)于{http_requests_total =~"job:.*"}

  • 區(qū)間向量(Range vector) - 一組時(shí)間序列,每個(gè)時(shí)間序列包含一段時(shí)間范圍內(nèi)的樣本數(shù)據(jù)。需要定義時(shí)間選擇的范圍,時(shí)間范圍通過(guò)時(shí)間范圍選擇器 [] 進(jìn)行定義,以指定應(yīng)為每個(gè)返回的區(qū)間向量樣本值中提取多長(zhǎng)的時(shí)間范圍。例如:選擇在過(guò)去 5 分鐘內(nèi)指標(biāo)名稱為 http_requests_total,job 標(biāo)簽值為 prometheus 的所有時(shí)間序列:

s - 秒
m - 分鐘
h - 小時(shí)
d - 天
w - 周
y - 年

http_request_total{} # 瞬時(shí)向量表達(dá)式,選擇當(dāng)前最新的數(shù)據(jù) http_requests_total{job="prometheus"}[5m] # 區(qū)間向量表達(dá)式,選擇以當(dāng)前時(shí)間為基準(zhǔn),5分鐘內(nèi)的數(shù)據(jù)指標(biāo)名稱為 http_requests_total,job 標(biāo)簽值為 prometheus 的所有時(shí)間序列

  • 標(biāo)量(Scalar) - 一個(gè)浮點(diǎn)型的數(shù)據(jù)值。
  • 字符串(String) - 一個(gè)簡(jiǎn)單的字符串值。
    根用戶輸入的表達(dá)式返回的數(shù)據(jù)類型是否合法取決于用例的不同,例如:瞬時(shí)向量表達(dá)式返回的數(shù)據(jù)類型是唯一可以直接繪制成圖表的數(shù)據(jù)類型。

時(shí)間位移操作

在瞬時(shí)向量表達(dá)式或者區(qū)間向量表達(dá)式中,都是以當(dāng)前時(shí)間為基準(zhǔn)。位移操作的關(guān)鍵字為 offset
offset 關(guān)鍵字需要緊跟在選擇器{}后面。以下表達(dá)式是正確的:

sum(http_requests_total{method="GET"} offset 5m) // GOOD.
該操作同樣適用于區(qū)間向量。以下表達(dá)式返回指標(biāo) http_requests_total 一周前的 5 分鐘之內(nèi)的 HTTP 請(qǐng)求量的增長(zhǎng)率:

rate(http_requests_total[5m] offset 1w)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容