【问题标题】:Update\Insert data from grafana to mysql更新\插入数据从 grafana 到 mysql
【发布时间】:2019-10-11 10:40:07
【问题描述】:

可以更新数据或将数据从 grafana 插入到 mysql。我需要使用 UI 在 mysql 中插入/更新信息。现在我已经在使用 grafana,所以想知道是否有任何方法可以使用 grafana 来更新或插入信息

【问题讨论】:

  • 为什么要使用 Grafana?有很多方法可以简单地创建 CRUD 接口,但不应该使用 Grafana 作为监控系统
  • 是的,我知道...这是为一些只了解仪表板的外部人员准备的。现在,他们将在数据库中更新或插入数据。由于已经为他们设置了 grafana,并且他们已经在使用它,因此考虑使用 grafana。

标签: mysql sql-update sql-insert grafana


【解决方案1】:

没有输入面板用于接受用户输入并将该数据插入 MySQL 或任何其他。 (格拉法纳 v7.0) 对于非常简约的输入数据,您可以将 grafana 变量用作 hack。

创建用于在 MySQL 中存储输入的示例表

CREATE TABLE `grafana_variable` (`variable` VARCHAR(64)) ENGINE = InnoDb;

在 Grafana 仪表板中单击设置图标:

然后点击:

添加变量:

返回仪表板,您应该会在顶部看到:

创建一个新的可视化面板或在任何现有面板中添加另一个查询并添加 SQL 查询:

INSERT INTO `grafana_variable` VALUES ('${myvar}');

现在每次您输入该字段时

然后点击离开它或使用 ie tab 键,数据将被插入到 MySQL 数据库中。

mysql> select * from grafana_variable;
+---------------------+
| variable            |
+---------------------+
| this is just a test |
+---------------------+
1 row in set (0.08 sec)

这个 hack 的缺点是可视化图块的左上角会有错误图标:

带有信息(当您将鼠标悬停在其上时):

找不到名为 time 或 time_sec 的列

因为可视化图块的 sql 查询是插入数据而不是从数据库中选择数据,因此没有 time 或 time_sec 数据。 Grafana 也不处理多个 MySQL 语句,因此您无法通过在 INSERT INTO ... 语句之前或之后添加第二个 SELECT FROM 来修复它。也许这可以通过使用子查询或类似的东西以某种方式修补,但我没有进一步调查。

由于上述错误可能是由于与 hack 无关的多种原因,最好在单独的可视化磁贴中使用 hack 查询 - 您会记住的那个(或什至提供描述性面板磁贴)所以你知道那个错误没有什么异常。

有关变量的更多信息,请参阅grafana varialbes。 还有一个有用的现有变量列表,您可以使用与我创建的myvar 相同的方式。参见 MACROS here 部分例如:

$__timeFrom()

$__timeTo()

有显示时间范围的开始和结束。

权限和安全
整个 hack 之所以有效,是因为允许 grafana 使用的 MySQL 用户执行 INSERT 语句,但是如果 grafana 能够执行 ANY 语句,那么请确保不允许 grafana 使用的 MySQL 用户执行诸如 DROP ... 或任何语句之类的语句其他与INSERT 数据无关的数据放入grafana_variable 表中,如示例所示。

如果您使用 MySQL 作为数据源来显示数据,那么 grafana 用户也应该能够执行 SELECT 语句。

但仅此而已。

Read about MySQL user premissions

【讨论】:

    【解决方案2】:

    必须将更新隐藏为临时表

    我正在使用 postgres 和 Grafana。可能它非常相似。 使用 postgres 你必须像这样隐藏更新:

    WITH UPDAT_TEMP AS (UPDATE MyTable SET MY_ROW='MY_TEXT' WHERE ID=99)
    SELECT 1;
    

    如果要更新各种行,就得放各种临时表。

    Update my_table (rows) values(...) 
    

    在 Grafana 下不适合我。

    因此:

    WITH UPDAT_TEMP AS (UPDATE MyTable SET MY_ROW='MY_TEXT' WHERE ID=99),
    WITH UPDAT_TEMP2 AS (UPDATE MyTable SET MY_ROW2='MY_TEXT2' WHERE ID=99)
    SELECT 1;
    

    【讨论】:

      猜你喜欢
      • 2013-05-21
      • 2013-12-10
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多