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

Posted

技术标签:

【中文标题】无法通过 Grafana API 导入 grafana 仪表板【英文标题】:Cannot import grafana dashboard via Grafana API 【发布时间】:2018-11-23 20:02:00 【问题描述】:

我正在尝试按照Grafana 使用 HTTP API 导入 Grafana 仪表板

Grafana 版本:5.1.3 操作系统-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 有效负载中要求名为仪表板的根属性。谁能建议我如何使用该属性以及我应该提供哪些数据。

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

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://***.com/questions/39968111/unable-to-post-to-grafana-using-python3-module-requests
https://***.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

【问题讨论】:

感谢支持,我能解决问题 【参考方案1】:

也许您应该尝试从 API 下载您的仪表板,这样您将获得一个“正确”的 json 模型来推送?

您可以使用以下命令下载它:

curl -H "Authorization: Bearer $TOKEN" https://grafana.domain.tld/api/dashboards/uid/$DASHBOARD_UID

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

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

这是一个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
      
    ]
  ,

当我阅读您的答案时,我想您会对此感到满意;)。我会努力关注这个话题

【讨论】:

感谢您的回复。我有从 grafana 导出的 json 文件。而且我可以创建仪表板并保持 ("query": " ") 空白。当我尝试发送流入查询“query”:“SELECT \"responseTime\" FROM \"requestsRaw\" WHERE $timeFilter" 我收到错误 ["classification":"DeserializationError","message":"invalid character ' r' 在对象键:值对之后","fieldNames":["Dashboard"],"classification":"RequiredError","message":"Required"] 涌入查询问题-community.grafana.com/t/…【参考方案2】:

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


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

【讨论】:

以上是关于无法通过 Grafana API 导入 grafana 仪表板的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Grafana 镜像中添加仪表板配置 json 文件?

grafana-piechart-panel 安装

Grafana 通过 API 覆盖现有仪表板

Grafana 5.1.0 中的divideSeriesList

[转帖]Grafana背后的Nginx和Apache Proxy

在 Grafana 图形直方图中显示百分比