无法通过Grafana API导入grafana仪表板

时间:2018-06-14 06:16:17

标签: python grafana

我正在尝试按照Grafana

使用HTTP API导入Grafana仪表板

Grafana版本:5.1.3 OS -Windows 10

这是我试过的

curl --user admin:admin "http://localhost:3000/api/dashboards/db" -X POST -H "Content-Type:application/json;charset=UTF-8" --data-binary @c:/Users/Mahadev/Desktop/Dashboard.json

和 这是我的python代码

import requests

headers = {
'Content-Type': 'application/json;charset=UTF-8',
}

data = open('C:/Users/Mahadev/Desktop/Dashboard.json', 'rb').read()
response = requests.post('http://admin:admin@localhost:3000/api/dashboards/db', headers=headers, data=data)
print (response.text)

两者的输出是:

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

要求在我的json有效负载中使用名为dashboard的root属性。任何人都可以建议我如何使用该属性以及我应该提供什么数据。

如果有人想更多地挖掘这里有一些链接。

https://github.com/grafana/grafana/issues/8193
https://github.com/grafana/grafana/issues/2816
https://github.com/grafana/grafana/issues/8193
https://community.grafana.com/t/how-can-i-import-a-dashboard-from-a-json-file/669
https://github.com/grafana/grafana/issues/273
https://github.com/grafana/grafana/issues/5811
https://stackoverflow.com/questions/39968111/unable-to-post-to-grafana-using-python3-module-requests
https://stackoverflow.com/questions/39954475/post-request-works-in-postman-but-not-in-python/39954514#39954514
https://www.bountysource.com/issues/44431991-use-api-to-import-json-file-error
https://github.com/grafana/grafana/issues/7029

2 个答案:

答案 0 :(得分:1)

也许你应该尝试从API下载你的仪表板,这样你就可以推出一个“适当的”json模型?

您可以使用以下命令下载它: curl -H“授权:Bearer $ TOKEN”https://grafana.domain.tld/api/dashboards/uid/ $ DASHBOARD_UID

另一种方法,您可以在grafana网站上下载仪表板JSON => grafana.com/dashboards并尝试使用您当前的代码上传它? ;)

仪表板字段包含将要显示的所有内容,警报,图表等....

以下是dashboard.json的一个示例:

