[英]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_last或topk_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.