.NET Framework 遥测配置

OpenTelemetry 支持 .NET.NET Framework(一个较旧的基于 Windows 的 .NET 实现)。

如果您已在使用现代、跨平台的 .NET 实现,则可以跳过本文档。

ASP.NET 初始化

ASP.NET 的初始化方式与 ASP.NET Core 略有不同。

首先,安装以下 NuGet 包

接下来,修改您的 Web.Config 文件以添加一个必需的 HttpModule

<system.webServer>
    <modules>
        <add
            name="TelemetryHttpModule"
            type="OpenTelemetry.Instrumentation.AspNet.TelemetryHttpModule,
                OpenTelemetry.Instrumentation.AspNet.TelemetryHttpModule"
            preCondition="integratedMode,managedHandler" />
    </modules>
</system.webServer>

最后,在您的 Global.asax.cs 文件中初始化 ASP.NET 遥测,并进行其他 OpenTelemetry 初始化

using OpenTelemetry;
using OpenTelemetry.Trace;

public class WebApiApplication : HttpApplication
{
    private TracerProvider _tracerProvider;

    protected void Application_Start()
    {
        _tracerProvider = Sdk.CreateTracerProviderBuilder()
            .AddAspNetInstrumentation()

            // Other configuration, like adding an exporter and setting resources
            .AddConsoleExporter()
            .AddSource("my-service-name")
            .SetResourceBuilder(
                ResourceBuilder.CreateDefault()
                    .AddService(serviceName: "my-service-name", serviceVersion: "1.0.0"))

            .Build();
    }

    protected void Application_End()
    {
        _tracerProvider?.Dispose();
    }
}

高级 ASP.NET 配置

ASP.NET 遥测可以进行配置以更改默认行为。

过滤

ASP.NET 遥测默认会收集所有传入的 HTTP 请求。但是,您可以使用 AspNetInstrumentationOptions 中的 Filter 方法来过滤传入的请求。这类似于 LINQ 的 Where 子句,只有满足条件的请求才会被收集。

以下代码片段展示了如何使用 Filter 来仅允许 GET 请求。

this.tracerProvider = Sdk.CreateTracerProviderBuilder()
    .AddAspNetInstrumentation(
        (options) => options.Filter =
            (httpContext) =>
            {
                // only collect telemetry about HTTP GET requests
                return httpContext.Request.HttpMethod.Equals("GET");
            })
    .Build();

过滤发生在早期阶段,并且与 采样 不同,采样发生在数据收集之后。过滤将限制最开始被收集的内容。

丰富

如果您希望将某些数据添加到 OpenTelemetry 生成的每个 Activity 中,可以使用 Enrich 方法。

Enrich 操作仅在 activity.IsAllDataRequestedtrue 时调用。它包含创建的 Activity、事件名称以及原始对象。

以下代码片段展示了如何使用 Enrich 添加额外的标签。

this.tracerProvider = Sdk.CreateTracerProviderBuilder()
    .AddAspNetInstrumentation((options) => options.Enrich
        = (activity, eventName, rawObject) =>
    {
        if (eventName.Equals("OnStartActivity"))
        {
            if (rawObject is HttpRequest httpRequest)
            {
                activity?.SetTag("physicalPath", httpRequest.PhysicalPath);
            }
        }
        else if (eventName.Equals("OnStopActivity"))
        {
            if (rawObject is HttpResponse httpResponse)
            {
                activity?.SetTag("responseType", httpResponse.ContentType);
            }
        }
    })
    .Build();

有关更普遍地注释跟踪数据的更多信息,请参阅 为 Activity 添加标签

RecordException

如果抛出未处理的异常,ASP.NET 遥测会自动将给定的 Activity 的状态设置为 Error

您还可以将 RecordException 属性设置为 true,这将作为 ActivityEvent 将异常存储在 Activity 本身中。

下一步

在通过遥测库自动生成可观测性数据后,您可能希望添加 手动遥测 来收集自定义遥测数据。

您还需要配置适当的导出器,以便将 遥测数据导出到一个或多个遥测后端。

您还可以查看 .NET 自动遥测,该功能目前处于 Beta 阶段。