.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.IsAllDataRequested
为true
时,才会调用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自动化仪表化。