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

如何将Elastic APM数据转发至KrakenD的Golang插件

在KrakenD Go插件中手动添加Elastic APM Span的解决方案

核心问题定位

你遇到的问题本质是请求上下文(Context)没有在KrakenD插件链路中正确传递,导致手动创建的Span无法关联到APM的主Transaction,最终无法上报到服务器。

具体实现步骤

  • 确保插件接收并传递原始请求上下文
    KrakenD的Go插件处理函数必须以context.Context作为第一个参数,并且在执行缓存等操作时,始终传递这个上下文,不能新建空白上下文。

  • 从上下文提取APM Transaction并创建Span
    使用APM官方包的apm.TransactionFromContext方法,从请求上下文中获取当前的Transaction实例,基于它创建Span并关联到链路中。示例代码:

    import "go.elastic.co/apm/v2"
    
    func CachePluginHandler(ctx context.Context, input interface{}) (interface{}, error) {
        // 从请求上下文获取APM事务
        tx := apm.TransactionFromContext(ctx)
        if tx == nil {
            // 可添加日志排查:上下文未携带APM事务信息
            return input, nil
        }
    
        // 启动缓存操作的Span,指定操作类型和类别
        span := tx.StartSpan("cache-get", "cache", apm.SpanOptions{Context: ctx})
        defer span.End() // 确保Span结束时上报
    
        // 执行你的缓存逻辑(示例:读取缓存)
        // cacheData, err := yourCacheClient.Get(ctx, cacheKey)
        // ...
    
        return input, nil
    }
    
  • 检查APM中间件挂载顺序
    确保apmgin.Middleware(r.cfg.Engine)是在KrakenD核心路由中间件之前挂载的。只有APM中间件先处理请求,才能把Transaction上下文注入到请求的Context中,后续插件才能获取到。

  • 禁止手动新建APM实例
    不要在插件中初始化新的APM Agent实例,必须复用全局初始化的Agent。手动新建的实例会脱离当前请求链路,导致Span无法关联到主Transaction,无法被上报。

  • 验证Span的End()调用
    必须通过defer span.End()确保Span在操作完成后被标记为结束,否则APM Agent会认为该Span未完成,不会发送到服务器。

额外排查点

  • 如果插件涉及异步操作,务必将请求上下文传递到异步任务中,否则异步任务内的Span无法关联到主Transaction。
  • 检查APM Agent的全局配置,确认Active为true,且服务器地址、token等参数配置正确,排除因配置错误导致的上报失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:32:35