簡體   English   中英

.NET 核心中的 OpenTracing 不依賴於特定的解決方案庫

[英]OpenTracing in .NET core without taking dependency on specific solution library

為了登錄我們的微服務應用程序,我們只需登錄到 stdout/console,docker 日志驅動程序處理這些日志並將這些日志重定向到某個地方,例如 gelf/logstash、fluentd 等。基本上,我們遵循12 因素准則進行日志記錄。 這意味着處理應用程序代碼的開發人員不需要了解有關底層日志記錄解決方案(例如 Elasticsearch、Graylog、Splunk 等)的任何信息——這完全是一個操作/配置問題。 從理論上講,我們應該能夠在不更改任何代碼的情況下更改底層日志記錄解決方案。

我想要類似的痕跡,我的研究使我使用了 OpenTracing。 開發人員不需要了解底層跟蹤解決方案(例如 Jaeger、Zipkin、Elastic APM 等)和日志記錄; 理論上,我們應該能夠在不更改任何代碼的情況下更改底層跟蹤解決方案。

我已經成功地使用opentracing/opentracing-csharpjaegertracing/jaeger-client-csharp庫將跟蹤發送到 Jaeger 的 .NET 核心 POC。

我仍在嘗試完全了解 OpenTracing,但我想知道是否有一種方法可以將跟蹤發送到符合 OpenTracing 的 API,而不必對特定解決方案(例如 Jaeger)(即 jaeger-client -csharp 庫)。 根據我的理解,OpenTracing 只是一個標准。 我不應該能夠在不需要 jaeger-client-csharp 庫的情況下使用一些采樣選項配置 OpenTracing 端點嗎? 還是 jaeger-client-csharp 實際上並不是 Jaeger 特定的,並且實際上可以將跟蹤發送到任何 OpenTracing API?

示例配置如下所示,它使用 jaeger 客戶端庫:

services.AddOpenTracing();

if (appSettings.TracerEnabled)
{
   services.AddSingleton(serviceProvider =>
   {
      var loggerFactory = new LoggerFactory();
      var config = Jaeger.Configuration.FromEnv(loggerFactory);

      var tracer = config.GetTracer();

      GlobalTracer.Register(tracer);

      return tracer;
   });
}

OpenTracing 是一組標准 API,可以一致地建模和描述分布式系統的行為

OpenTracing 沒有描述如何收集、報告、存儲或表示相互關聯的跟蹤和跨度的數據。 它是實現細節(例如jaegerwavefront )。

jaeger-client-csharp 是非常特定於 jaeger 的。 但是有一個例外,叫做zipkin ,它又不完全符合 OpenTracing,即使它有類似的術語。

如果你對opentracing-contrib/csharp-netcore 沒問題(希望你正在使用這個庫)那么如果你想實現“無代碼更改”(在目標微服務中)以配置跟蹤子系統,你應該使用一些插件模型。

好消息是 aspnetcore 有托管啟動程序集的概念,它允許您配置跟蹤系統。 因此,您可以擁有一些名為JaegerStartup庫,您將在其中實現 IHostedStartup,如下所示:

public class JaegerStartup : IHostingStartup
{
    public void Configure(IWebHostBuilder builder)
    {
        builder.ConfigureServices((ctx, services) =>
        {
            services.AddOpenTracing();

            if (ctx.Configuration.IsTracerEnabled()) // implement it by observing your section in configuration.
            {
                services.AddSingleton(serviceProvider =>
                {
                    var loggerFactory = new LoggerFactory();
                    var config = Jaeger.Configuration.FromEnv(loggerFactory);

                    var tracer = config.GetTracer();

                    GlobalTracer.Register(tracer);

                    return tracer;
                });
            }
        });
    }
}

當您決定切換跟蹤系統時-您需要創建另一個庫,該庫可以自動加載,並且不會觸及目標微服務代碼。

我認為這應該更新,現在我們有 ELastic APM 服務器支持的 Opentelemtry dirrect 以及 NetCore Activity 類中的 nativ 支持..

public static partial class ServiceExtension {

        public static IServiceCollection AddTelemerty(
            this IServiceCollection serviceCollection,
            IConfiguration Configuration, IWebHostEnvironment Environment) {

            serviceCollection.AddOpenTelemetryTracing((builder) => {
                // Sources
                builder.AddSource(Sources.DemoSource.Name);

                builder.SetResourceBuilder(ResourceBuilder
                  .CreateDefault()
                    //.AddAttributes( new List<KeyValuePair<String, object>> { 
                    //   new KeyValuePair<String, object>("SomeKey", "This is String Value")
                    //  })
                  .AddService(Environment.ApplicationName));

                builder.AddAspNetCoreInstrumentation(opts => {
                    opts.RecordException = true;
                });

                builder.AddElasticsearchClientInstrumentation();

                builder.AddSqlClientInstrumentation();

                builder.AddHttpClientInstrumentation(opts => opts.RecordException = true);

                if (Uri.TryCreate(Configuration.GetConnectionString("Jaeger"), UriKind.Absolute, out var uri)) {
                    builder.AddJaegerExporter(opts => {
                        opts.AgentHost = uri.Host;
                        opts.AgentPort = uri.Port;
                        opts.BatchExportProcessorOptions = new OpenTelemetry.BatchExportProcessorOptions<Activity>() {
                        };
                    });
                
                    // builder.AddZipkinExporter(opts => {
                    //     opts.Endpoint = new Uri("http://localhost:9412/api/v2/spans");
                    // });
                }
            });

            return serviceCollection;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM