我正在尝试将几个仪表板从一台服务器迁移到另一台服务器。为此,我使用python
和requests
库编写了一个非常简单的脚本。
class Grafana:
def __init__(self, url, key):
self.headers = {
'Accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + key
}
self.url = url
def get_all_dashboard_uris(self):
return (dashboard['uri']
for dashboard in requests.get(self.url+'api/search?query=', headers=self.headers
).json())
def import_dashboard(self, dashboard_uri):
return requests.get(self.url+'api/dashboards/'+dashboard_uri, headers=self.headers).json()['dashboard']
def create_dashboard(self, dashboard_object):
dashboard_object['id'] = None #id = null to create a new dashboard
#(https://grafana.com/docs/grafana/v4.1/http_api/dashboard/)
return requests.post(self.url+'api/dashboards/db', headers=self.headers, json={'dashboard': dashboard_object})
if __name__ == '__main__':
initial_grafana = Grafana(url=URL, key=KEY)
final_grafana = Grafana(url=URL_TEST, key=KEY_TEST)
for dashboard_uri in initial_grafana.get_all_dashboard_uris():
dash = initial_grafana.import_dashboard(dashboard_uri)
print(dashboard_uri)
result = final_grafana.create_dashboard(initial_grafana.import_dashboard(dashboard_uri))
print(result.status_code, result.text)
print('')
问题是这会403 {"message":"Permission denied"}
为所有仪表板打印。即使尝试使用与文档建议的完全相同的参数创建仪表板,我也会遇到此问题:
def create_test_dashboard(self):
dashboard_object = {
'dashboard': {
'id': None,
'title': 'Production Overview',
'tags': ['templated'],
'timezone': 'browser',
'rows': [{}],
'schemaVersion': 6,
'version': 0
},
'overwrite': False
}
return requests.post(self.url+'api/dashboards/db', headers=self.headers, json=dashboard_object)
if __name__ == '__main__':
final_grafana = Grafana(url=URL_TEST, key=KEY_TEST)
result = final_grafana.create_test_dashboard()
一些我认为很重要的快速说明:
1)如果我使用对象import_dashboard
中的方法没有问题final_grafana
;
2) 如果我使用.json
文件手动创建仪表板,则完全没有问题;
3)我正在使用管理员角色用户;
4)我正在使用 Grafana 4.2。
关于如何解决这个问题的任何想法?