【问题标题】:Create grafana dashboards with api使用 api 创建 grafana 仪表板
【发布时间】:2015-09-18 22:36:01
【问题描述】:

我正在尝试使用 grafana 的 api 从模板创建 grafana 仪表板。我现在用的是grafana v2.0.2。

我有一个 api 密钥,我可以使用 curl 获取仪表板,但我无法创建仪表板。

当我执行以下请求时:curl -i -H "Authorization: Bearer eyJrIobfuscatedlkIjoxfQ==" http://localhost:3000/api/dashboards/db/webserver2 然后我为仪表板取回 json。

当我尝试创建我在 api 示例中找到的最简单的仪表板时,它不起作用:curl -i -H "Authorization: Bearer eyJrIobfuscatedlkIjoxfQ==" -d /tmp/simpledash http://localhost:3000/api/dashboards/db 其中/tmp/simpledash 包含:

{
  "dashboard": {
    "id": null,
    "title": "Production Overview",
    "tags": [ "templated" ],
    "timezone": "browser",
    "rows": [
      {
      }
    ]
    "schemaVersion": 6,
    "version": 0
  },
  "overwrite": false
 }

我收到以下回复:

HTTP/1.1 422 status code 422
Content-Type: application/json; charset=utf-8
Date: Wed, 01 Jul 2015 16:16:48 GMT
Content-Length: 84

[{"fieldNames":   ["Dashboard"],"classification":"RequiredError","message":"Required"}]

我尝试了 json 的一些变体,但我总是得到响应,并且在互联网上我找不到有效的示例。有人对我有一个有效的例子吗?我喜欢这个工作,所以我可以从 ansible 创建仪表板。

谢谢!

【问题讨论】:

  • 我发现如果“rows”数组里面有一个空对象[{}],我会遇到JS错误,单独发送[]似乎已经纠正了这个问题。似乎 JS 看到了该对象并尝试从中提取值。

标签: influxdb grafana


【解决方案1】:

我昨晚想通了,网站上的示例在“schemaVersion”之前缺少一个逗号

正确的 json 应该是:

{
  "dashboard": {
    "id": null,
    "title": "Production Overview",
    "tags": [ "templated" ],
    "timezone": "browser",
    "rows": [
      {
      }
    ],
    "schemaVersion": 6,
    "version": 0
  },
  "overwrite": false
 }

如果你将你的 json 复制到这个 json 验证器中,它会准确地告诉你问题出在哪里:

http://jsonlint.com/

【讨论】:

    【解决方案2】:

    要使用 curl 从文件中发布数据,请在文件名前添加 @,如下所示:

    curl -i -H "Authorization: Bearer eyJrIobfuscatedlkIjoxfQ==" -d @/tmp/simpledash http://localhost:3000/api/dashboards/db
    

    【讨论】:

      【解决方案3】:

      失败的原因是API需要知道payload是json。

      使用 cURL

      curl -XPOST -i http://localhost:3000/api/dashboards/db --data-binary @./test.json -H "Content-Type: application/json"
      

      用ansible

      - name: postinstall::dashsetups
        uri:
          url: http://{{grafana.ip}}:{{grafana.bind}}/api/dashboards/db
          method: POST
          user: "{{ admin_usr }}"
          password: "{{ admin_pwd }}"
          body: "{{ lookup('template', item.file) }}"
          status_code: 200
          body_format: raw
          force_basic_auth: yes
          HEADER_Content-Type: "application/json"
        with_items: "{{ grafana.dashboards }}"
      

      和包含仪表板的 vars 文件,

      "grafana":{"dashboards": [
                {
                  "name": "t1",
                  "file": "./dashboards/filename.json.j2",
                  "dash_name": "Test 1"
                },
                {
                  "name": "t2",
                  "file": "./dashboards/filename2.json.j2",
                  "dash_name": "Test 2"
                },
                {
                  "name": "t3",
                  "file": "./dashboards/template3.json.j2",
                  "dash_name": "Test 3"
                }
              ]
      }
      

      【讨论】:

        【解决方案4】:

        从您的机器导入 JSON 仪表板的有用 ONE-LINER

        for i in `ls *.json` ;do curl -i -u GRAFANA_USERNAME:GRAFANA_PASSWORD -H "Content-Type: application/json" -X POST http://GRAFANA_HOST/api/dashboards/db -d @$i ; done
        

        请从上述命令中更改 GRAFANA_USERNAME 、 GRAFANA_PASSWORD 和 GRAFANA_HOST。

        【讨论】:

          【解决方案5】:

          我解决了这样的问题:

          1- 首先像这样创建您的数据源(在我的例子中,我使用了 collectd、prometheus 和 grafana 的组合)

          curl --user admin:admin 'http://IPADDR:3000/api/datasources' -X  POST -H 'Content-Type: application/json;charset=UTF-8'  --data-binary '{"name":"test","type":"prometheus","url":"http://localhost:9090","access":"proxy","basicAuth":false}'
          

          2-要添加自定义的 json 仪表板,编辑 grafana.ini 文件并启用仪表板 json 文件部分,如下所示:

          ;##################### Dashboard JSON files #####################
           [dashboards.json]
           enabled = true
           path = /var/lib/grafana/dashboards
          

          3-然后将dashboard json文件复制到/var/lib/grafana/dashboards(需要重启服务)

          【讨论】:

          • 这对我也有用。我确实必须将导出的仪表板 Json 源文件注释更改为数据源的文字名称,例如:用“test”替换“${DATASOURCE}”
          【解决方案6】:

          我正在添加另一种使用 python 脚本的方法

          import requests
          url='http://admin:admin@localhost:3000/api/dashboards/db'
          data='''{
            "dashboard": {
              "id": null,
              "uid": "mahadev",
              "title": "scriptedDashboard",
              "tags": [ "templated" ],
              "timezone": "browser",
              "schemaVersion": 16,
              "version": 0
            },
            "folderId": 48,
            "overwrite": false
          }'''
          headers={"Content-Type": 'application/json'}
          response = requests.post(url, data=data,headers=headers)
          print (response.text)
          

          【讨论】:

            猜你喜欢
            • 2023-01-20
            • 2019-08-28
            • 2019-02-25
            • 1970-01-01
            • 1970-01-01
            • 2018-11-23
            • 2019-11-14
            • 2021-03-09
            • 1970-01-01
            相关资源
            最近更新 更多