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客户端需显式确保错误与事务绑定。
修复步骤
- 从请求上下文获取当前活跃事务;
- 通过事务的
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
相关产品推荐
相关产品推荐

