OpenTelemetry API
编辑OpenTelemetry API
编辑Elastic APM Go Agent 提供了与 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 Agent 将定期向 OpenTelemetry 请求其最新的指标,并将其作为自己的指标发出。
要初始化此导出器,首先需要导入 apmotel
包。
import ( "go.elastic.co/apm/module/apmotel" )
apmotel
包公开了一个 NewGatherer
方法,该方法同时返回 Elastic MetricsGatherer 和 OpenTelemetry metric.Reader 的实现。
exporter := apmotel.NewGatherer()
该方法允许传递一些选项,例如 WithAggregationSelector
,以指定自定义 OpenTelemetry 聚合选择器。
获得此导出器后,您可以配置 OpenTelemetry SDK 以报告发出的指标,以及 Elastic Agent 以读取这些指标。
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) }