自定义检测编辑

要报告应用程序提供的交易的性能,请使用 Go 代理的 API。检测是指修改应用程序代码以报告

  • 交易 - 应用程序中的顶级操作,例如 HTTP 或 RPC 请求。
  • 交易中的跨度 - 交易中的操作,例如数据库查询或对另一个服务的请求。
  • 错误 - 可能指 Go 错误或恐慌。

要报告这些,请使用 apm.Tracer - 通常是 apm.DefaultTracer(),它通过环境变量配置。在下面的代码示例中,我们将引用 apm.DefaultTracer()。有关类型和方法的更详细描述,请参阅 API 文档

交易编辑

要报告交易,请使用交易名称和类型调用 apm.DefaultTracer().StartTransaction。这将返回一个 Transaction 对象;在调用其 End 方法以指示交易已完成之前,可以使用其他上下文自定义交易。一旦交易的 End 方法被调用,它将被排队以发送到 Elastic APM 服务器,并可供 APM 应用程序使用。

tx := apm.DefaultTracer().StartTransaction("GET /api/v1", "request")
defer tx.End()
...
tx.Result = "HTTP 2xx"
tx.Context.SetLabel("region", "us-east-1")

代理支持对交易进行采样:未采样的交易仍将被报告,但上下文有限,并且不包含任何跨度。要确定交易是否被采样,请使用 Transaction.Sampled 方法;如果它返回 false,则应避免为设置交易上下文而进行的任何不必要的存储或处理。

启动交易后,可以将其包含在 context 对象中,以便在整个应用程序中传播。有关更多详细信息,请参阅 上下文传播

ctx = apm.ContextWithTransaction(ctx, tx)

跨度编辑

要报告交易中的操作,请使用 Transaction.StartSpanapm.StartSpan 来启动跨度,分别提供交易或包含交易的 context。与交易类似,跨度也有名称和类型。跨度可以在同一交易中拥有父跨度。如果提供给 apm.StartSpan 的上下文包含跨度,则该跨度将被视为父跨度。有关更多详细信息,请参阅 上下文传播

span, ctx := apm.StartSpan(ctx, "SELECT FROM foo", "db.mysql.query")
defer span.End()

Transaction.StartSpanapm.StartSpan 将始终返回一个非空 Span,即使交易为空。始终可以安全地推迟对跨度的 End 方法的调用。如果设置跨度上下文会产生重大开销,则可能需要先检查跨度是否已丢弃,方法是调用 Span.Dropped 方法。

恐慌恢复和错误编辑

要恢复恐慌并将其与交易一起报告,请在恢复函数中使用 Tracer.Recovered 方法。还有一些方法可以报告非恐慌错误:Tracer.NewErrorTracer.NewErrorLogapm.CaptureError

defer func() {
	if v := recover(); v != nil {
		e := apm.DefaultTracer().Recovered()
		e.SetTransaction(tx) // or e.SetSpan(span)
		e.Send()
	}
}()

有关其他方法的详细信息和示例,请参阅 错误 API