自定义检测
要报告您的应用程序提供的事务的性能,请使用 Go 代理的 API。检测是指修改您的应用程序代码以报告
要报告这些,请使用 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.StartSpan 或 apm.StartSpan 启动跨度,前提是提供事务或包含事务的 context
。与事务类似,跨度具有名称和类型。跨度可以在同一事务中拥有父跨度。如果提供给 apm.StartSpan
的上下文包含跨度,则该跨度将被视为父跨度。有关更多详细信息,请参阅 上下文传播。
span, ctx := apm.StartSpan(ctx, "SELECT FROM foo", "db.mysql.query")
defer span.End()
Transaction.StartSpan
和 apm.StartSpan
始终会返回非 nil 的 Span
,即使事务为 nil 也是如此。始终可以安全地延迟调用跨度的 End 方法。如果设置跨度的上下文会产生显著开销,您可能希望先通过调用 Span.Dropped
方法检查跨度是否已被丢弃。
要恢复 panic 并与事务一起报告,请在恢复函数中使用 Tracer.Recovered 方法。还有报告非 panic 错误的方法:Tracer.NewError、Tracer.NewErrorLog 和 apm.CaptureError。
defer func() {
if v := recover(); v != nil {
e := apm.DefaultTracer().Recovered()
e.SetTransaction(tx)
e.Send()
}
}()
- or e.SetSpan(span)
有关其他方法的详细信息和示例,请参阅 错误 API。