1

我想创建一个使用 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]

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

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

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

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

4

1 回答 1

0

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

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

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

因此,您只需要找出 MSSQL 数据源的 datasourceId,如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 实例上成功尝试了这种方法。

于 2022-02-01T14:10:39.740 回答