在处理微服务(例如我们的项目)时,我们使用的工具之一是 Tracing 工具。Jaeger 就是其中之一。在本文中,我将解释如何使用 Jaeger 进行跟踪,以及我们如何从手动跟踪中受益。让我们开始吧!
如您所见,我们有 3 项服务。他们始终使用 gRPC 或 Kafka 总线进行通信。Jaeger 的作用是,它跟踪正在进行的服务活动的情况。让我们深入研究代码!
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 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 来跟踪特定的类。