【问题标题】:Grafana custom datasource to use mssqlGrafana 自定义数据源使用 mssql
【发布时间】:2020-07-14 10:40:22
【问题描述】:

我想创建一个使用 MSSQL 数据库的 Grafana 插件。我知道有一个内置的 MSSQL 数据源插件,但这需要用户输入整个 SQL 查询。我想创建一个自定义数据源,允许用户从列表中选择一个名称,插件将为此创建相应的查询。因此,我想构建一个完整的自定义查询构建器(它是数据源插件的一部分)。

我从简单的数据源插件 [https://github.com/grafana/simple-datasource/tree/master][1] 开始,我能够编译它并且它在 Grafana 中可见。

我认为如果我的数据源扩展现有的 MSSQL 插件会很容易。

我的 testDatasource 如下所示:

async testDatasource() {
 return getBackendSrv()
  .datasourceRequest({
    url: '/api/tsdb/query',
    method: 'POST',
    data: {
      from: '5m',
      to: 'now',
      queries: [
        {
          refId: 'A',
          intervalMs: 1,
          maxDataPoints: 1,
          datasourceId: this.id,
          rawSql: 'SELECT 1',
          format: 'table',
        },
      ],
    },
  })
  .then((res: any) => {
    return { status: 'success', message: 'Database Connection OK' };
  })
  .catch((err: any) => {
    if (err.data && err.data.message) {
      return { status: 'error', message: err.data.message };
    } else {
      return { status: 'error', message: err.status };
    }
  });

每次我测试它时,我都会在日志中得到一个错误 error="Could not find executor for data source type: my-mssql-datasource" remote_addr=[::1]

我在 github 上查看了这个错误的来源,我发现 grafana/pkg/tsdb/query_endpoint.go 中的 Grafana 代码在其注册插件中找不到 my-mssql-datasource 名称。

有没有办法可以使用 Grafana 中已经存在的 MSSQL 后端处理?如果是这样,是否有任何指南或提示显示如何做到这一点?我尝试遵循 Grafana 文档,但它对我没有帮助。

例如:我可以在我的datasourceRequest 中添加一些东西,使 Grafana 能够针对 MSSQL 执行我的查询吗?或者我可以注册我的数据源以便它使用 MSSQL 吗?

编辑 正如@Jan Garaj 在 cmets 中提到的,可以使用仪表板变量来完成。但是,仪表板变量用于整个仪表板。如果我想要 2 个具有不同信号的面板,可以由用户选择,我不能使用仪表板变量。然后我需要像面板变量这样的东西。因为它是每个面板,所以我想使用查询生成器来执行此操作。 [1]:https://github.com/grafana/simple-datasource/tree/master

【问题讨论】:

  • user to select a name from a list, and the plugin will create the corresponding query for that - 这是仪表板变量的恕我直言
  • @JanGaraj 可能是这样,但列表的名称将来自数据库中的表(查找),我不希望用户与查询或变量有任何关系.从列表中选择一个名称,值将显示在图表中。因此我需要一个自定义查询生成器,而查询生成器是数据源插件的一部分。
  • 现在我看到的仪表板变量更像是整个仪表板的“切换/选择数据源”。但我将有 1 个数据源说 TempA1、TempA2、TempB1 和 TempB2 的趋势值。然后我希望用户能够添加一个面板,他/她可以在查询生成器中选择 TempA1、TempA2、TempB1 和 TempB2 .. 不多也不少。因此也可以有 2 个面板,一个显示 TempA1 和 TempB1,另一个显示 TempA2 和 TempB2(或任何其他组合) - 注意 TempA1 等只是示例。 Real db 有近 1000 个不同的信号。

标签: grafana grafana-datasource


【解决方案1】:

我知道这是一个老问题,但我也遇到过同样的问题,无法完全弄清楚如何访问 Grafana 的 MSSQL 后端实现。搜索内置 MSSQL 插件的 github 代码并没有提供任何关于它是如何做到的线索 - 我只能确定后端需要 rawSqlfromtodatasourceId、@ JSON 中的 987654325@ 和 refId 字段发送到 /api/tsdb/query。从我的其他研究来看,secureJSON 对象字段(例如,包含 MSSSQL 用户名和密码)似乎可以附加到服务器端的原始 JSON 对象。可以推测后端随后识别datasourceId是MSSQL数据源的实例,并将所有信息转换为SQL Server连接字符串和/或查询并通过命名管道或其他方法连接到数据库。

似乎没有任何文档可以帮助第三方插件连接到 MSSQL 后端,而我试图了解他们的内置数据源如何绑定到该后端的努力没有结果。

不过,我可以建议另一种方法。应该可以创建一个与内置 MSSQL 数据源实例接口的数据源插件。在这方面,您的数据源插件本质上充当用户和 MSSQL 数据源之间的代理。这需要像往常一样添加一个标准的 MSSQL 数据源,然后将新的数据源插件指向新创建的 MSSQL 数据源。您的新数据源可以有一个漂亮的 UI 供用户选择某些列、选项等,然后插件可以创建一个动态查询,然后将其发送到 MSSQL 数据源。

所以,你只需要弄清楚MSSQL数据源的datasourceId,在下面的sn-p中显示为datasourceId-of-MSSQL-datasource

    async testDatasource() {
     return getBackendSrv()
      .datasourceRequest({
        url: '/api/tsdb/query',
        method: 'POST',
        data: {
          from: '5m',
          to: 'now',
          queries: [
            {
              refId: 'A',
              intervalMs: 1,
              maxDataPoints: 1,
              datasourceId: 'datasourceId-of-MSSQL-datasource',
              rawSql: 'SELECT 1',
              format: 'table',
            },
          ],
        },
      })
      .then((res: any) => {
        return { status: 'success', message: 'Database Connection OK' };
      })
      .catch((err: any) => {
        if (err.data && err.data.message) {
          return { status: 'error', message: err.data.message };
        } else {
          return { status: 'error', message: err.status };
        }
      });

我已在本地 Grafana 实例上成功尝试过这种方法。

【讨论】:

    猜你喜欢
    • 2018-03-15
    • 2021-12-28
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2018-04-18
    • 1970-01-01
    • 2022-06-27
    相关资源
    最近更新 更多