没有 ASP 的 Opentracing c#?

Opentracing c# without ASP?

这里我有点疑惑。但是你不应该能够在不涉及 ASP 的情况下启动基于 c# 的 Opentracing 客户端吗?许多示例总是以某种形式涉及 ASP。这个不用ASP能解决吗?

ASP.NET 不需要核心。几乎所有示例都使用 ASP.NET Core 的原因是,这就是 OpenTelemetry(及其前身 OpenTracing 和 OpenCensus)的用途——为(微)服务提供分布式跟踪、日志记录和指标。在绝大多数情况下,这些服务使用 HTTP 和 gRPC,即使它只是为了公开一个控制端点。

在 OpenTelemetry 中,applications/services 发布日志、跟踪和指标。这些可以通过导出器发布到 Jaeger、Zipkin、Elastic、Prometheus 等,或者最好由收集器实例收集,该实例再次通过导出器将它们转发到监控服务。

OpenTelemetry .NET repo explains how OpenTelemetry is used in .NET Core through the native Activity and ActivitySource classes and listeners. It contains a folder with Console examples.

日志记录

Logging Getting Started page 根本没有提到 ASP.NET 核心,它显示了一个控制台应用程序。代码只是:

using Microsoft.Extensions.Logging;
using OpenTelemetry.Logs;

public class Program
{
    public static void Main()
    {
        using var loggerFactory = LoggerFactory.Create(builder =>
        {
            builder.AddOpenTelemetry(options => options
                .AddConsoleExporter());
        });

        var logger = loggerFactory.CreateLogger<Program>();
        logger.LogInformation("Hello from {name} {price}.", "tomato", 2.99);
    }
}

在 .NET 6 中,这将归结为:

using Microsoft.Extensions.Logging;
using OpenTelemetry.Logs;

using var loggerFactory = LoggerFactory.Create(builder =>
{
builder.AddOpenTelemetry(options => options
                .AddConsoleExporter());
});

var logger = loggerFactory.CreateLogger<Program>();
logger.LogInformation("Hello from {name} {price}.", "tomato", 2.99);

对于日志记录,OpenTelemetry 通过 .NET Core 日志记录接口工作。如果您使用 ILogger,您已经可以使用 OpenTelemetry。

追踪

Tracing Getting Started 页面还使用控制台应用程序并使用内置的 ActivitySource 和 Activity 类.

  • ActivitySource对应一个OpenTelemetry Tracer
  • Activity对应Span

示例是一个非常短的控制台应用程序:

using System.Diagnostics;
using OpenTelemetry;
using OpenTelemetry.Trace;

public class Program
{
    private static readonly ActivitySource MyActivitySource = new ActivitySource(
        "MyCompany.MyProduct.MyLibrary");

    public static void Main()
    {
        using var tracerProvider = Sdk.CreateTracerProviderBuilder()
            .SetSampler(new AlwaysOnSampler())
            .AddSource("MyCompany.MyProduct.MyLibrary")
            .AddConsoleExporter()
            .Build();

        using (var activity = MyActivitySource.StartActivity("SayHello"))
        {
            activity?.SetTag("foo", 1);
            activity?.SetTag("bar", "Hello, World!");
            activity?.SetTag("baz", new int[] { 1, 2, 3 });
        }
    }
}

再次重申,唯一特定于 OpenTelemetry 的是侦听器和导出器。