0

我想使用单个模板部署和管理许多类似的带有 jsonnet/grafonnet 的 Grafana 仪表板,其中在每个仪表板实例中替换变量。

到目前为止,我的(不工作)方法的简化示例如下所示:

# main.jsonnet
(import 'template.json') {
  _config+:: {
    name: 'thing1',
  },
  metric:: {
    name: 'metric1',
  },
} +

(import 'template.json') {
  _config+:: {
    name: 'thing2',
  },
  metric:: {
    name: 'metric2',
  },
}
#template.json
local grafana = import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet';
local prometheus = grafana.prometheus;
local dashboard = grafana.dashboard;
local graphPanel = grafana.graphPanel;

{
  grafanaDashboards+:: {
    local fileName = $._config.name + '.json',
    fileName:
      dashboard.new(
        '%(name)s Dashboard' % $._config.name,
      ).addPanel(
        grafana.text.new(
          title='%(name)s dashboard' % $.metric.name,
          content='Dashboard for metric ' + $.metric.name,
        ),
      )
  },
}

但是,在渲染时,它只输出一个值为“thing2”“metric2”的仪表板。

像这样的模板的正确方法是什么?我正在寻找要像这样输出的多个仪表板...

仪表板1-“事物1”“公制1”

仪表板2-“事物2”公制2”

4

1 回答 1

1

问题在于,main.jsonnet您将 ( +)合并到内容metric2之上metric1,完全覆盖它。

您需要为每个字段创建一个显式字段(数组也可以,但稍后在 jsonnet 中处理它更麻烦),然后您可以利用jsonnet -m <dir>为每个字段创建一个文件。

放在一起:

main.jsonnet

// main.jsonnet
{
  'dash1.json': (import 'template.jsonnet') {
    _config+:: {
      name: 'thing1',
    },
    metric:: {
      name: 'metric1',
    },
  }.grafanaDashboards,

  'dash2.json': (import 'template.jsonnet') {
    _config+:: {
      name: 'thing2',
    },
    metric:: {
      name: 'metric2',
    },
  }.grafanaDashboards,
}

模板.jsonnet

差异:添加所需gridPos的函数调用

//template.json
local grafana = import 'github.com/grafana/grafonnet-lib/grafonnet/grafana.libsonnet';
local prometheus = grafana.prometheus;
local dashboard = grafana.dashboard;
local graphPanel = grafana.graphPanel;

{
  grafanaDashboards+:: {
    local fileName = $._config.name + '.json',
    fileName:
      dashboard.new(
        '%(name)s Dashboard' % $._config.name,
      ).addPanel(
        grafana.text.new(
          title='%(name)s dashboard' % $.metric.name,
          content='Dashboard for metric ' + $.metric.name,
        ),
        gridPos=0  // required parameter, put 0 but dunno if ok
      ),
  },
}

命令行界面

使用jsonnet-bundler供应商导入的依赖项

# Download deps to vendor/
$ jb init
$ jb install https://github.com/grafana/grafonnet-lib
GET https://github.com/grafana/grafonnet-lib/archive/3082bfca110166cd69533fa3c0875fdb1b68c329.tar.gz 200

# Create dash{1,2}.json output from main.jsonnet fields
$ jsonnet -J vendor -m . main.jsonnet
./dash1.json
./dash2.json

于 2021-06-15T12:14:49.923 回答