Grafana 是一款采用 go 语言编写的开源应用,主要用于大规模指标数据的可视化展现,是运维工具中最流行的时序数据展示工具,目前已经支持绝大部分常用的时序数据库。同时它也提供了许多常用操作的API接口,可以通过调用相关API接口,实现grafana运维的自动化操作。

一、创建API token

调用grafana的api请求时,需要在请求头中添加token认证,首先是创建api token

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308212/1635647023448-ea68b7f3-bdf7-4037-87be-5ceb9e020868.png#clientId=u06c33019-5536-4&from=paste&height=298&id=uae5b979b&margin=[object Object]&name=image.png&originHeight=298&originWidth=273&originalType=binary&ratio=1&size=15547&status=done&style=none&taskId=u83bc90bf-e7a0-414c-92be-b262ea1b26c&width=273)

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308212/1635647061005-72efd937-13ed-40d0-ae87-b22d3e697ff0.png#clientId=u06c33019-5536-4&from=paste&height=315&id=u11f20928&margin=[object Object]&name=image.png&originHeight=315&originWidth=956&originalType=binary&ratio=1&size=24963&status=done&style=none&taskId=u1d09c117-3bcf-4da2-8cc8-73b8520d105&width=956)

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308212/1635647149936-b8adee5a-b86d-41be-b8dd-31e2d12ce231.png#clientId=u06c33019-5536-4&from=paste&height=449&id=u70495865&margin=[object Object]&name=image.png&originHeight=449&originWidth=958&originalType=binary&ratio=1&size=59990&status=done&style=none&taskId=u5183637c-6ed7-4a07-b614-9bb8796b50d&width=958)

点击add按钮以后会返回一个token,妥善保存这个token,后续的所有请求都需要用到它。

二、常用API接口

1. 仪表盘 API

  • 查询所有dashboard列表

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308212/1635649330682-190bb556-5f13-44d4-b754-8dca7d24325b.png#clientId=u06c33019-5536-4&from=paste&height=750&id=u90c8b3bf&margin=[object Object]&name=image.png&originHeight=750&originWidth=625&originalType=binary&ratio=1&size=66886&status=done&style=none&taskId=ud5df659a-876a-4137-911f-5d0d6c89377&width=625)

  • 查询指定uid的dashboard信息(uid字段可以从刚才查询所有dashboard中获取)

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308212/1635649362879-44349ef1-0bba-4fb3-adbc-33a903723b97.png#clientId=u06c33019-5536-4&from=paste&height=263&id=u2417b161&margin=[object Object]&name=image.png&originHeight=263&originWidth=671&originalType=binary&ratio=1&size=25471&status=done&style=none&taskId=ud560d422-0aeb-4659-888f-c152c4201ac&width=671)

  • 删除指定uid的dashboard

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308212/1635649415703-cca7a159-373f-4a51-ad45-b5dd462145d8.png#clientId=u06c33019-5536-4&from=paste&height=259&id=ue9ab1e26&margin=[object Object]&name=image.png&originHeight=259&originWidth=633&originalType=binary&ratio=1&size=24759&status=done&style=none&taskId=ua11553a1-1eb3-4680-9502-932b4e84e0c&width=633)