{
  "meta": {
    "type": "db",
    "canSave": true,
    "canEdit": true,
    "canAdmin": false,
    "canStar": true,
    "slug": "status-app",
    "url": "/d/lOy3lIImz/status-app",
    "expires": "0001-01-01T00:00:00Z",
    "created": "2018-06-04T11:40:20+02:00",
    "updated": "2018-06-14T17:51:23+02:00",
    "updatedBy": "jean",
    "createdBy": "jean",
    "version": 89,
    "hasAcl": false,
    "isFolder": false,
    "folderId": 0,
    "folderTitle": "General",
    "folderUrl": "",
    "provisioned": false
  },
  "dashboard": {
    "annotations": {
      "list": [
        {
          "builtIn": 1,
          "datasource": "-- Grafana --",
          "enable": true,
          "hide": true,
          "iconColor": "rgba(0, 211, 255, 1)",
          "name": "Annotations & Alerts",
          "type": "dashboard"
        }
      ]
    },
    "editable": true,
    "gnetId": null,
    "graphTooltip": 0,
    "id": 182,
    "links": [],
    "panels": [
      {
        "alert": {
          "conditions": [
            {
              "evaluator": {
                "params": [
                  1
                ],
                "type": "lt"
              },
              "operator": {
                "type": "and"
              },
              "query": {
                "params": [
                  "A",
                  "5m",
                  "now"
                ]
              },
              "reducer": {
                "params": [],
                "type": "avg"
              },
              "type": "query"
            }
          ],
          "executionErrorState": "alerting",
          "frequency": "60s",
          "handler": 1,
          "name": "Status of  alert",
          "noDataState": "alerting",
          "notifications": [
            {
              "id": 7
            }
          ]
        },
        "aliasColors": {},
        "bars": false,
        "dashLength": 10,
        "dashes": false,
        "datasource": "Collectd",
        "fill": 1,
        "gridPos": {
          "h": 7,
          "w": 8,
          "x": 0,
          "y": 0
        },
        "id": 4,
        "legend": {
          "alignAsTable": true,
          "avg": true,
          "current": true,
          "max": false,
          "min": false,
          "rightSide": false,
          "show": true,
          "total": false,
          "values": true
        },
        "lines": true,
        "linewidth": 1,
        "links": [],
        "nullPointMode": "connected",
        "percentage": false,
        "pointradius": 5,
        "points": false,
        "renderer": "flot",
        "seriesOverrides": [],
        "spaceLength": 10,
        "stack": false,
        "steppedLine": false,
        "targets": [
          {
            "alias": "Status",
            "groupBy": [
              {
                "params": [
                  "$__interval"
                ],
                "type": "time"
              },
              {
                "params": [
                  "null"
                ],
                "type": "fill"
              }
            ],
            "measurement": "processes_processes",
            "orderByTime": "ASC",
            "policy": "default",
            "query": "SELECT mean(value) FROM \"processes_processes\" WHERE (\"instance\" = '' AND \"host\" = 'Webp01') AND $timeFilter GROUP BY time($interval) fill(null)",
            "rawQuery": true,
            "refId": "A",
            "resultFormat": "time_series",
            "select": [
              [
                {
                  "params": [
                    "value"
                  ],
                  "type": "field"
                },
                {
                  "params": [],
                  "type": "mean"
                }
              ]
            ],
            "tags": [
              {
                "key": "instance",
                "operator": "=",
                "value": ""
              },
              {
                "condition": "AND",
                "key": "host",
                "operator": "=",
                "value": "Webp01"
              }
            ]
          }
        ],
        "thresholds": [
          {
            "colorMode": "critical",
            "fill": true,
            "line": true,
            "op": "lt",
            "value": 1
          }
        ],
        "timeFrom": null,
        "timeShift": null,
        "title": "Status of ",
        "tooltip": {
          "shared": true,
          "sort": 0,
          "value_type": "individual"
        },
        "type": "graph",
        "xaxis": {
          "buckets": null,
          "mode": "time",
          "name": null,
          "show": true,
          "values": []
        },
        "yaxes": [
          {
            "format": "short",
            "label": null,
            "logBase": 1,
            "max": null,
            "min": null,
            "show": true
          },
          {
            "format": "short",
            "label": null,
            "logBase": 1,
            "max": null,
            "min": null,
            "show": true
          }
        ],
        "yaxis": {
          "align": false,
          "alignLevel": null
        }
      }
    ],
    "refresh": "5m",
    "schemaVersion": 16,
    "style": "dark",
    "tags": [
      "web",
      "nodejs"
    ],
    "templating": {
      "list": []
    },
    "time": {
      "from": "now/d",
      "to": "now"
    },
    "timepicker": {
      "hidden": false,
      "refresh_intervals": [
        "5s",
        "10s",
        "30s",
        "1m",
        "5m",
        "15m",
        "30m",
        "1h",
        "2h",
        "1d"
      ],
      "time_options": [
        "5m",
        "15m",
        "1h",
        "6h",
        "12h",
        "24h",
        "2d",
        "7d",
        "30d"
      ]
    },
    "timezone": "",
    "title": "Status APP",
    "uid": "lOy3lIImz",
    "version": 89
  },
}

编辑:

这是一个用于模板化仪表板的JSON片段:

  "templating": {
    "list": [
      {
        "allValue": null,
        "current": {
          "text": "PRD_Web01",
          "value": "PRD_Web01"
        },
        "datasource": "Collectd",
        "hide": 0,
        "includeAll": false,
        "label": null,
        "multi": false,
        "name": "host",
        "options": [],
        "query": "SHOW TAG VALUES WITH KEY=host",
        "refresh": 1,
        "regex": "",
        "sort": 0,
        "tagValuesQuery": "",
        "tags": [],
        "tagsQuery": "",
        "type": "query",
        "useTags": false
      },
      {
        "allValue": null,
        "current": {
          "text": "sda",
          "value": "sda"
        },
        "datasource": "Collectd",
        "hide": 0,
        "includeAll": false,
        "label": null,
        "multi": false,
        "name": "device",
        "options": [],
        "query": "SHOW TAG VALUES FROM \"disk_read\" WITH KEY = \"instance\"",
        "refresh": 1,
        "regex": "",
        "sort": 0,
        "tagValuesQuery": "",
        "tags": [],
        "tagsQuery": "",
        "type": "query",
        "useTags": false
      }
    ]
  },

当我读到你的答案时,我猜你会好起来的;)。我会尝试更好地关注这个线程(我不习惯stackoverflow)。

答案 1 :(得分:0)

您能显示一下仪表板json的样子吗? json必须在其中包含一个关键的仪表板,其值内包含所有详细信息,如下所示:

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