2

为了登录我们的微服务应用程序,我们只需登录到 stdout/console,docker logging 驱动程序会处理并将这些日志重定向到某个地方,例如 gelf/logstash、fluentd 等。基本上,我们遵循12 个因素的日志记录指南。这意味着开发应用程序代码的开发人员不需要了解底层日志记录解决方案(例如 Elasticsearch、Graylog、Splunk 等)——这完全是一个操作/配置问题。理论上,我们应该能够在不更改任何代码的情况下更改底层日志记录解决方案。

我想要类似的痕迹,我的研究使我找到了 OpenTracing。开发人员不需要了解底层跟踪解决方案(例如 Jaeger、Zipkin、Elastic APM 等)和日志记录;理论上,我们应该能够在不更改任何代码的情况下更改底层跟踪解决方案。

我已经使用opentracing/opentracing-csharpjaegertracing/jaeger-client-csharp库成功地获得了一个 .NET 核心 POC 向 Jaeger 发送跟踪信息。

我仍在尝试完全了解 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;
   });
}
4

2 回答 2

3

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;
                });
            }
        });
    }
}

当您决定切换跟踪系统时 - 您需要创建另一个库,该库可以自动加载,并且不会触及目标微服务代码。

于 2019-08-05T20:23:09.110 回答
0

我认为这应该更新,现在我们有 ELlastic 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;
        }
    }
于 2021-09-18T19:20:10.293 回答