簡體   English   中英

Prometheus查詢相當於SQL DISTINCT

[英]Prometheus query equivalent to SQL DISTINCT

我有多個提供相同指標的 Prometheus 實例,例如:

my_metric{app="foo", state="active",   instance="server-1"}  20
my_metric{app="foo", state="inactive", instance="server-1"}  30
my_metric{app="foo", state="active",   instance="server-2"}  20
my_metric{app="foo", state="inactive", instance="server-2"}  30

現在我想在 Grafana singlestat 小部件中顯示此指標。 當我使用以下查詢時...

sum(my_metric{app="foo", state="active"})

...當然,它會將所有值相加並返回40 所以我告訴普羅米修斯按實例求和...

sum(my_metric{app="foo", state="active"}) by (instance)

...這會導致 Grafana 出現“多系列錯誤”。 有沒有辦法告訴 Prometheus/Grafana 只使用第一個結果?

我剛剛發現的一種方法是對所有值進行平均:

avg(sum(my_metric{app="foo", state="active"}) by(instance))

我不知道有什么不同,但是我認為這也可以:

topk(1, my_metric{app="foo", state="active"} by (instance))

在此處查看倒數第二個示例: https : //prometheus.io/docs/prometheus/latest/querying/examples/

如果您需要從多個匹配的時間序列中返回任意一個時間序列,則可以使用topk()bottomk()函數來完成。 例如,以下查詢返回一個時間序列,其具有匹配my_metric{app="foo", state="active"}的多個時間序列中的最大值:

topk(1, my_metric{app="foo", state="active"})

使用topk()時需要在 Grafana 中設置即時查詢選項。 否則topk(1, ...)用於構建具有范圍查詢的圖時可能會返回多個時間序列。 這是因為topk(1, ...)選擇單個時間序列,每個時間序列的每個點都具有最大值。 圖上的不同點可能具有不同的時間序列和最大值。 有一個變通方法,它允許在類似 Prometheus 的替代系統(例如VictoriaMetrics )中的圖表上返回多個系列中的一個系列。 為此,它提供了topk_*bottomk_*函數。 例如,參見topk_lasttopk_avg

請注意, topk()與來自 SQL 的DISTINCT沒有共同點。如果您需要 select 不同的 label 值與 PromQL,那么您需要使用count(...) by (label) 它將返回給定label的唯一 label 值以及每個 label 值的唯一時間序列數。 例如, count(my_metric) by (app)將為具有 my_metric 名稱的時間序列返回唯一的app my_metric名稱。 這大致相當於以下帶有DISTINCT子句的 SQL:

SELECT DISTINCT app FROM my_metric

有關詳細信息,請參閱count() 文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM