.NET Framework仪表配置

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

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

ASP.NET初始化

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

首先,安装以下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()

            // 其他配置,如添加导出器和设置资源
            .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) =>
            {
                // 仅收集关于HTTP GET请求的遥测
                return httpContext.Request.HttpMethod.Equals("GET");
            })
    .Build();

过滤操作在早期阶段发生,与之后收集数据的采样不同。过滤将限制首次收集的内容。

Enrich

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

只有在activity.IsAllDataRequestedtrue时,才会调用Enrich操作。它包含创建的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本身上。

后续步骤

在使用仪表化库自动生成的可观察性之后,您可能希望添加手动仪表化来收集自定义遥测数据。

您还需要配置适当的导出器,将您的遥测数据导出到一个或多个遥测后端,详细信息请参见导出您的遥测数据

您还可以查看目前处于Beta版的.NET自动化仪表化

最后修改 December 10, 2023: translate (a4350d6e)