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

Go APM捕获的错误无法显示在Elastic Kibana错误页如何解决?

问题描述

已完成Go应用对接Elastic Kibana 8.4版本APM的基础配置,Kibana>Observability>APM>Services>MyGoApp>Overview页面能正常展示数据,但进入Kibana>Observability>APM>Services>MyGoApp>Errors页面时,始终无错误数据显示。

我的Go代码如下:

package main

import (
        "errors"
        "fmt"
        "net/http"
        "github.com/gorilla/mux"
        "github.com/joho/godotenv"
        "go.elastic.co/apm"
        "go.elastic.co/apm/module/apmhttp/v2"
)

func main() {
        godotenv.Load()
        router := mux.NewRouter()
        router.HandleFunc("/", homePage)
        router.HandleFunc("/error", errorPage)
        http.ListenAndServe(":8080", apmhttp.Wrap(router))

}
func homePage(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Welcome to the HomePage!")
        fmt.Println("Endpoint Hit: homePage")
}
func errorPage(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Sending Error!")
        apm.CaptureError(r.Context(), errors.New("test error")).Send()
}

作为对比,Node.js使用CaptureError()方法可正常在Errors页面显示错误数据,Node.js代码如下:

var apm = require('elastic-apm-node').start({

  // Allowed characters: a-z, A-Z, 0-9, -, _, and space
  serviceName: 'app2',

  // Use if APM Server requires a secret token
  secretToken: 'testtoken',
  serverUrl: 'http url',
  verifyServerCert: false,
  environment: 'production'
})

const express = require('express')
const app = express()
const port = 3030

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.get('/error', (req, res) => {
  res.send('Send Err!')
  const err = new Error('Trigger Error!')

  apm.setTransactionName('/error')
  apm.captureError(err)
})

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})
问题原因与解决方法

核心原因

Go的APM客户端中,apm.CaptureError捕获的错误需要关联到活跃事务才能在Kibana Errors页面展示。你的代码虽用apmhttp.Wrap(router)自动创建事务,但调用CaptureError时,上下文里的事务可能已提前结束,或未正确绑定错误。

Node.js的APM客户端会自动将错误关联到当前活跃事务,而Go客户端需显式确保错误与事务绑定。

修复步骤

  1. 从请求上下文获取当前活跃事务;
  2. 通过事务的CaptureError方法捕获错误,确保错误与事务关联。

修改后的errorPage函数代码:

func errorPage(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Sending Error!")
        // 从请求上下文获取当前活跃事务
        tx := apm.TransactionFromContext(r.Context())
        if tx != nil {
                // 通过事务捕获错误,确保错误与事务关联
                tx.CaptureError(errors.New("test error")).Send()
        }
}

额外说明

  • 直接使用apm.CaptureError会生成"独立错误",不关联任何事务,Kibana Errors页面默认仅展示与事务关联的错误(可通过页面筛选器调整,但关联事务是更规范的做法);
  • 确保APM客户端环境变量配置正确(如ELASTIC_APM_SERVICE_NAME等),Overview能显示数据不代表事务元数据完整,错误关联依赖完整的事务元数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:20:30