从 CPU 使用率中位数的子查询中选择前 10 名,并使用 Influx 显示时间序列数据

Posted

技术标签:

【中文标题】从 CPU 使用率中位数的子查询中选择前 10 名,并使用 Influx 显示时间序列数据【英文标题】:Select top 10 from subquery of median CPU usage and display time series data with Influx 【发布时间】:2019-05-18 06:21:34 【问题描述】:

我想在 Grafana 中创建一个图形面板,它显示 CPU 的前 10 名最高消费者,并显示它们在所选时间间隔内的各自历史记录。我认为最后一部分是棘手的部分。

到目前为止我有这个:

SELECT TOP("median_Percent_Processor_Time", 10) as "usage", host FROM (
    SELECT median("Percent_Processor_Time") AS "median_Percent_Processor_Time" FROM "telegraf_monitoring"."autogen"."win_cpu" WHERE time > now() - 5s GROUP BY time(:interval:), "host" FILL(none)
)

这会产生下表:

time                | usage              | host
12/17/18 02:38:36PM | 88.4503173828125   | CNVDWSO202
12/17/18 02:38:36PM | 60.55384826660156  | CNVDSerr01
12/17/18 02:38:36PM | 46.807456970214844 | NVsABAr01
12/17/18 02:38:36PM | 27.402353286743164 | NVDARCH02
12/17/18 02:38:36PM | 21.320478439331055 | NVDABAr05
12/17/18 02:38:36PM | 5.546620845794678  | NVDALMBOE
12/17/18 02:38:36PM | 3.654918909072876  | NVDLeNCXE01
12/17/18 02:38:36PM | 47.08285903930664  | NVDOKTARAD01

该表很有用,但这只是一个时间点。我需要随后从那 10 台主机的 win_cpu 测量中查询和提取时间序列数据。主机值是动态的,我无法预测会出现什么,因此我无法将OR 语句串在一起,据我所知,Influx 不支持IN

【问题讨论】:

【参考方案1】:

您可以使用 OR 正则表达式代替 IN=~ /HOST1|HOST2|HOST3/ + GROUP BY host 和一个 InfluxDB 查询将返回所有数据。棘手的部分是 Grafana 变量,它将包含前 10 个主机。当你拥有它时,只需在正则表达式查询中使用高级变量格式 - 例如=~ /$tophosts:pipe/

【讨论】:

以上是关于从 CPU 使用率中位数的子查询中选择前 10 名,并使用 Influx 显示时间序列数据的主要内容,如果未能解决你的问题,请参考以下文章

为每个行号选择前 10 个

从列表中的每个值中选择前 10 个元素

在查询 SQL 中查询

在主查询的“IN”子句中使用逗号分隔列表的子查询结果

从 Codeigniter Active Record 中的子查询中选择

如何从 PostgreSQL 的子查询中选择包含值数组的列?