在 .NET 中使用 Open Telemetry 进行跟踪

作者:微信公众号:【架构师老卢】
9-20 19:9
137

在处理微服务(例如我们的项目)时,我们使用的工具之一是 Tracing 工具。Jaeger 就是其中之一。在本文中,我将解释如何使用 Jaeger 进行跟踪,以及我们如何从手动跟踪中受益。让我们开始吧!

建筑

如您所见,我们有 3 项服务。他们始终使用 gRPC 或 Kafka 总线进行通信。Jaeger 的作用是,它跟踪正在进行的服务活动的情况。让我们深入研究代码!

Nuget 包

Open Telemetry nuget 包对我们的跟踪目的有很大帮助。

OpenTelemetry.Instrumentation.GrpcNetClient OpenTelemetry.Instrumentation.Http OpenTelemetry.Instrumentation.EntityFrameworkCore
OpenTelemetry.Instrumentation.AspNetCore
OpenTelemetry.Extensions.Hosting
OpenTelemetry.Exporter.Jaeger

具有 Instrumentation 命名空间的包包含要跟踪的字段,例如用于跟踪数据库调用的 EF Core。请记住,这些 Instrumentation 包是预发行的。现在让我们注册这些包。

builder.Services.AddOpenTelemetry()   
            .WithTracing(builder => builder   
                .AddAspNetCoreInstrumentation()   
                .AddJaegerExporter(  
                    o =>  
                    {  
                        o.AgentHost = this._configuration.GetValue<string>("JaegerHost"); //jaeger address in our appsettings  
                    })   
                .AddGrpcClientInstrumentation(o => o.SuppressDownstreamInstrumentation = true)  
                .AddHttpClientInstrumentation()   
                .AddEntityFrameworkCoreInstrumentation()  
                .AddSource("Supplier REST API") //a source name for jaeger to track  
                .SetResourceBuilder(ResourceBuilder.CreateDefault()   
                    .AddService(serviceName: "Supplier REST API"))

如您所见,我们已经注册了所有 Instrumentations 和 Jaeger Exporter。如果您的项目和 jaeger docker 镜像位于同一个 compose 文件中,则必须为 AgentHost 使用容器名称,否则它将是 localhost 作为默认值。这就是代码的全部内容,不是很棒吗?

jeager:  
    container_name: jeager  
    hostname: jeager  
    image: jaegertracing/all-in-one:1.49.0  
    environment:  
      - COLLECTOR_OTLP_ENABLED=true  
      - LOG_LEVEL=debug  
    ports:  
      - "16686:16686"  
      - "14268:14268"

Jaeger 用户界面

我们可以轻松访问 Jaeger UI 的 16686 端口并选择我们的服务或操作。

Jaeger 用户界面

现在,让我们调用身份验证端点,看看 Jaeger 中会发生什么

我们的登录端点的跟踪

我们可以清楚地看到被调用的终端节点时间来检查细节。

终端节点的跟踪详细信息

借助 OpenTelemetry.Instrumentation.EntityFrameworkCore 包,我们可以看到 EF Core 数据库调用的跟踪,例如 10.1.1.3:5432 是我的 PostgreSQL 数据库地址。

现在让我们混合起来,调用一个进行 gRPC 调用的端点!

OpenTelemetry.Instrumentation.GrpcNetClient 包确保我们看到 gRPC 调用的跟踪,在此示例中,我们可以看到名称 Proto 文件。我们甚至可以看到远程数据库调用的痕迹。

手动跟踪

手动跟踪允许我们测量代码块。例如,让我们查找创建随机 6 位 OTP 代码的区块的执行时间。

首先,我们必须创建一个 ActivitySource,其名称为我们在注册过程中给定的 SourceName。

private readonly IConnectionMultiplexer _connectionMultiplexer;  
private readonly IMediator _mediator;  
private static readonly ActivitySource _activitySource = new("Notification REST API");

现在,让我们使用 ActivitySource 创建一个活动。

string otpCode = string.Empty;  
          
     using (Activity? activity = _activitySource.StartActivity("RandomNumberGeneration"))  
      {  
            int[] otpCodeChars = new int[6];  
            for (int i = 0; i < 6; i++)  
            {  
                otpCodeChars[i] = new Random().Next(0, 9);  
            }  
            string generatedOtpCode = string.Join(string.Empty, otpCodeChars);  
            otpCode = generatedOtpCode;  
      }  

就是这样,现在让我们调用我们的终端节点并跟踪它。

我们可以清楚地看到我们的活动及其执行时间。在 Activities 的帮助下,您可以评估您想要查看的所有功能或流程!

在本文中,我们讨论了 OpenTelemetry 和 Jaeger。它确实有助于我们了解基于性能和时间的问题。

也许在下一篇文章中,我们可以讨论我们如何创建代理对象来跟踪我们所有的业务操作,以及如何使用简单的 annotation 来跟踪特定的类。

相关留言评论
昵称:
邮箱:
阅读排行