自定义检测

编辑

要报告应用程序提供的交易的性能,请使用 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