軟件測試 | 普羅米修斯-HTTP API 調(diào)用PromQL
簡介
Prometheus API 使用了 JSON 格式的響應(yīng)內(nèi)容。 當(dāng) API 調(diào)用成功后將會(huì)返回查詢結(jié)果。所有的 API 請(qǐng)求均使用以下的 JSON 格式:
我們可以通過如下的 get 請(qǐng)求向普羅米修斯發(fā)送查詢請(qǐng)求:
api 路徑都是
/api/v1/query
有兩種查詢類型, 這里面我們用的查詢類型就是 query 類型(還有另一個(gè)叫 query_range)
在路徑和查詢類型后跟著的就是 PromQL 語句了。
最后的 time 是時(shí)間戳, 代表著查詢的時(shí)間基線。 就是我們的 PromQL 是以哪個(gè)時(shí)間點(diǎn)為基準(zhǔn)查詢的。 我們說過普羅米修斯本身就是一個(gè)時(shí)序數(shù)據(jù)庫。它默認(rèn)保存 14 天的數(shù)據(jù), 超過 14 天就會(huì)自動(dòng)刪除。 所以這個(gè)時(shí)間戳可以讓我們以過去某個(gè)時(shí)間點(diǎn)為基礎(chǔ)進(jìn)行查詢。如果在 UI 上查詢的話,只能以當(dāng)前時(shí)間為基線進(jìn)行查詢。
下面貼一個(gè)例子看一下我們查詢的 json 結(jié)果是什么樣子的:
響應(yīng)數(shù)據(jù)類型
當(dāng) API 調(diào)用成功后,Prometheus 會(huì)返回 JSON 格式的響應(yīng)內(nèi)容,格式如上小節(jié)所示。并且在 data 節(jié)點(diǎn)中返回查詢結(jié)果。data 節(jié)點(diǎn)格式如下:
PromQL 表達(dá)式可能返回多種數(shù)據(jù)類型,在響應(yīng)內(nèi)容中使用 resultType 表示當(dāng)前返回的數(shù)據(jù)類型,包括:
瞬時(shí)向量:vector
當(dāng)返回?cái)?shù)據(jù)類型 resultType 為 vector 時(shí),result 響應(yīng)格式如下:
其中 metrics 表示當(dāng)前時(shí)間序列的特征維度,value 只包含一個(gè)唯一的樣本。
區(qū)間向量:matrix
當(dāng)返回?cái)?shù)據(jù)類型 resultType 為 matrix 時(shí),result 響應(yīng)格式如下:
其中 metrics 表示當(dāng)前時(shí)間序列的特征維度,values 包含當(dāng)前事件序列的一組樣本。
標(biāo)量:scalar
當(dāng)返回?cái)?shù)據(jù)類型 resultType 為 scalar 時(shí),result 響應(yīng)格式如下:
由于標(biāo)量不存在時(shí)間序列一說,因此 result 表示為當(dāng)前系統(tǒng)時(shí)間一個(gè)標(biāo)量的值。
字符串:string
當(dāng)返回?cái)?shù)據(jù)類型 resultType 為 string 時(shí),result 響應(yīng)格式如下:
字符串類型的響應(yīng)內(nèi)容格式和標(biāo)量相同。
區(qū)間數(shù)據(jù)查詢
使用 QUERY_RANGE API 我們則可以直接查詢 PromQL 表達(dá)式在一段時(shí)間返回內(nèi)的計(jì)算結(jié)果。
URL 請(qǐng)求參數(shù):
query=: PromQL 表達(dá)式。
start=: 起始時(shí)間。
end=: 結(jié)束時(shí)間。
step=: 查詢步長。
timeout=: 超時(shí)設(shè)置。可選參數(shù),默認(rèn)情況下使用-query,timeout 的全局設(shè)置。
當(dāng)使用 QUERY_RANGE API 查詢 PromQL 表達(dá)式時(shí),返回結(jié)果一定是一個(gè)區(qū)間向量
需要注意的是,在 QUERY_RANGE API 中 PromQL 只能使用瞬時(shí)向量選擇器類型的表達(dá)式。
例如使用以下表達(dá)式查詢表達(dá)式 up 在 30 秒范圍內(nèi)以 15 秒為間隔計(jì)算 PromQL 表達(dá)式的結(jié)果。
實(shí)戰(zhàn)演示
最近做了一個(gè)資源優(yōu)化專項(xiàng),目的是實(shí)際了解一下業(yè)務(wù)運(yùn)行時(shí)產(chǎn)品 160+ 的服務(wù)每個(gè)服務(wù)所使用的 cpu 和內(nèi)存情況。 并對(duì)比他們申請(qǐng)的 request 和 limit 的值,計(jì)算服務(wù)是否申請(qǐng)了過多的資源導(dǎo)致資源浪費(fèi)。 所以我們要通過 HTTP PromQL 把相關(guān)的數(shù)據(jù)查詢出來。
上面代碼中的 PromQL 是首先
node_namespace_pod_container:container_cpu_usage_seconds_total:sum_rate 是一個(gè)預(yù)定義的查詢別名。 有些查詢語句過于復(fù)雜,所以我們可以給復(fù)雜的語句一個(gè)別名, 這樣在使用 的時(shí)候就比較方便了。 而我們使用的這個(gè)別名就如同它的名字一樣, 是查詢每個(gè)容器的 cpu 使用率的。 因?yàn)橐粋€(gè) pod 里可能會(huì)有多個(gè)容器, 所以需要使用 sum by (pod) 的方式統(tǒng)計(jì)出每個(gè) pod 的 cpu 使用率總和。 這里我們使用的就是一個(gè) query_range 的查詢類型。 因?yàn)槲覀兿M樵冊跍y試期間的 2 個(gè)小時(shí)內(nèi) cpu 使用率的最大值和平均值。 所以我們在請(qǐng)求最后使用step=30
這個(gè)參數(shù)來指定每隔 30s 計(jì)算一次指標(biāo),然后我們在使用 start 和 end 參數(shù)指定了一個(gè)時(shí)間范圍。所以在指定的這 2 個(gè)小時(shí)內(nèi),每隔 30s 就會(huì)使用 PromQL 查詢一次,這樣返回結(jié)果里我們就有了很多個(gè)采樣數(shù)據(jù), 反應(yīng)了隨著時(shí)間變化 CPU 使用率的情況。 這時(shí)候我們再編寫 python 代碼把返回的 json 取出來計(jì)算最大值和平均值即可。