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