2. 数据源API

  • 获取所有数据源

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308212/1635649600140-a21d00e3-f0ec-4b5e-aea1-34b50d73537c.png#clientId=u06c33019-5536-4&from=paste&height=249&id=u9517da34&margin=[object Object]&name=image.png&originHeight=249&originWidth=675&originalType=binary&ratio=1&size=24192&status=done&style=none&taskId=u1bf8ccf0-1ad4-4efd-8e19-456b4a373cc&width=675)

  • 查询指定id的数据源

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308212/1635649729651-27f6e207-cf20-4e68-a934-e9ece72128f8.png#clientId=u06c33019-5536-4&from=paste&height=246&id=u73977ff0&margin=[object Object]&name=image.png&originHeight=246&originWidth=635&originalType=binary&ratio=1&size=23589&status=done&style=none&taskId=ue03710d5-ab41-4f7d-8cc1-946ff5f9ace&width=635)

  • 查询指定名称数据源

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308212/1635649830465-dfb6c56f-4f81-4991-b2db-5a085c27c7b6.png#clientId=u06c33019-5536-4&from=paste&height=245&id=ud0ad0dac&margin=[object Object]&name=image.png&originHeight=245&originWidth=625&originalType=binary&ratio=1&size=24240&status=done&style=none&taskId=u114965f6-ebd5-42b7-847a-d6b613083f4&width=625)

  • 更新指定id的数据源(可以先查询指定id的数据源,获取响应内容,然后修改相关的字段组成请求体。body类型选择json)

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308212/1635650456719-8df6a646-9df7-4d58-8c33-a0ce09b3d776.png#clientId=u06c33019-5536-4&from=paste&height=364&id=u926f97a0&margin=[object Object]&name=image.png&originHeight=364&originWidth=610&originalType=binary&ratio=1&size=28004&status=done&style=none&taskId=ue4462702-6932-436b-b462-004f928dbad&width=610)

  • 删除指定id的数据源

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308212/1635650439812-ec68d319-f0a3-4ed1-bc5e-8eb05d7228f8.png#clientId=u06c33019-5536-4&from=paste&height=241&id=uffd5bc88&margin=[object Object]&name=image.png&originHeight=241&originWidth=629&originalType=binary&ratio=1&size=23296&status=done&style=none&taskId=u5305b57e-cfa1-4656-8b97-66a6832be62&width=629)

3. 告警API

  • 获取所有告警列表

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308212/1635650424686-b27764ef-04cc-4cd6-a471-9c617bbac30a.png#clientId=u06c33019-5536-4&from=paste&height=838&id=u60c9b22f&margin=[object Object]&name=image.png&originHeight=838&originWidth=625&originalType=binary&ratio=1&size=82242&status=done&style=none&taskId=u168c32c8-d143-4ea8-91bb-2446d605802&width=625)

  • 查询指定id的告警信息

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308212/1635650524222-bb6c312c-0182-4674-b1a9-46b872527d78.png#clientId=u06c33019-5536-4&from=paste&height=247&id=ua97d46aa&margin=[object Object]&name=image.png&originHeight=247&originWidth=634&originalType=binary&ratio=1&size=23133&status=done&style=none&taskId=u6dcb88f2-0ef9-4102-ae49-f7eefb4c317&width=634)

  • 暂停指定id的告警

![image.png](https://cdn.nlark.com/yuque/0/2021/png/2308212/1635650736025-16c966f6-9316-484b-9fac-545e1a65e793.png#clientId=u06c33019-5536-4&from=paste&height=316&id=ua3f803ab&margin=[object Object]&name=image.png&originHeight=316&originWidth=557&originalType=binary&ratio=1&size=19960&status=done&style=none&taskId=u95f3591c-7f30-4198-a543-b88a3312711&width=557)

三、python调用grafana API示例

import json
import requests


class GrafanaApi:
    def __init__(self, base, key):
        self.base_url = 'grafana访问地址'
        self.headers = {'Authorization': 'API token', 'content-type': "application/json"}

    def get_all_datasource(self):
        """
        获取所有数据源
        """
        api_url = self.base_url + '/api/datasources'
        response = requests.get(api_url, headers=self.headers, verify=False, timeout=120)
        if response.status_code == 200:
            res = response.json()
            ……
            return result
        else:
            return False


    def get_dashboard_uid(self, name):
        """
        查询指定dashboard的uid
        """
        api_url = self.base_url + '/api/search?query=' + name
        response = requests.get(api_url, headers=self.headers, verify=False, timeout=120)
        if response.status_code == 200:
            res = response.json()
            ……
        else:
            return False

    def get_dashboard_data(self, uid):
        """
        查询指定dashboard的data
        """
        api_url = self.base_url + '/api/dashboards/uid/' + uid
        response = requests.get(api_url, headers=self.headers, verify=False, timeout=120)
        if response.status_code == 200:
            res = response.json()['dashboard']
            ……
        else:
            return False

    def get_all_alert(self):
        """
        获取所有告警列表
        """
        api_url = self.base_url + '/api/alerts'
        response = requests.get(api_url, headers=self.headers, verify=False, timeout=120)
        if response.status_code == 200:
            res = response.json()
            ……
        else:
            return False

以上只列举了常用的API接口使用,其他API接口详细使用方法请参阅官方文档https://grafana.com/docs/grafana/latest/http_api/