【问题标题】:Connecting to remote Jaegertracing with C# .Net Core使用 C# .Net Core 连接到远程 Jaegertracing
【发布时间】:2020-07-12 10:20:12
【问题描述】:

在涉及 C# 时,我在 Opentracing 和 Jaegertracing 方面遇到了一些问题。我以前有过这个工作,但使用的是 Java 项目。所以我开始想知道在 C# .NET Core Web 服务方面我缺少什么。

这是我的课程,开始使用我的追踪器

    public static class MyTracer
    {
        public static ITracer tracer = null;

        public static ITracer InitTracer()
        {
            Environment.SetEnvironmentVariable("JAEGER_SERVICE_NAME", "my-store");
            Environment.SetEnvironmentVariable("JAEGER_AGENT_HOST", "192.168.2.27");
            Environment.SetEnvironmentVariable("JAEGER_AGENT_PORT", "6831");
            Environment.SetEnvironmentVariable("JAEGER_SAMPLER_TYPE", "const");                     
            Environment.SetEnvironmentVariable("JAEGER_REPORTER_LOG_SPANS", "false");
            Environment.SetEnvironmentVariable("JAEGER_SAMPLER_PARAM","1");
            Environment.SetEnvironmentVariable("JAEGER_SAMPLER_MANAGER_HOST_PORT", "5778");
            Environment.SetEnvironmentVariable("JAEGER_REPORTER_FLUSH_INTERVAL" , "1000");
            Environment.SetEnvironmentVariable("JAEGER_REPORTER_MAX_QUEUE_SIZE" , "100");


            var loggerFactory = new LoggerFactory();

            var config = Configuration.FromEnv(loggerFactory);

            tracer = config.GetTracer();

            if (!GlobalTracer.IsRegistered())
            {
                GlobalTracer.Register(tracer);
            }
            return tracer;
        }
    }

应该向 Jaeger 代理和收集器报告以在 UI 中显示的控制器代码。

[Route("api/[controller]")]
[ApiController]
public class ComponentController : ControllerBase
{
    private readonly ITracer tracer;

    public ComponentController(ITracer tracer)
    {
        this.tracer = tracer;
    }

    /// <summary>
    /// Get component by ID
    /// </summary>
    /// <returns></returns>
    [HttpGet("GetComponent")]
    public ActionResult<ComponentModel> GetComponent(string id)
    {   
        var builder = tracer.BuildSpan("operationName");            
        var span = builder.Start();
        // Set some context data
        span.Log("Getting data");
        span.SetTag(Tags.SpanKind, "Getting data request");
        span.Finish();                     

        ComponentModel component = ComponentManager.GetComponent(id);    

        return component;
    }


}

Startup.cs

    public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();

        // Use "OpenTracing.Contrib.NetCore" to automatically generate spans for ASP.NET Core, Entity Framework Core, ...
        // See https://github.com/opentracing-contrib/csharp-netcore for details.
        services.AddOpenTracing();

        //Init tracer
        services.AddSingleton<ITracer>(t => MyTracer.InitTracer());

        services.AddHealthChecks();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseHttpsRedirection();
        app.UseRouting();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

但这根本不起作用。为了让它与远程服务器一起工作,我在这里缺少什么?

【问题讨论】:

    标签: c# .net-core jaeger opentracing


    【解决方案1】:

    终于找到了解决办法。这似乎与记者的启动方式有关。不管怎样,我把我的追踪器类改成了这个。

        public static class MyTracer
    {
        public static ITracer tracer = null;
        public static ITracer InitTracer(IServiceProvider serviceProvider)
        {
            string serviceName = serviceProvider.GetRequiredService<IHostingEnvironment>().ApplicationName;
    
            Environment.SetEnvironmentVariable("JAEGER_SERVICE_NAME", "my-store");
            //Environment.SetEnvironmentVariable("JAEGER_AGENT_HOST", "192.168.2.27");
            //Environment.SetEnvironmentVariable("JAEGER_AGENT_PORT", "6831");
            //Environment.SetEnvironmentVariable("JAEGER_SAMPLER_TYPE", "const");                     
            //Environment.SetEnvironmentVariable("JAEGER_REPORTER_LOG_SPANS", "false");
            //Environment.SetEnvironmentVariable("JAEGER_SAMPLER_PARAM","1");
            //Environment.SetEnvironmentVariable("JAEGER_SAMPLER_MANAGER_HOST_PORT", "5778");
            //Environment.SetEnvironmentVariable("JAEGER_REPORTER_FLUSH_INTERVAL" , "1000");
            //Environment.SetEnvironmentVariable("JAEGER_REPORTER_MAX_QUEUE_SIZE" , "100");
            //application - server - id = server - x
    
            var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
    
            var sampler = new ConstSampler(sample: true);
            var reporter = new RemoteReporter.Builder()
             .WithLoggerFactory(loggerFactory)
             .WithSender(new UdpSender("192.168.2.27", 6831, 0))
             .Build();
    
            tracer = new Tracer.Builder(serviceName)
             .WithLoggerFactory(loggerFactory)
             .WithSampler(sampler)
             .WithReporter(reporter)
             .Build();
    
            if (!GlobalTracer.IsRegistered())
            {
                GlobalTracer.Register(tracer);
            }
            return tracer;
        }
    }
    

    我知道现在这里有几个不活跃的变量。看看它们是否仍然可以使用一些方法。但是现在不需要任何东西来让它滚动。 希望这可以帮助其他人尝试让 .NET Core 与远程 Jeagertracing 服务器一起正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      相关资源
      最近更新 更多