我有一个 Razor Web 应用程序 (.NET 8) 客户端,我想获取执行指标和对其他 API 的调用
我安装了以下 nuget pkg:
在 Program.Main 中配置它
TracerProvider tracer = null;
try
{
...
app.MapRazorPages();
// using ResourceBuilder.CreateDefault has no effect, nor does moving init to top
tracer = Sdk.CreateTracerProviderBuilder()
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.SetResourceBuilder(ResourceBuilder.CreateEmpty())
.AddSource("test")
.AddConsoleExporter()
.Build();
app.Run();
}
finally
{
tracer?.Dispose();
}
我有一个服务,我需要调用一个我想要跟踪的 API。目前使用静态
ActivitySource
,但目标是为我的应用程序创建一个(或几个)并重复使用(不是每个类一个)
class MyService
{
private static readonly ActivitySource _source1= new ActivitySource("test");
async Task<HttpResponseMessage> MyMethod()
{
using var activity1 = _source1.StartActivity("action");
var source2 = new ActivitySource("test");
using var activity2 = source2.StartActivity("action");
...
}
}
我看到了
_source1
没有任何侦听器并且 activity1
为 nullsource2
有一个监听器,并且 activity2
是一个有效的对象我试图根据最佳实践仅构造一个 ActivitySource,但它不起作用。我的设置做错了什么或遗漏了什么?
更新:我发现使用依赖注入与
builder.Services.AddScoped<MyService>
会导致这个问题。如果我使用 AddSingleton
注册服务或不使用 di 则效果很好
要在 Web 应用程序中检测 OpenTelemetry HttpClient,请按照以下步骤操作:
安装必要的包:首先,您需要将 OpenTelemetry.Instrumentation.Http 包添加到您的项目中。该包提供了 HttpClient 和 HttpWebRequest 的工具。您可以使用 .NET CLI 并使用以下命令来添加它:
dotnet add package OpenTelemetry.Instrumentation.Http
此外,确保您安装了其他必要的 OpenTelemetry 软件包,例如导出器和您可能需要的任何其他工具 [2]。
在应用程序启动时启用 HTTP 检测:在应用程序的启动配置中,启用 HttpClient 检测。这可以通过将检测添加到 TracerProviderBuilder 或 MeterProviderBuilder 来完成,具体取决于您关注的是跟踪还是指标。对于跟踪,请使用 TracerProviderBuilder 上的
.AddHttpClientInstrumentation()
方法。对于指标,请使用 MeterProviderBuilder 上的 .AddHttpClientInstrumentation()
方法。这是痕迹的示例:
using OpenTelemetry;
using OpenTelemetry.Trace;
public class Program
{
public static void Main(string[] args)
{
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddHttpClientInstrumentation()
.AddConsoleExporter()
.Build();
}
}
对于指标:
using OpenTelemetry;
using OpenTelemetry.Metrics;
public class Program
{
public static void Main(string[] args)
{
using var meterProvider = Sdk.CreateMeterProviderBuilder()
.AddHttpClientInstrumentation()
.AddConsoleExporter()
.Build();
}
}
这些示例还包括用于演示目的的 OpenTelemetry Console Exporter,您可以将其替换为您首选的导出器 [2]。
过滤 HttpClient 请求(可选):如果需要过滤检测的 HttpClient 请求,可以使用
FilterHttpRequestMessage
选项。这允许您指定应检测请求的条件。例如,仅检测 GET 请求:
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddHttpClientInstrumentation(options => options.FilterHttpRequestMessage = httpRequestMessage =>
{
return httpRequestMessage.Method.Equals(HttpMethod.Get);
})
.AddConsoleExporter()
.Build();
此选项对于减少从 HttpClient 请求收集的遥测数据量很有用 [2]。
高级配置:对于 .NET 8.0 及更高版本,HttpClient 库内置了对遵循 OpenTelemetry 语义约定的指标的支持。您可以使用
.AddHttpClientInstrumentation()
通过一行代码启用所有内置指标。要对指标进行更精细的控制,您可以使用 .AddMeter()
上的
MeterProviderBuilder
扩展