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

在Grafana中合并Loki多行日志:关联reqId统计响应时间

用Loki关联Pino日志计算路径平均响应时间

解决方法

通过Loki的join语法,借助reqId把"incoming request"和"request completed"两类日志关联起来,就能同时拿到请求路径和响应时间,进而按路径聚合计算平均值。

具体LogQL写法

1. 关联日志获取匹配字段

先分别过滤两类日志并提取关键字段,再用join关联:

join reqId 
  (
    // 提取请求日志的reqId和路径
    {job="你的任务名"} |= "incoming request" | json | reqId,url=req.url
  ) 
  (
    // 提取完成日志的reqId和响应时间
    {job="你的任务名"} |= "request completed" | json | reqId,responseTime
  )

2. 按路径计算平均响应时间

在关联结果基础上,用时间范围聚合函数计算平均值:

avg_over_time(
  join reqId 
    (
      {job="你的任务名"} |= "incoming request" | json | reqId,url=req.url
    ) 
    (
      {job="你的任务名"} |= "request completed" | json | reqId,responseTime
    )
  [1h] // 替换为你需要的时间范围,比如[10m]、[1d]
) by (url)

处理动态路径参数

如果路径里有动态参数(比如示例中的6vYE9rpOPl),会导致相同逻辑的路径被拆分成不同分组,可以用正则替换统一格式:

join reqId 
  (
    {job="你的任务名"} |= "incoming request" | json | reqId,url=replace(req.url, `/api/v1/teams/[^/]+/members`, `/api/v1/teams/{teamId}/members`)
  ) 
  (
    {job="你的任务名"} |= "request completed" | json | reqId,responseTime
  )

注意点

  • 确保你的Loki版本在2.4及以上,join功能是这个版本才引入的
  • 两类日志中的reqId必须完全一致,不能有大小写、格式差异

内容的提问来源于stack exchange,提问作者hardillb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:39:40