Grafana查询中如何将所选时间范围传递至自定义后端接口
Grafana JSON API 数据源时间范围联动实现方案
你之前遇到的Failed to decode JSON object报错,核心原因是JSON API数据源默认不会自动把时间范围参数塞进POST请求的JSON Body,直接调用request.get_json()会拿到空值,自然触发JSON解码失败,和后端解析逻辑本身无关。
方案1:通过内置时间变量拼URL传参(最推荐,配置成本最低)
你提到的${__from}、${__to}是Grafana官方提供的全局内置时间变量,完全可以直接用来传递选中的时间范围:
- 变量说明:
${__from}:当前选中时间范围的起始毫秒级时间戳${__to}:当前选中时间范围的结束毫秒级时间戳- 如需格式化时间字符串,可以用格式化语法,比如
${__from:date:YYYY-MM-DD HH:mm:ss}会直接输出对应格式的可读时间,省去后端转码步骤
- 配置方式:在JSON API数据源的查询路径栏直接拼接参数即可,例如填写
/query?start=${__from}&end=${__to},Grafana发起请求时会自动把变量替换为当前时间选择器的实际值 - 后端适配代码参考:
from flask import request, jsonify @app.route('/query', methods=['GET']) def query(): # 从URL查询参数读取时间值,转成对应格式 start_ts = int(request.args.get('start')) end_ts = int(request.args.get('end')) # 如果你的数据库使用秒级时间戳,记得做单位转换 # start_ts = start_ts // 1000 # end_ts = end_ts // 1000 result = get_from_database((start_ts, end_ts)) return jsonify(result)
方案2:通过POST请求体传递时间参数
如果你坚持要用POST方式传参,需要手动在JSON API数据源的请求体配置中显式引用时间变量,数据源不会自动注入这部分内容:
- 在数据源的POST Body配置栏填写自定义结构,例如:
{ "time_range": { "start": "${__from}", "end": "${__to}" } }
- 后端读取时按照你自定义的结构取值即可,不要额外套不存在的
request层级,参考代码:
from flask import request, jsonify @app.route('/query', methods=['POST']) def query(): req_data = request.get_json() start_ts = int(req_data['time_range']['start']) end_ts = int(req_data['time_range']['end']) result = get_from_database((start_ts, end_ts)) return jsonify(result)
注意:JSON API数据源和Grafana原生时序类数据源的传参逻辑不同,不会默认在请求中携带时间范围、面板间隔这类动态参数,所有需要联动的动态值都必须手动通过内置变量拼接在URL或请求体中。
内容的提问来源于stack exchange,提问作者veoli
相关产品推荐
相关产品推荐

