You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:36:23