一、使用grafana的api接口,从grafana取数据出来
1、key设置
需要使用接口访问看板的数据,首先需要一个API keys来做身份验证,在Grafana的可视化界面就可以添加。
在添加之后会出现API keys的值,需要保存好。
2、使用postman调试
现在就可以用postman来调试一下了。用post方法访问Grafana的3010接口,注意自己使用的哪个端口,也有可能是3000端口,访问路径为/api/ds/query。如:https://ip:3010/api/ds/query。请求头为:
Authorization:Bearer 密钥
Content-Type:application/json
这时候发送会返回 "message": "No queries found" 。代表成功调用到了接口,但是没有查询语句,查询语句需要在Body中的JSON格式发送。可以直接到网页的看板中去拿整个查询语句,用浏览器的开发者模式找到query的请求内容,直接就可以用。看到有返回很多时间戳的,基本就是看板的返回数据了
把这个请求全部复制到vs code中,选择json格式,右键格式化。就获得了可以查询使用的所有参数。
把整个复制到postman中就可以获得看板的返回数据
选择右边的代码就可以复制为python代码,如果需要特定日期的数据可以修改里面的时间戳参数。拿出来的数据很多很乱,还需要用代码进行整理,不过也都是json格式的。这是一个整理的实例,根据自己需求修改
def gf_datatojson(data):
"""将grafana的数据转换为需要的json格式"""
fields = data['results']['A']['frames'][0]['schema']['fields']
names = []
for field in fields:
names.append(field['name'])
values = data['results']['A']['frames'][0]['data']['values']
# 使用zip()函数来组合成combined列表
combined = list(zip(names, values))
# 把combined列表转换成tmp字典
tmp = {}
for name, value in combined:
if value:
tmp[name] = value[0]
else:
tmp[name] = 0
# 设置默认值
for field_name in ['Time', '1', '2', '3']:
if field_name not in tmp:
tmp[field_name] = 0
return tmp
二、飞书文档数据写入
1、创建应用
飞书创建企业应用需要管理员审批,在飞书开放平台登陆就可以创建应用飞书开放平台
创建后需要在权限管理中开通飞书文档的权限,如果需要修改知识库中的文档,还需要开通知识库的权限。否则拿不到文档的token就没办法修改文档。应用发版之后就可以拿到应用的App ID 和 App Secret在连接时需要用到
2、python调用飞书api
使用代码增删查改飞书的数据需要四个键值对:
1、app_id:在自建应用的应用凭证中
2、app_secret:在自建应用的应用凭证中
3、TABLE_ID:需要操作表格的id
4、APP_TOKEN:需要调用应用api进行获取
在飞书文档中,默认每一个多维表格就是一个app,所以一个多维表格中的所有文档都是同一个APP_TOKEN,结合上面的TABLE_ID就可以定位要修改是哪个表格了。多维表格的TOKEN可以在连接中获取
拿到TOKEN之后需要在飞书的API调试台获取APP_TOKEN,如果不是知识库中的多维文档获取方法同理,只是调用的飞书接口不一样,官方文档可以找找。调用后返回的数据中,obj_token的值就是要使用的APP_TOKEN
这时候就可以使用python代码查询一下表格了。大概就是init_client方法使用了app的id和app_secret获取到了连接。之后data_Create方法使用APP_TOKEN和TABLE_ID来确定要查询的表,返回的信息中有每行的record_id,每一行都有唯一的record_id,如果要修改需要使用record_id来定位要修改的行
查询示例:
#!/usr/bin/env python
# coding=utf-8
import lark_oapi as lark
from lark_oapi.api.bitable.v1 import *
import json
import datetime
def init_client():
"""飞书api调用对象"""
return lark.Client.builder() \
.app_id("自己的ap_id") \
.app_secret("自己app的app_secret") \
.log_level(lark.LogLevel.DEBUG) \
.build()
def data_Create(client):
"""查询要修改行的record_id"""
# 构造请求对象
request: ListAppTableRecordRequest = ListAppTableRecordRequest.builder() \
.app_token(APP_TOKEN) \
.table_id(TABLE_ID) \
.filter(f'列表名 = "值"&&列表名 = 值') \# 这里写查询条件
.page_size(20) \
.build()
# 发起请求
response: ListAppTableRecordResponse = client.bitable.v1.app_table_record.list(request)
# 处理失败返回
if not response.success():
lark.logger.error(
f"client.bitable.v1.app_table_record.list failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}")
return
# 处理业务结果
get = json.loads(lark.JSON.marshal(response.data, indent=4))
def main():
client = init_client()
ProductName = "12345678"
get = data_Create(client,ydate,ProductName)
if __name__ == "__main__":
main()
修改代码示例:
def data_upload(client,record_id,value):
"""通过record_id修改数据到指定行"""
# 构造请求对象
request: UpdateAppTableRecordRequest = UpdateAppTableRecordRequest.builder() \
.app_token(APP_TOKEN) \ #自己的APP_TOKEN
.table_id(TABLE_ID) \ #自己的TABLE_ID
.record_id(record_id) \ #查询出来的record_id
.request_body(AppTableRecord.builder()
.fields({"收入 \u002D 内购": value})
.build()) \
.build()
# 发起请求
response: UpdateAppTableRecordResponse = client.bitable.v1.app_table_record.update(request)
# 处理失败返回
if not response.success():
lark.logger.error(
f"client.bitable.v1.app_table_record.update failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}")
return
# 处理业务结果
lark.logger.info(lark.JSON.marshal(response.data, indent=4))
三、多看版查询思路
看板的查询格式是固定的,所以可以使用拼接的方式复用一个方法进行反复查询。查询的时间可以使用python的方法自动获得当天的时间在去计算昨天或者前天的时间,在转换成时间戳就可以传给Grafana进行查询了
日期,时间戳示例:
def time_yesterday():
"""获取今天昨天日期和时间戳"""
# date = datetime.date.today()
date = datetime.date(2024, 4, 7)
yesterday = date - datetime.timedelta(days=1)
date_timestamp = date_to_timestamp(date)
yesterday_timestamp = date_to_timestamp(yesterday)
return {
"date": date,
"yesterday":yesterday,
"date_stamp":date_timestamp,
"yesterday_stamp":yesterday_timestamp
}
def date_to_timestamp(date):
"""将日期转换为时间戳"""
return str(int(time.mktime(datetime.datetime.strptime(date.strftime('%Y-%m-%d'), '%Y-%m-%d').timetuple())) * 1000 +28800000)
查询方法复用示例:
#传入时间和Grafana可以识别的sql
def gf_query(date_time,sql):
"""向Grafana进行数据查询"""
payload = json.dumps({
"queries": sql,
"from": date_time["yesterday_stamp"],
"to": date_time["date_stamp"]
})
headers = {
'Authorization': 'Bearer Grafana的密钥',
'Content-Type': 'application/json'
}
response = requests.request("POST", "https://Grafana的id:3010/api/ds/query", headers=headers, data=payload,verify=False)
json_data = json.loads(response.text)
return gf_datatodict(json_data)
可以创建一个文件专门用来存Grafana需要用的查询语句,在脚本中导入即可:import rawSql,需要同目录下有rawSql.py文件
飞书官方有增删查改的示例和各种操作示例:https://github.com/larksuite/oapi-sdk-python/tree/v2_main/samples/api/bitable/v1
最后就可以放到服务器上,设置定时任务每天定时跑了。crontab -e编辑定时任务,定时格式是cron格式:
每分钟一次:* * * * * python3 /home/脚本地址
每天的凌晨 1 点执行一次:0 1 * * * python3 /home/脚本地址
每周的星期天凌晨 1 点执行一次:0 1 * * 0 python3 /home/脚本地址