簡介
隨著業(yè)務(wù)的擴(kuò)大蒜田,prometheus中監(jiān)控的指標(biāo)會越來越多赦政,查詢的頻率也在不停的增加官疲,尤其是出現(xiàn)長時間匯總大量的計(jì)算指標(biāo)數(shù)據(jù)的時候搂漠,會出現(xiàn)promql超時的情況迂卢。
針對這種情況,prometheus官網(wǎng)提供了簡化這些復(fù)雜計(jì)算的方法:recording rule
recording rule允許預(yù)先計(jì)算經(jīng)常需要或計(jì)算上昂貴的表達(dá)式,并將其結(jié)果保存為一組新的時間序列而克。 因此靶壮,查詢預(yù)先計(jì)算的結(jié)果通常比每次需要時執(zhí)行原始表達(dá)式快得多。 這對于儀表板尤其有用员萍,儀表板需要在每次刷新時重復(fù)查詢相同的表達(dá)式腾降。記錄和警報(bào)規(guī)則存在于規(guī)則組中,組內(nèi)的規(guī)則以固定間隔順序運(yùn)行碎绎。
測試
1螃壤、先在Prometheus上面查詢一個請求延時p50的promql,由圖片的右上角的load time可以看出筋帖,執(zhí)行這個promql奸晴,花費(fèi)時間為1721ms
2、這里寫一個測試用的yml文件
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: test
namespace: monitoring
labels:
prometheus: k8s
role: alert-rules
spec:
groups:
- name: test
rules:
- record: nginx_test
expr: histogram_quantile(0.5, sum(rate(nginx_ingress_controller_request_duration_seconds_bucket{ingress="xxxxxxxxxxx"}[30s])) by (le))
3日麸、部署這個yml文件到prometheus中
kubectl apply -f nginx-test.yml
4寄啼、查看優(yōu)化后的監(jiān)控指標(biāo)
在prometheus上執(zhí)行優(yōu)化明細(xì)指標(biāo)匯總后的rule值,由右上角的load time可以看出代箭,執(zhí)行這個rule墩划,花費(fèi)時間為159ms,查詢效率提升了10倍左右
結(jié)論
使用recording rule梢卸,將監(jiān)控指標(biāo)簡化成對應(yīng)規(guī)則走诞,prometheus會在采集數(shù)據(jù)的過程中,在后臺計(jì)算出對應(yīng)規(guī)則的值并且打上時間標(biāo)簽蛤高。這樣當(dāng)儀表盤和告警規(guī)則要使用某個監(jiān)控指標(biāo)時,可以直接取出來使用碑幅,從而達(dá)到降低計(jì)算時間戴陡,減少性能壓力的效果。但不要什么指標(biāo)都加 record沟涨,很多的 metric 其實(shí)不太會查詢到恤批。同時 label 中的值不要加到 record rule 的 name 中
所以將現(xiàn)有的查詢指標(biāo)進(jìn)行規(guī)則化,然后把grafana和alertmanger中使用的promql替換成簡化的rule值裹赴,將大大降低性能壓力喜庞,提高監(jiān)控效率。同時組內(nèi)規(guī)則按照固定時間間隔運(yùn)行棋返,間隔時間最好也錯開延都,這樣避免查詢峰值的出現(xiàn)。