购物车服务

该服务负责维护用户所放入购物车中的商品。它与 Redis 缓存服务进行交互,以便快速访问购物车数据。

购物车服务源代码

注意 .NET 的 OpenTelemetry 使用 System.Diagnostic.DiagnosticSource 库作为其 API,而非标准的 OpenTelemetry Traces 和 Metrics API。 日志方面则使用 Microsoft.Extensions.Logging.Abstractions 库。

跟踪

初始化跟踪

OpenTelemetry 在 .NET 依赖注入容器中进行配置。使用 AddOpenTelemetry() 构建器方法来配置所需的仪表库,添加导出器并设置其他选项。对导出器和资源属性的配置是通过环境变量进行的。

Action<ResourceBuilder> appResourceBuilder =
    resource => resource
        .AddDetector(new ContainerResourceDetector());

builder.Services.AddOpenTelemetry()
    .ConfigureResource(appResourceBuilder)
    .WithTracing(tracerBuilder => tracerBuilder
        .AddRedisInstrumentation(
            cartStore.GetConnection(),
            options => options.SetVerboseDatabaseStatements = true)
        .AddAspNetCoreInstrumentation()
        .AddGrpcClientInstrumentation()
        .AddHttpClientInstrumentation()
        .AddOtlpExporter());

为自动仪表化的跟踪添加属性

在自动仪表化代码的执行过程中,您可以从上下文中获取当前跟踪(activity)。

var activity = Activity.Current;

使用活动对象上的 SetTag 方法向跟踪(activity)添加属性(在 .NET 中称为标签)。在 services/CartService.cs 文件的 AddItem 函数中,会向自动仪表化的跟踪添加多个属性。

activity?.SetTag("app.user.id", request.UserId);
activity?.SetTag("app.product.quantity", request.Item.Quantity);
activity?.SetTag("app.product.id", request.Item.ProductId);

添加跟踪事件

使用活动对象上的 AddEvent 方法即可添加跟踪(activity)事件。在 services/CartService.cs 文件的 GetCart 函数中,会添加一个跟踪事件。

activity?.AddEvent(new("Fetch cart"));

指标

初始化指标

和配置 OpenTelemetry 跟踪类似,.NET 依赖注入容器需要调用 AddOpenTelemetry()。该构建器配置所需的仪表库、导出器等。

Action<ResourceBuilder> appResourceBuilder =
    resource => resource
        .AddDetector(new ContainerResourceDetector());

builder.Services.AddOpenTelemetry()
    .ConfigureResource(appResourceBuilder)
    .WithMetrics(meterBuilder => meterBuilder
        .AddRuntimeInstrumentation()
        .AddAspNetCoreInstrumentation()
        .AddOtlpExporter());

日志

在 .NET 依赖注入容器的 LoggingBuilder 级别上调用 AddOpenTelemetry() 即可配置日志。该构建器配置所需的选项、导出器等。

builder.Logging
    .AddOpenTelemetry(options => options.AddOtlpExporter());
最后修改 December 13, 2023: improve glossary translation (46f8201b)