<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          徹底理解Prometheus查詢(xún)語(yǔ)法

          共 23273字,需瀏覽 47分鐘

           ·

          2021-07-17 17:00

          點(diǎn)擊“程序員面試吧”,選擇“星標(biāo)??”

          下拉至文末”查看更多



          本文檔主要分為兩部分,分別講解PromQL和Grafana的基礎(chǔ)使用,在閱讀PromQL部分時(shí),建議不要聯(lián)想Grafana中要怎么使用這些查詢(xún)表達(dá)式,又是怎么根據(jù)查詢(xún)結(jié)果繪圖的,因?yàn)镻romQL對(duì)于Grafana來(lái)說(shuō)和SQL并沒(méi)有區(qū)別,都是查詢(xún)出結(jié)果,然后根據(jù)各種指定配置進(jìn)行繪圖,所以閱讀和理解PromQL部分,應(yīng)關(guān)注查詢(xún)結(jié)果是什么樣的,不要關(guān)注這些結(jié)果在Grafana中是怎么繪圖的。


          理解時(shí)間序列


          指標(biāo)

          指標(biāo)就是要監(jiān)控的目標(biāo)。

          在形式上,所有的指標(biāo)(Metric)都通過(guò)如下格式標(biāo)示:

          <metric name>{<label name>=<label value>, ...} 

          指標(biāo)名稱(chēng)(metric name)一般反映被監(jiān)控樣本的含義(比如,http_request_total - 表示當(dāng)前系統(tǒng)接收到的HTTP請(qǐng)求總量)。

          標(biāo)簽(label)反映了當(dāng)前樣本的特征維度,通過(guò)這些維度可以對(duì)樣本數(shù)據(jù)進(jìn)行過(guò)濾,聚合等。

          樣本

          Prometheus會(huì)定時(shí)到指定的Exportor上pull當(dāng)前的樣本數(shù)據(jù),然后根據(jù)pull的時(shí)間以時(shí)間序列的方式保存在內(nèi)存數(shù)據(jù)庫(kù)中,并且定時(shí)持久化到硬盤(pán)上,Exportor只維護(hù)指標(biāo)的值。每條時(shí)間序列由指標(biāo)名稱(chēng)(metrics)和一組標(biāo)簽集(labelset)確定并命令,也就是說(shuō)一個(gè)指標(biāo)名稱(chēng)可能對(duì)應(yīng)很多條時(shí)間序列。

          可以將時(shí)間序列理解為一個(gè)以時(shí)間為軸的矩陣,如下所示,有三個(gè)時(shí)間序列在時(shí)間軸上分別對(duì)應(yīng)不同的值:
          ^
            │     . . . . . . . . . .   node_cpu{cpu="cpu0",mode="idle"}
            │     . . . . . . . . . .   node_cpu{cpu="cpu0",mode="system"}
            │     . . . . . . . . . .   node_load1{}
            v
              <------- 時(shí)間 ---------->
          每一個(gè)點(diǎn)稱(chēng)為一個(gè)樣本(sample),樣本由以下三部分組成:

          • 指標(biāo)(metric):metric name和描述當(dāng)前樣本特征的labelsets;

          • 時(shí)間戳(timestamp):一個(gè)精確到毫秒的時(shí)間戳;

          • 值(value):表示該時(shí)間的樣本的值。


          <--------------- metric ---------------------><-timestamp -><-value->
          http_request_total{status="200", method="GET"}@1434417560938 => 94355
          http_request_total{status="200", method="GET"}@1434417561287 => 94334
          http_request_total{status="404", method="GET"}@1434417560938 => 38473
          http_request_total{status="404", method="GET"}@1434417561287 => 38544
          http_request_total{status="200", method="POST"}@1434417560938 => 4748
          http_request_total{status="200", method="POST"}@1434417561287 => 4785

          所以查詢(xún)值的where條件就是指標(biāo)、標(biāo)簽和時(shí)間戳(區(qū)間)。


          查詢(xún)語(yǔ)法


          指標(biāo)查詢(xún)(瞬時(shí)向量查詢(xún))

          通過(guò)指標(biāo)名稱(chēng)和標(biāo)簽進(jìn)行查詢(xún),可以查詢(xún)?cè)撝笜?biāo)下的所有時(shí)間序列距離當(dāng)前系統(tǒng)時(shí)間最新的值,無(wú)時(shí)間概念,所以查詢(xún)的結(jié)果稱(chēng)為瞬時(shí)向量(instant vector),如下圖所示:


          而且可以看到查詢(xún)到的多條時(shí)間序列都包含指定的標(biāo)簽。單獨(dú)使用指標(biāo)名稱(chēng),相當(dāng)于不使用標(biāo)簽進(jìn)行過(guò)濾,同樣獨(dú)單使用標(biāo)簽查詢(xún)也可以。

          標(biāo)簽過(guò)濾支持使用=和!=兩種完全匹配模式:

          • 通過(guò)使用label=value可以選擇那些標(biāo)簽滿足表達(dá)式定義的時(shí)間序列;

          • 反之使用label!=value則可以根據(jù)標(biāo)簽匹配排除時(shí)間序列。


          除了使用完全匹配的方式對(duì)時(shí)間序列進(jìn)行過(guò)濾以外,還支持使用正則表達(dá)式作為匹配條件,多個(gè)正則表達(dá)式之間使用|進(jìn)行分離:

          • 使用label=~regx表示選擇符合正則表達(dá)式定義的時(shí)間序列;

          • 反之使用label=!~regx進(jìn)行反向選擇。


          例如,如果想查詢(xún)多個(gè)環(huán)境下的請(qǐng)求數(shù)統(tǒng)計(jì),可以使用如下表達(dá)式:
          http_requests_total{environment=~"prodect|test|development",method!="GET"}
          每個(gè)正則表達(dá)式就是簡(jiǎn)單的字符串。

          時(shí)間范圍查詢(xún)(區(qū)間向量查詢(xún))

          如果我們想過(guò)去一段時(shí)間范圍內(nèi)的樣本數(shù)據(jù)時(shí),我們則需要使用區(qū)間向量表達(dá)式。區(qū)間向量表達(dá)式和瞬時(shí)向量表達(dá)式之間的差異在于需要定義時(shí)間范圍,通過(guò)時(shí)間范圍選擇器[]進(jìn)行定義。例如查詢(xún)距離當(dāng)前系統(tǒng)時(shí)間最近5分鐘內(nèi)的所有樣本數(shù)據(jù):


          可以看到結(jié)果中每個(gè)時(shí)間序列都有5個(gè)值并且@了不同的時(shí)間戳(因?yàn)樵損rometheus每分鐘pull一次,所以5分鐘有5個(gè)結(jié)果)。

          除了使用m表示分鐘以外,PromQL的時(shí)間范圍選擇器支持其它時(shí)間單位:

          • s - 秒

          • m - 分鐘

          • h - 小時(shí)

          • d - 天

          • w - 周

          • y - 年


          時(shí)間位移

          在瞬時(shí)向量表達(dá)式或者區(qū)間向量表達(dá)式中,都是以Prometheus當(dāng)前系統(tǒng)時(shí)間為基準(zhǔn)進(jìn)行查詢(xún):

          http_request_total{} # 瞬時(shí)向量表達(dá)式,選擇當(dāng)前最新的數(shù)據(jù)
          http_request_total{}[5m] # 區(qū)間向量表達(dá)式,選擇以當(dāng)前時(shí)間為基準(zhǔn)過(guò)去5分鐘內(nèi)的所有數(shù)據(jù)

          而如果我們想查詢(xún)5分鐘之前的最新數(shù)據(jù),或者想查詢(xún)昨天的所有數(shù)據(jù)呢?

          這個(gè)時(shí)候我們就可以使用位移操作,位移操作的關(guān)鍵字為offset,例如:

          http_request_total{} offset 5m
          http_request_total{}[1d] offset 1d


          操作符

          除了能夠方便的查詢(xún)和過(guò)濾時(shí)間序列以外,還支持豐富的操作符,用戶(hù)可以使用這些操作符進(jìn)一步的對(duì)事件序列進(jìn)行二次加工。這些操作符包括:數(shù)學(xué)運(yùn)算符,邏輯運(yùn)算符,布爾運(yùn)算符等等。

          數(shù)學(xué)運(yùn)算符

          操作數(shù)可以是一個(gè)常數(shù),也可以是一個(gè)查詢(xún)表達(dá)式,比如:
          bet_amount_total / 100 : bet_amount是投注金額的總計(jì),經(jīng)常單位是分,為了轉(zhuǎn)成元,可以除以100

          http_requests_total{api="/bet“} + http_requests_total{api="/login“} 計(jì)算投注和登錄請(qǐng)求的和

          支持的所有數(shù)學(xué)運(yùn)算符如下所示:

          • +(加法)

          • -(減法)

          • *(乘法)

          • /(除法)

          • %(求余)

          • ^(冪運(yùn)算)


          布爾運(yùn)算符

          通過(guò)布爾運(yùn)算對(duì)時(shí)間序列進(jìn)行過(guò)濾,例如如下想查詢(xún)node_cpu_seconds_total{mode=“idle”} > 22000的時(shí)間序列,不大于的時(shí)間序列會(huì)被過(guò)濾掉。

          過(guò)濾前:


          過(guò)濾后:


          目前,Prometheus支持以下布爾運(yùn)算符如下:

          • == (相等)

          • != (不相等)

          • > (大于)

          • < (小于)

          • >= (大于等于)

          • <= (小于)


          獲取布爾運(yùn)算結(jié)果

          布爾運(yùn)算的默認(rèn)行為是對(duì)時(shí)間序列進(jìn)行過(guò)濾。而有時(shí)候我們需要的是的運(yùn)算結(jié)果。例如,只需要知道當(dāng)前HTTP請(qǐng)求量是否>=1000,如果大于等于1000則返回1否則返回0。這時(shí)可以使用bool修飾符改變布爾運(yùn)算的默認(rèn)行為。例如:

          http_requests_total > bool 1000

          使用bool修飾符后,布爾運(yùn)算不會(huì)對(duì)時(shí)間序列進(jìn)行過(guò)濾,而是直接依次對(duì)各個(gè)樣本數(shù)據(jù)進(jìn)行比較,結(jié)果是0或者1。從而形成一條新的時(shí)間序列,如下圖value等于0或者1:


          聚合函數(shù)

          查詢(xún)可能會(huì)返回多條滿足指定標(biāo)簽的時(shí)間序列,可是有時(shí)候我們并不希望分開(kāi)查看,恰恰大多數(shù)情況其實(shí)是想查詢(xún)一條時(shí)間序列的結(jié)果,例如查詢(xún)請(qǐng)求總數(shù)時(shí)想要的結(jié)果是:

          http_requests_total{} 170

          而并不是想要:

          http_requests_total{environment="product“} 30
          http_requests_total{environment="
          test“} 60
          http_requests_total{environment="developement“} 80

          為了實(shí)現(xiàn)這個(gè)需求,PromQL提供的聚合操作可以用來(lái)對(duì)這些時(shí)間序列進(jìn)行處理,通過(guò)處理形成一條新的時(shí)間序列,上述需求的表達(dá)式應(yīng)該是:sum(http_requests_total),例如下圖會(huì)自動(dòng)將所有時(shí)間序列的值相加后形成一條新的時(shí)間序列作為結(jié)果。


          sum函數(shù)非常常用,因?yàn)槌32恢啦樵?xún)到時(shí)間序列究竟又多少條,注意不要再誤認(rèn)為sum是求指標(biāo)在某個(gè)時(shí)間段的和。

          有下面這些聚合操作符:

          • sum:求和

          • min:最小值

          • max:最大值

          • avg:平均值

          • stddev:標(biāo)準(zhǔn)差

          • stdvar:方差

          • count:元素個(gè)數(shù)

          • count_values:等于某值的元素個(gè)數(shù)

          • bottomk:最小的k個(gè)元素

          • topk:最大的k個(gè)元素

          • quantile:分位數(shù)


          部分聚合

          有時(shí)候,聚合并不想完全聚合,想根據(jù)某個(gè)標(biāo)簽進(jìn)行區(qū)分時(shí)候,可以使用by進(jìn)行拆分,比如監(jiān)控每個(gè)CPU累計(jì)的空閑時(shí)間:sum(node_cpu_seconds_total{mode=“idle”} )by (cpu),并設(shè)置了時(shí)間序列的名稱(chēng)模式為:cpu-{{cpu}}。

          圖示:


          內(nèi)置函數(shù)

          為了方便查詢(xún),Prometheus 內(nèi)置了一些函數(shù)來(lái)輔助計(jì)算,下面介紹一些典型的。

          • instant-vector abs(instant-vector):絕對(duì)值

          • instant-vector sqrt(instant-vector):平方根

          • instant-vector exp(instant-vector):指數(shù)計(jì)算

          • instant-vector ln(instant-vector ):自然對(duì)數(shù)

          • instant-vector ceil(instant-vector):向上取整

          • instant-vector floor(instant-vector):向下取整

          • instant-vector round(instant-vector):四舍五入取整

          • instant-vector delta(range-vector):計(jì)算區(qū)間向量里最大最小的差值

          • instant-vector increase(range-vector):計(jì)算區(qū)間向量里最后一個(gè)值和第一個(gè)值的差值

          • instant-vector rate(range-vector):計(jì)算區(qū)間向量里的平均增長(zhǎng)率


          然而在實(shí)際使用中,發(fā)現(xiàn)increase函數(shù)計(jì)算有誤差,比如一分鐘的前值和后值分別是1和183,差值應(yīng)該是182,但是increase(m e t r i c [ 1 m ] )的結(jié)果是185,使用{metric}[1m])的結(jié)果是185,使用metric[1m])的結(jié)果是185,使用{metric} - ${metric} offset 1的結(jié)果卻是正確的182。誤差原因目前還沒(méi)有確定。

          以下函數(shù)允許隨著時(shí)間的推移聚合給定范圍向量的每個(gè)序列,并返回具有每個(gè)序列聚合結(jié)果的即時(shí)向量:

          • avg_over_time(range-vector):指定間隔內(nèi)所有點(diǎn)的平均值。

          • min_over_time(range-vector):指定間隔中所有點(diǎn)的最小值。

          • max_over_time(range-vector):指定間隔內(nèi)所有點(diǎn)的最大值。

          • sum_over_time(range-vector):指定時(shí)間間隔內(nèi)所有值的總和。


          指標(biāo)分類(lèi)(了解)


          Prometheus根據(jù)目標(biāo)功能和內(nèi)容的不同,把指標(biāo)分了4種類(lèi)型(metric type):Counter(計(jì)數(shù)器)、Gauge(儀表盤(pán))、Histogram(直方圖)、Summary(摘要);但是本質(zhì)上都是指標(biāo),都是時(shí)間序列,只是進(jìn)行了簡(jiǎn)單的分類(lèi),更方便理解和溝通。

          Counter:只增不減的計(jì)數(shù)器

          Counter類(lèi)型的指標(biāo)其工作方式和計(jì)數(shù)器一樣,只增不減(除非系統(tǒng)發(fā)生重置)。常見(jiàn)的監(jiān)控指標(biāo),如http_requests_total,node_cpu都是Counter類(lèi)型的監(jiān)控指標(biāo)。

          Counter是一個(gè)簡(jiǎn)單但有強(qiáng)大的工具,例如我們可以在應(yīng)用程序中記錄某些事件發(fā)生的次數(shù),通過(guò)以時(shí)序的形式存儲(chǔ)這些數(shù)據(jù),我們可以輕松的了解該事件產(chǎn)生速率的變化。PromQL內(nèi)置的聚合函數(shù)可以用戶(hù)對(duì)這些數(shù)據(jù)進(jìn)行進(jìn)一步的分析:

          例如,通過(guò)rate()函數(shù)獲取HTTP請(qǐng)求量的增長(zhǎng)率:

          rate(http_requests_total[5m])

          查詢(xún)當(dāng)前系統(tǒng)中,訪問(wèn)量前10的HTTP地址:

          topk(10, http_requests_total)


          Gauge:可增可減的儀表盤(pán)

          與Counter不同,Gauge類(lèi)型的指標(biāo)側(cè)重于反應(yīng)系統(tǒng)的當(dāng)前狀態(tài)。因此這類(lèi)指標(biāo)的樣本數(shù)據(jù)可增可減。常見(jiàn)指標(biāo)如:node_memory_MemFree(主機(jī)當(dāng)前空閑的內(nèi)容大?。?、node_memory_MemAvailable(可用內(nèi)存大小)都是Gauge類(lèi)型的監(jiān)控指標(biāo)。

          通過(guò)Gauge指標(biāo),用戶(hù)可以直接查看系統(tǒng)的當(dāng)前狀態(tài):

          node_memory_MemFree

          對(duì)于Gauge類(lèi)型的監(jiān)控指標(biāo),通過(guò)PromQL內(nèi)置函數(shù)delta()可以獲取樣本在一段時(shí)間返回內(nèi)的變化情況。例如,計(jì)算CPU溫度在兩個(gè)小時(shí)內(nèi)的差異:

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


          Histogram和Summary:數(shù)據(jù)分布

          除了Counter和Gauge類(lèi)型的監(jiān)控指標(biāo)以外,Prometheus還定義分別定義Histogram和Summary的指標(biāo)類(lèi)型,主用用于統(tǒng)計(jì)和分析樣本的分布情況。

          在大多數(shù)情況下,我們都傾向于使用某些量化指標(biāo)的平均值,例如CPU的平均使用率、頁(yè)面的平均響應(yīng)時(shí)間。這種方式的問(wèn)題很明顯,以系統(tǒng)API調(diào)用的平均響應(yīng)時(shí)間為例:如果大多數(shù)API請(qǐng)求都維持在100ms的響應(yīng)時(shí)間范圍內(nèi),而個(gè)別請(qǐng)求的響應(yīng)時(shí)間需要5s,那么就會(huì)導(dǎo)致某些Web頁(yè)面的響應(yīng)時(shí)間落到中位數(shù)的情況,而這種現(xiàn)象被稱(chēng)為長(zhǎng)尾問(wèn)題。

          為了區(qū)分是平均的慢還是長(zhǎng)尾的慢,最簡(jiǎn)單的方式就是按照請(qǐng)求延遲的范圍進(jìn)行分組。例如,統(tǒng)計(jì)延遲在010ms之間的請(qǐng)求數(shù)有多少而1020ms之間的請(qǐng)求數(shù)又有多少。通過(guò)這種方式可以快速分析系統(tǒng)慢的原因。Histogram和Summary都是為了能夠解決這樣問(wèn)題的存在,通過(guò)Histogram和Summary類(lèi)型的監(jiān)控指標(biāo),我們可以快速了解監(jiān)控樣本的分布情況。

          例如,Prometheus自身監(jiān)控的指標(biāo)【prometheus_tsdb_wal_fsync_duration_seconds】的指標(biāo)類(lèi)型為Summary。它記錄了Prometheus Server中wal_fsync操作的耗時(shí),通過(guò)訪問(wèn)Prometheus Server的/metrics地址,可以獲取到以下監(jiān)控樣本數(shù)據(jù)(當(dāng)前時(shí)間的樣本):

          # HELP prometheus_tsdb_wal_fsync_duration_seconds Duration of WAL fsync.
          # TYPE prometheus_tsdb_wal_fsync_duration_seconds summary
          prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.5"} 0.012352463
          prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.9"} 0.014458005
          prometheus_tsdb_wal_fsync_duration_seconds{quantile="0.99"} 0.017316173
          prometheus_tsdb_wal_fsync_duration_seconds_sum 2.888716127000002
          prometheus_tsdb_wal_fsync_duration_seconds_count 216

          從上面的樣本中可以得知當(dāng)前Prometheus Server進(jìn)行wal_fsync操作的總次數(shù)為216次,總耗時(shí)為2.888716127000002s,并且50%操作耗時(shí)不超過(guò)0.012352463秒,90%的操作耗時(shí)不超過(guò)0.014458005s,99%的操作耗時(shí)不超過(guò)0.017316173s。

          在Prometheus自身監(jiān)控中,我們還能找到類(lèi)型為Histogram的監(jiān)控指標(biāo):prometheus_tsdb_compaction_chunk_range_bucket。

          # HELP prometheus_tsdb_compaction_chunk_range Final time range of chunks on their first compaction
          # TYPE prometheus_tsdb_compaction_chunk_range histogram
          prometheus_tsdb_compaction_chunk_range_bucket{le="100"} 0
          prometheus_tsdb_compaction_chunk_range_bucket{le="400"} 0
          prometheus_tsdb_compaction_chunk_range_bucket{le="1600"} 0
          prometheus_tsdb_compaction_chunk_range_bucket{le="6400"} 0
          prometheus_tsdb_compaction_chunk_range_bucket{le="25600"} 0
          prometheus_tsdb_compaction_chunk_range_bucket{le="102400"} 0
          prometheus_tsdb_compaction_chunk_range_bucket{le="409600"} 0
          prometheus_tsdb_compaction_chunk_range_bucket{le="1.6384e+06"} 260
          prometheus_tsdb_compaction_chunk_range_bucket{le="6.5536e+06"} 780
          prometheus_tsdb_compaction_chunk_range_bucket{le="2.62144e+07"} 780
          prometheus_tsdb_compaction_chunk_range_bucket{le="+Inf"} 780
          prometheus_tsdb_compaction_chunk_range_sum 1.1540798e+09
          prometheus_tsdb_compaction_chunk_range_count 780

          從上面的樣本中可以得知當(dāng)前Prometheus Server tsdb數(shù)據(jù)庫(kù)的壓縮后數(shù)據(jù)庫(kù)共有780個(gè),總大小是1.1540798e+09,小于等于100/400/1600/…/409600的有0。

          與Summary類(lèi)型的指標(biāo)相似之處在于Histogram類(lèi)型的樣本同樣會(huì)反應(yīng)當(dāng)前指標(biāo)的記錄的總數(shù)(以_count作為后綴)以及其值的總量(以_sum作為后綴)。不同在于Histogram指標(biāo)直接反應(yīng)了在不同區(qū)間內(nèi)樣本的個(gè)數(shù),區(qū)間通過(guò)標(biāo)簽len進(jìn)行定義。

          同時(shí)對(duì)于Histogram的指標(biāo),我們還可以通過(guò)histogram_quantile()函數(shù)計(jì)算出其值的分位數(shù)。和Summary不同在于Histogram通過(guò)histogram_quantile函數(shù)在服務(wù)器端計(jì)算的分位數(shù),即Prometheus計(jì)算;而Sumamry的分位數(shù)則是由客戶(hù)端計(jì)算,Prometheus直接pull即可。因此對(duì)于分位數(shù)的計(jì)算而言,Summary在通過(guò)PromQL進(jìn)行查詢(xún)時(shí)有更好的性能表現(xiàn),而Histogram則會(huì)消耗更多的資源;反之對(duì)于客戶(hù)端而言Histogram消耗的資源更少。

          # 查詢(xún) prometheus_tsdb_compaction_chunk_range 95 百分位

          histogram_quantile(0.95, prometheus_tsdb_compaction_chunk_range_bucket)


          HTTP API


          Grafana查詢(xún)報(bào)錯(cuò)

          比如想在Grafana繪制折線圖(Graph),因?yàn)樾枰芏鄷r(shí)間點(diǎn)的值,似乎應(yīng)該使用時(shí)間范圍查詢(xún)或者說(shuō)是區(qū)間查詢(xún),因?yàn)橹笜?biāo)查詢(xún)(瞬時(shí)查詢(xún))只能查詢(xún)的當(dāng)前的最新值,讓我們?cè)囈辉嚕?/section>


          紅色嘆號(hào)錯(cuò)誤提示:
          “invalid expression type “range vector” for range query, must be Scalar or instant Vector”
          非法的表達(dá)式類(lèi)型:區(qū)間向量用于區(qū)間查詢(xún),必須是標(biāo)量(常數(shù))或者瞬時(shí)向量。

          這是因?yàn)樵贕rafana查詢(xún)需要調(diào)用prometheus的http api,所以首先了解Prometheus的http api是什么?

          Query

          通過(guò)使用如下API我們可以查詢(xún)PromQL表達(dá)式在指定時(shí)間點(diǎn)下的計(jì)算結(jié)果。

          GET /api/v1/query

          URL請(qǐng)求參數(shù):

          • query=:PromQL表達(dá)式。

          • time=:指定時(shí)間戳。可選參數(shù),默認(rèn)情況下使用Prometheus當(dāng)前系統(tǒng)時(shí)間。


          例如:

          $ curl 'http://192.168.40.161:9090/api/v1/query?query=node_cpu_seconds_total{mode="idle"}&time=1587690566.034'
          {
            "status""success",
            "data": {
              "resultType""vector",
              "result": [
                {
                  "metric": {
                    "__name__""node_cpu_seconds_total",
                    "cpu""0",
                    "instance""192.168.40.161:9100",
                    "job""linux",
                    "mode""idle"
                  },
                  "value": [
                    1587690566.034,
                    "24745.92"
                  ]
                },
                {
                  "metric": {
                    "__name__""node_cpu_seconds_total",
                    "cpu""1",
                    "instance""192.168.40.161:9100",
                    "job""linux",
                    "mode""idle"
                  },
                  "value": [
                    1587690566.034,
                    "24846.7"
                  ]
                }
              ]
            }
          }


          響應(yīng)數(shù)據(jù)類(lèi)型

          當(dāng)API調(diào)用成功后,Prometheus會(huì)返回JSON格式的響應(yīng)內(nèi)容,格式如上小節(jié)所示。并且在data節(jié)點(diǎn)中返回查詢(xún)結(jié)果。data節(jié)點(diǎn)格式如下:

          {
            "resultType""matrix" | "vector",
            "result": <value>
          }

          PromQL表達(dá)式可能返回多種數(shù)據(jù)類(lèi)型,在響應(yīng)內(nèi)容中使用resultType表示當(dāng)前返回的數(shù)據(jù)類(lèi)型,包括:

          1、瞬時(shí)向量:vector

          當(dāng)返回?cái)?shù)據(jù)類(lèi)型resultType為vector時(shí),result響應(yīng)格式如下:

          [
            {
              "metric": { "<label_name>""<label_value>", ... },
              "value": [ <unix_time>, "<sample_value>" ]
            },
            ...
          ]

          其中Metrics表示當(dāng)前時(shí)間序列的特征維度,value只包含一個(gè)唯一的樣本。

          2、區(qū)間向量:matrix

          當(dāng)返回?cái)?shù)據(jù)類(lèi)型resultType為matrix時(shí),result響應(yīng)格式如下:
          [
            {
              "metric": { "<label_name>""<label_value>", ... },
              "values": [ [ <unix_time>, "<sample_value>" ], ... ]
            },
            ...
          ]
          其中Metrics表示當(dāng)前時(shí)間序列的特征維度,values包含當(dāng)前事件序列的一組樣本,例如:

          $ curl 'http://192.168.40.161:9090/api/v1/query?query=node_cpu_seconds_total{mode="idle"}[5m]&time=1587690566.034'

          {
            "status""success",
            "data": {
              "resultType""matrix",
              "result": [
                {
                  "metric": {
                    "__name__""node_cpu_seconds_total",
                    "cpu""0",
                    "instance""192.168.40.161:9100",
                    "job""linux",
                    "mode""idle"
                  },
                  "values": [
                    [
                      1587690266.034,
                      "24499.47"
                    ],
                    [
                      1587690326.034,
                      "24548.82"
                    ],
                    [
                      1587690386.034,
                      "24598.17"
                    ],
                    [
                      1587690446.034,
                      "24648.21"
                    ],
                    [
                      1587690506.034,
                      "24697.37"
                    ],
                    [
                      1587690566.034,
                      "24745.92"
                    ]
                  ]
                },
                {
                  "metric": {
                    "__name__""node_cpu_seconds_total",
                    "cpu""1",
                    "instance""192.168.40.161:9100",
                    "job""linux",
                    "mode""idle"
                  },
                  "values": [
                    [
                      1587690266.034,
                      "24600.32"
                    ],
                    [
                      1587690326.034,
                      "24649.97"
                    ],
                    [
                      1587690386.034,
                      "24698.96"
                    ],
                    [
                      1587690446.034,
                      "24747.99"
                    ],
                    [
                      1587690506.034,
                      "24797.52"
                    ],
                    [
                      1587690566.034,
                      "24846.7"
                    ]
                  ]
                }
              ]
            }
          }


          query_range

          使用如下API,我們可以查詢(xún)PromQL表達(dá)式在一段時(shí)間內(nèi)的數(shù)據(jù)。

          GET /api/v1/query_range

          URL請(qǐng)求參數(shù):

          • query=:PromQL表達(dá)式。

          • start=:起始時(shí)間。

          • end=:結(jié)束時(shí)間。

          • step=:查詢(xún)步長(zhǎng)。


          返回結(jié)果一定是一個(gè)區(qū)間向量:
          {
            "resultType""matrix",
            "result": <value>
          }
          比如:

          $ curl 'http://192.168.40.161:9090/api/v1/query_range?query=node_cpu_seconds_total{mode="idle"}&start=1587693926.035&end=1587694166.034&step=2m'

          {
            "status""success",
            "data": {
              "resultType""matrix",
              "result": [
                {
                  "metric": {
                    "__name__""node_cpu_seconds_total",
                    "cpu""0",
                    "instance""192.168.40.161:9100",
                    "job""linux",
                    "mode""idle"
                  },
                  "values": [
                    [
                      1587693926.035,
                      "27510.45"
                    ],
                    [
                      1587694046.035,
                      "27607.39"
                    ]
                  ]
                },
                {
                  "metric": {
                    "__name__""node_cpu_seconds_total",
                    "cpu""1",
                    "instance""192.168.40.161:9100",
                    "job""linux",
                    "mode""idle"
                  },
                  "values": [
                    [
                      1587693926.035,
                      "27645.27"
                    ],
                    [
                      1587694046.035,
                      "27743.97"
                    ]
                  ]
                }
              ]
            }
          }

          需要注意的是,只能使用瞬時(shí)向量類(lèi)型的表達(dá)式。

          這是因?yàn)閰^(qū)間數(shù)據(jù)查詢(xún)實(shí)現(xiàn),首先根據(jù)時(shí)間范圍和步長(zhǎng)計(jì)算時(shí)間點(diǎn)集合,比如:

          start=1s & end=60s & setp=10s,

          那么時(shí)間點(diǎn)集合是:1s 、11s、21s、31s、41s、51s

          因?yàn)橄乱粋€(gè)時(shí)間點(diǎn)應(yīng)該是61s,不在時(shí)間范圍內(nèi)。

          然后查詢(xún)距離每個(gè)時(shí)間點(diǎn)最近的值作為該時(shí)間點(diǎn)的值。

          而如果使用區(qū)間向量表達(dá)式,那么每個(gè)時(shí)間點(diǎn)計(jì)算結(jié)果將是一個(gè)區(qū)間,而目標(biāo)查詢(xún)結(jié)果也是區(qū)間,并且兩個(gè)區(qū)間的含義不相同,所以無(wú)法融合在一塊。

          Grafana報(bào)錯(cuò)原因

          Grafana默認(rèn)調(diào)用的api是query_range api,可通過(guò)【Query Inspector】按鈕展開(kāi)查詢(xún)請(qǐng)求和結(jié)果,如下圖:


          所以Graph中不能直接使用區(qū)間向量查詢(xún),而應(yīng)該使用瞬時(shí)向量,然后調(diào)用區(qū)間數(shù)據(jù)查詢(xún)API來(lái)查詢(xún)指定時(shí)間范圍的值(時(shí)間范圍是Grafana面板右上角選擇的時(shí)間范圍,步長(zhǎng)默認(rèn)15秒,可通過(guò)Min step設(shè)置)。


          Graph通過(guò)查詢(xún)結(jié)果中的各個(gè)時(shí)間點(diǎn)的值繪制成線。

          可以通過(guò)開(kāi)啟Instant開(kāi)關(guān),使Grafana調(diào)用瞬時(shí)數(shù)據(jù)查詢(xún)API,例如:


          可以看到API改成了Query,并且Prometheus返回了5個(gè)時(shí)間點(diǎn)的值,此時(shí)Graph不會(huì)連接成線。

          區(qū)間向量的應(yīng)用

          前面說(shuō)到通過(guò)瞬時(shí)向量查詢(xún)+query_rangw API可以查詢(xún)到指定時(shí)間范圍的值,那么區(qū)間向量查詢(xún)似乎沒(méi)啥用了?

          區(qū)間向量可用于計(jì)算某個(gè)時(shí)間點(diǎn)的附近的狀態(tài),通過(guò)內(nèi)置函數(shù)可以將區(qū)間向量轉(zhuǎn)成瞬時(shí)向量,就能用在Graph圖中了;比如返回時(shí)間范圍內(nèi)中每個(gè)時(shí)間點(diǎn)的過(guò)去1分鐘內(nèi) HTTP 請(qǐng)求數(shù):increase(http_requests_total[1m])


          Grafana配置方法


          通過(guò)前面的學(xué)習(xí),我們知道如何編寫(xiě)Prometheus查詢(xún)表達(dá)式,也知道Grafana通過(guò)調(diào)用HTTP API接口來(lái)查詢(xún)時(shí)間序列的,可能查到很多條時(shí)間序列,查詢(xún)結(jié)果中每個(gè)時(shí)間序列可能只有最新的值,也可能包含一個(gè)時(shí)間范圍內(nèi)很多個(gè)值。接下來(lái),講解Grafana提供了那些數(shù)據(jù)展示方法,以及如何使用查詢(xún)結(jié)構(gòu)。

          Graph

          Graph默認(rèn)以時(shí)間為X軸展示所有查詢(xún)到的時(shí)間序列,如下圖所示,查詢(xún)到兩條時(shí)間序列:


          右上角按鈕【Last 5 minutes】指定時(shí)間范圍,可以改為其他的時(shí)間范圍。注意這里的Last 5 Time的時(shí)間基準(zhǔn)是Grafana頁(yè)面所在PC機(jī)的當(dāng)前時(shí)間,如果PC機(jī)的時(shí)間異常,可能查詢(xún)到的并不是目標(biāo)時(shí)間范圍的數(shù)據(jù),比如系統(tǒng)當(dāng)前時(shí)間是12:05:00,那么Last 5 minutes的時(shí)間范圍會(huì)轉(zhuǎn)換成:start=12:00:00&end=12:05:00。具體的請(qǐng)求和響應(yīng)信息,可以通過(guò)按鈕【Query Inspector】展示。

          通過(guò)按鈕【Add Query】可以添加查詢(xún)表達(dá)式,需要注意的是一條查詢(xún)語(yǔ)句可以展示多條線,這取決于查詢(xún)結(jié)果中有多少條時(shí)間序列。

          通過(guò)指定【Min step】可以修改步長(zhǎng),可以改變查詢(xún)結(jié)果中時(shí)間點(diǎn)的密度,即步長(zhǎng)越大,則相同時(shí)間范圍的時(shí)間點(diǎn)就越少,密度就越小,那么折線可能更陡峭。

          SingleStat

          顯示查詢(xún)結(jié)果中最新的一個(gè)值,查詢(xún)結(jié)果不能包含多條時(shí)間序列,否者提示錯(cuò)誤。如果未開(kāi)啟Instant,則可顯示指定時(shí)間范圍內(nèi)的變化曲線,如果開(kāi)啟Instant則僅顯示一個(gè)數(shù)值;


          支持設(shè)置閾值來(lái)顯示不同的顏色,例如大于0.5顯示紅色:


          Stat和SingStat基本一樣,不同的是Stat支持查詢(xún)并顯示多條時(shí)間序列的變化曲線和值。

          Gauge

          和SingleStat一樣,也是顯示查詢(xún)結(jié)果中最新的一個(gè)值,支持一次查詢(xún)多條時(shí)間序列,例如下圖一個(gè)表達(dá)式返回兩條時(shí)間序列:


          也可以設(shè)置閾值來(lái)顯示不同的顏色,例如上圖小于0.5時(shí)顯示綠色,大于0.5時(shí)內(nèi)邊填充黃色,更加醒目,并且在儀表盤(pán)的邊上根據(jù)值的分布動(dòng)態(tài)顯示綠色和黃色的比例。

          Table

          默認(rèn)情況下,表格顯示所有時(shí)間序列在不同時(shí)間點(diǎn)上的值,最左列是時(shí)間戳對(duì)應(yīng)的時(shí)間,后邊就是所有指標(biāo)對(duì)用的值:


          如果開(kāi)啟Instant,則只顯示最新的時(shí)間戳和最新的值:


          可通過(guò)【Column Styles】對(duì)列進(jìn)行設(shè)置:

          隱藏列:設(shè)置列的Type是Hidden


          設(shè)置列的值:比如設(shè)置某列為查詢(xún)表達(dá)式B的值,設(shè)置名稱(chēng)正則【Apply to columns named】為 Value #B


          如果想顯示某個(gè)標(biāo)簽的值,那么【Apply to columns named】就是標(biāo)簽的名字。

          原文鏈接:https://blog.csdn.net/zhouwenjun0820/article/details/105823389
          轉(zhuǎn)自:分布式實(shí)驗(yàn)室




          瀏覽 44
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  男女中文字幕 | 大鸡巴AV在线 | 操你啦在线| 天天干人人摸 | 国产精品熟女久久久久久 |