无法通过 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 5.1.0 中的divideSeriesList