.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.IsAllDataRequested 为 true 时调用。它包含创建的 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 阶段。