在 Web 应用程序上检测 OpenTelemetry HttpClient 的正确方法

问题描述 投票:0回答:1

我有一个 Razor Web 应用程序 (.NET 8) 客户端,我想获取执行指标和对其他 API 的调用

我安装了以下 nuget pkg:

  • 开放遥测
  • OpenTelemetry.Exporter.Console
  • OpenTelemetry.Instrumentation.AspNetCore
  • OpenTelemetry.Instrumentation.Http

在 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");
        ...
    }
}

我看到了

  1. _source1
    没有任何侦听器并且
    activity1
    为 null
  2. source2
    有一个监听器,并且
    activity2
    是一个有效的对象

我试图根据最佳实践仅构造一个 ActivitySource,但它不起作用。我的设置做错了什么或遗漏了什么?

更新:我发现使用依赖注入与

builder.Services.AddScoped<MyService>
会导致这个问题。如果我使用
AddSingleton
注册服务或不使用 di

则效果很好
c# asp.net razor-pages open-telemetry
1个回答
-2
投票

要在 Web 应用程序中检测 OpenTelemetry HttpClient,请按照以下步骤操作:

  1. 安装必要的包:首先,您需要将 OpenTelemetry.Instrumentation.Http 包添加到您的项目中。该包提供了 HttpClient 和 HttpWebRequest 的工具。您可以使用 .NET CLI 并使用以下命令来添加它:

    dotnet add package OpenTelemetry.Instrumentation.Http
    

    此外,确保您安装了其他必要的 OpenTelemetry 软件包,例如导出器和您可能需要的任何其他工具 [2]。

  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]。

  3. 过滤 HttpClient 请求(可选):如果需要过滤检测的 HttpClient 请求,可以使用

    FilterHttpRequestMessage
    选项。这允许您指定应检测请求的条件。例如,仅检测 GET 请求:

    using var tracerProvider = Sdk.CreateTracerProviderBuilder()
        .AddHttpClientInstrumentation(options => options.FilterHttpRequestMessage = httpRequestMessage =>
        {
            return httpRequestMessage.Method.Equals(HttpMethod.Get);
        })
        .AddConsoleExporter()
        .Build();
    

    此选项对于减少从 HttpClient 请求收集的遥测数据量很有用 [2]。

  4. 高级配置:对于 .NET 8.0 及更高版本,HttpClient 库内置了对遵循 OpenTelemetry 语义约定的指标的支持。您可以使用

    .AddHttpClientInstrumentation()
    通过一行代码启用所有内置指标。要对指标进行更精细的控制,您可以使用
    .AddMeter()
     上的 
    MeterProviderBuilder

    扩展
© www.soinside.com 2019 - 2024. All rights reserved.