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 MetricsGathererOpenTelemetry 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)
}