加载中

自定义检测

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

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

要报告这些,请使用 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 始终会返回非 nil 的 Span,即使事务为 nil 也是如此。始终可以安全地延迟调用跨度的 End 方法。如果设置跨度的上下文会产生显著开销,您可能希望先通过调用 Span.Dropped 方法检查跨度是否已被丢弃。

要恢复 panic 并与事务一起报告,请在恢复函数中使用 Tracer.Recovered 方法。还有报告非 panic 错误的方法:Tracer.NewErrorTracer.NewErrorLogapm.CaptureError

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

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

© . All rights reserved.