OpenTelemetry API
编辑OpenTelemetry API编辑
Elastic APM Go 代理提供了一些包装器,用于与 OpenTelemetry API 进行交互。
通过 OpenTelemetry API 创建的跟踪和指标将被转换为等效的 Elastic APM。
初始化跟踪桥接器编辑
OpenTelemetry 跟踪桥接器作为跟踪提供程序实现。设置完成后,通过该提供程序创建的任何跨度都将设置在 Elastic 代理上。并且提供程序将尝试在上下文中查找任何现有事务。
注意:我们的跟踪提供程序桥接器是 OpenTelemetry SDK 的不完整实现。它是一个很好的解决方案,旨在帮助从我们的代理迁移到 OpenTelemetry,但不应被视为长期解决方案。
要设置此跟踪提供程序,您首先需要导入 apmotel
包。
import ( "go.elastic.co/apm/module/apmotel/v2" )
apmotel
包公开了一个 NewTracerProvider
方法,该方法返回 OpenTelemetry 跟踪提供程序的实现。
provider, err := apmotel.NewTracerProvider()
默认情况下,跟踪提供程序将查找默认的 apm 跟踪器。但您可以使用 apmotel.WithAPMTracer
参数选项指定自定义跟踪器。
获得此提供程序后,您可以将其配置为 OpenTelemetry SDK 实现,并正常使用 API。
import ( "go.elastic.co/apm/v2" "go.elastic.co/apm/module/apmotel/v2" "go.opentelemetry.io/otel" ) func main() { provider, err := apmotel.NewTracerProvider() if err != nil { log.Fatal(err) } otel.SetTracerProvider(provider) tracer := otel.GetTracerProvider().Tracer("example") // Start a new span to track some work, which will be sent to the Elastic APM tracer ctx, span := tracer.Start(context.Background(), "my_work") // Do something span.End() }
初始化指标导出器编辑
在 OpenTelemetry 将指标标记为 GA 之前,指标导出器处于技术预览版。
OpenTelemetry 指标桥接器作为手动读取器导出器实现。Elastic APM 代理将定期向 OpenTelemetry 请求其最新指标,并将其作为自己的指标发出。
要初始化此导出器,您首先需要导入 apmotel
包。
import ( "go.elastic.co/apm/module/apmotel" )
apmotel
包公开了一个 NewGatherer
方法,该方法返回 Elastic MetricsGatherer 和 OpenTelemetry metric.Reader 的实现。
exporter := apmotel.NewGatherer()
该方法允许传递一些选项,例如 WithAggregationSelector
,以指定自定义 OpenTelemetry 聚合选择器。
获得此导出器后,您可以配置 OpenTelemetry SDK 以便它报告发出的指标,以及配置 Elastic 代理以读取这些指标。
import ( "go.elastic.co/apm" "go.elastic.co/apm/module/apmotel" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/sdk/metric" ) func main() { exporter := apmotel.NewGatherer() // Configure OpenTelemetry provider := metric.NewMeterProvider(metric.WithReader(exporter)) otel.SetMeterProvider(provider) // Configure the Elastic APM apm.DefaultTracer().RegisterMetricsGatherer(exporter) // Record a metric with OpenTelemetry which will be exported to the Elastic Agent meter := provider.Meter("my_application") counter, _ := meter.Float64Counter("metric_called") counter.Add(context.TODO(), 1) }