Grafana数据自动同步飞书文档-Python

一、使用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/脚本地址

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值