使用 Grafana 和 MySQL 在同一时间序列上绘制多个序列

Posted

技术标签:

【中文标题】使用 Grafana 和 MySQL 在同一时间序列上绘制多个序列【英文标题】:Plot more than one series on the same time series using Grafana and MySQL 【发布时间】:2022-01-13 03:54:09 【问题描述】:

我有多个服务器报告一个值(温度或可靠性分数)。我想将它们绘制在同一个时间序列上。每个指标随时间变化的价值。

表格是这样的

Total Reliability
Time                | value | metric
2021-12-07 08:24:20 | 0.994 | 2787
2021-12-07 08:25:18 | 0.996 | 3129
2021-12-07 08:25:34 | 0.994 | 2787
2021-12-07 08:26:31 | 0.996 | 3129
2021-12-07 08:26:48 | 0.994 | 2787
2021-12-07 08:27:44 | 0.996 | 3129

我阅读了一些类似的问题,但由于某种原因他们的解决方案不起作用

SELECT
time AS “time”,
reliability as value,
machine_id as metric
FROM machine
WHERE
$__unixEpochFilter(time)
GROUP BY machine_id,time
ORDER BY time asc

如果我删除分组以绘制两列

使用 Grafana v8.2.5 (b57a137acd) 和 mysql 服务器 8.0.27

【问题讨论】:

我可以通过查询每个系统来做到这一点,但由于我不知道会有多少台服务器或 machine_ID 是什么,我需要找到一种方法让 tot 对其进行分组跨度> 【参考方案1】:

指标应该是字符串。在你的情况下它看起来像一个整数,所以破解machine_id as metric

CONCAT(machine_id , '') AS metric

使用Grafana MySQL macros 进行时间聚合。那么最终具有 5m avg 聚合的 Grafana SQL 查询应该是:

SELECT
  $__timeGroup(time,'5m'),
  AVG(reliability) AS value,
  CONCAT(machine_id, '') AS metric
FROM machine
WHERE $__unixEpochFilter(time)
GROUP BY machine_id, time
ORDER BY time ASC

它仍然可能需要一些小的调整。

【讨论】:

【参考方案2】:

我用这个。

SELECT
  time AS "time",
  reliability AS value,
  CONCAT(machine_id, '') AS metric
FROM machine
WHERE
  $__unixEpochFilter(time)
ORDER BY time

【讨论】:

这会选择原始数据 - 当您选择较长的时间范围(例如 1 个月)时,它可能会返回大量数据,并且您的浏览器可能无法处理这些数据(高内存、cpu 利用率) .强烈建议使用时间聚合。

以上是关于使用 Grafana 和 MySQL 在同一时间序列上绘制多个序列的主要内容,如果未能解决你的问题,请参考以下文章

字符集,字符序的基本认识

Mysql/ Grafana 计算/显示最后一小时/天/周/月的重量增量/减量

如何在 Grafana 的 MySQL 查询中使用 like?

Grafana:使用字符串类型的 MySQL 表列作为图形的 X 轴

在 MYSQL 查询中使用变量 Grafana 返回列名而不是指标

4. Grafana使用mysql作为数据源,呈现图表