OpenTelemetry 桥接编辑

Elastic .NET APM 代理中的 OpenTelemetry 桥接将 OpenTelemetry span 桥接到 Elastic APM 事务和 span。Elastic APM OpenTelemetry 桥接允许您使用供应商中立的 OpenTelemetry Tracing API 手动检测代码,并让 Elastic .NET APM 代理处理这些 API 调用。这意味着您可以使用 Elastic APM 代理进行跟踪,而无需通过使用 APM 代理自身的 公共 API 添加手动跟踪来锁定供应商。

入门编辑

OpenTelemetry 桥接是核心代理包 (Elastic.Apm) 的一部分,因此您无需添加额外的依赖项。

禁用 OpenTelemetry 桥接编辑

1.23.0 版本开始,OpenTelemetry 桥接默认启用。

这允许您通过 ActivitySourceStartActivity() 检测代码,而无需任何额外配置。

如果您想禁用桥接,可以通过 OpenTelemetryBridgeEnabled 配置设置禁用它。

如果您通过环境变量配置代理,请将 ELASTIC_APM_OPENTELEMETRY_BRIDGE_ENABLED 环境变量设置为 false

如果您通过 appsettings.json 文件配置代理,请将 ElasticApm:OpenTelemetryBridgeEnabled 设置为 false

{
  "ElasticApm":
    {
      "ServerUrl":  "http://myapmserver:8200",
      "SecretToken":  "apm-server-secret-token",
      "OpenTelemetryBridgeEnabled": false
    }
}

创建 ActivitySource 并启动 span编辑

您可以创建 OpenTelemetry span,或者用 .NET 术语来说,您可以通过活动源开始创建新的活动,代理将自动桥接这些 span。

public static void Sample()
{
	var src = new ActivitySource("Test");
	using var activity1 = src.StartActivity(nameof(Sample), ActivityKind.Server);
	Thread.Sleep(100);
	using var activity2 = src.StartActivity("foo");
	Thread.Sleep(150);
}

上面的代码片段创建了一个名为 Sample 的 span 和一个名为 fooSample 子 span。桥接将从 Sample 创建一个事务和一个名为 foo 的子 span。

混合使用 OpenTelemetry 和 Elastic APM 公共 API编辑

您还可以将 Activity API 与 公共 API 混合使用,OpenTelemetry 桥接将负责将 span 放置在正确的位置。这样做的好处是,如果您已经有一些通过 公共 API 检测的库,但希望将来使用独立于供应商的 OpenTelemetry API,则无需一次性替换所有公共 API 调用。

/// ElasticTransaction
/// -
/// ---> OTelSpan
///           -
///           ---> ElasticSpan

var src = new ActivitySource("Test");
tracer.CaptureTransaction( nameof(Sample4), "test", t =>
{
	Thread.Sleep(100);
	using (var activity = src.StartActivity("foo"))
	{
		tracer.CurrentSpan.CaptureSpan("ElasticApmSpan", "test", () => Thread.Sleep(50));
		Thread.Sleep(150);
	}
});

上面的代码片段使用 Elastic .NET APM 代理的 公共 API 创建了一个事务。然后,它创建了一个名为 foo 的活动;此活动将是先前创建的事务的子级。最后,再次使用 Elastic .NET APM 代理的 公共 API 创建一个 span;此 span 将是 OpenTelemetry span 的子 span。

当然,这些调用不必在同一个方法中。这里描述的概念适用于不同的方法、类型或库。

行李支持编辑

Elastic APM 代理还与 Activity.Baggage 集成。

以下示例使用上述 API 设置行李值

_activitySource.StartActivity("MyActivity")?.AddBaggage("foo", "bar");

Elastic APM 代理将根据 W3C 行李规范 自动传播此类值,并且 Activity.Baggage 会根据传入的 baggage 标头自动填充。

此外,代理还提供 BaggageToAttach 配置,以自动将 Activity.Baggage 中的值附加到捕获的事件。

支持的 OpenTelemetry 实现编辑

.NET 中的 OpenTelemetry 通过 Activity API 实现,并且有一个 OpenTelemetry shim 更接近 OpenTelemetry 规范。此 shim 构建在 Activity API 之上。

Elastic .NET APM 代理中的 OpenTelemetry 桥接面向 Activity API。由于 OpenTelemetry .NET shim 构建在 Activity API 之上,因此也隐式支持 shim,尽管我们没有直接对其进行测试,因为 Activity API 是 .NET 推荐的 OpenTelemetry API。

注意事项编辑

并非所有 OpenTelemetry API 功能都受支持。

指标编辑

此桥接仅支持跟踪 API。当前不支持指标 API。

Span 事件编辑

当前不支持 Span 事件 (Span#addEvent())。事件将被静默丢弃。

行李编辑

不支持在进程内部或外部 传播行李。行李项目将被静默丢弃。