gpt4 book ai didi

c# - Azure 应用服务从服务间请求中删除 Jaeger HTTP header

转载 作者:行者123 更新时间:2023-12-03 02:48:25 27 4
gpt4 key购买 nike

我正在设置一个概念验证,其中包含两个 ASP.NET Core 应用程序,这两个应用程序均使用 Jaeger 进行检测。演示它如何通过线路在服务之间传播跟踪。这两个应用程序都被部署到 Azure 应用服务。

我正在使用OpenTracing Contrib包以 HTTP header 的形式自动将 Jaeger 跟踪上下文注入(inject)到我的服务间流量中(该包被硬编码为使用这种传输形式)。但似乎这些 header 在整个过程中丢失了,因为接收应用程序无法恢复跟踪上下文。

在部署到 Azure 之前,我使用 Docker Compose 在本地测试应用程序,通过该设置,上下文传播工作正常。只有当应用程序进入 Azure 后,情况才会出现问题。

应用程序通过 HTTPS 进行通信,并且根据 this previous thread 中的答案,我已禁用 HSTS 和 HTTPS 重定向,以防可能导致 Azure 删除 header 。 .

我还尝试在 Azure 容器实例中运行这两个应用程序,但这似乎行不通 - 它没有修复上下文传播,而且似乎会引入更多有关跨度关系的错误。

这两个应用程序的设置几乎相同,仅在它们所服务的 API 端点上有所不同。

来自program.cs的我的CreateWebHostBuild:

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureServices(services =>
{
// Registers and starts Jaeger (see Shared.JaegerServiceCollectionExtensions)
services.AddJaeger(CheckoutConfiguration.JaegerSettings.Host);

// Enables OpenTracing instrumentation for ASP.NET Core, CoreFx, EF Core
services.AddOpenTracing();
});

AddJaeger扩展方法的内容很大程度上借鉴于the Contrib sample :

public static IServiceCollection AddJaeger(this IServiceCollection services, string jaegerHost = "localhost")
{
if (services == null)
throw new ArgumentNullException(nameof(services));

services.AddSingleton<ITracer>(serviceProvider =>
{
string serviceName = Assembly.GetEntryAssembly().GetName().Name;

ILoggerFactory loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();

ISampler sampler = new ConstSampler(sample: true);
var reporter = new RemoteReporter.Builder()
.WithSender(new UdpSender(jaegerHost, 6831, 0))
.Build();

ITracer tracer = new Tracer.Builder(serviceName)
.WithLoggerFactory(loggerFactory)
.WithReporter(reporter)
.WithSampler(sampler)
.Build();

GlobalTracer.Register(tracer);

return tracer;
});

var jaegerUri = new Uri($"http://{jaegerHost}:14268/api/traces");

// Prevent endless loops when OpenTracing is tracking HTTP requests to Jaeger.
services.Configure<HttpHandlerDiagnosticOptions>(options =>
{
options.IgnorePatterns.Add(request => jaegerUri.IsBaseOf(request.RequestUri));
// We don't need to track Prometheus scraping requests
});

services.Configure<AspNetCoreDiagnosticOptions>(options => {
// We don't need to trace Prometheus scraping requests
options.Hosting.IgnorePatterns.Add(context => context.Request.Path.Equals("/metrics", StringComparison.OrdinalIgnoreCase));
});

return services;
}

我的startup.cs配置方法显示我没有对标题做任何奇怪的事情(指标扩展适用于prometheus-net)

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHttpMetrics();

if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// Do release exception handling
}

app.UseMetricServer();

app.UseMvc();
}

我希望从一个应用程序到另一个应用程序的任何调用都会传播事件的 Jaeger 跟踪上下文。相反,这两个应用程序分别记录它们的痕迹,并且在 Jaeger UI 中无法辨别它们之间的链接。

这是应该跨越两个服务的跟踪的屏幕截图,但只显示第一个服务的跨度:

Broken trace

最佳答案

也许您应该检查您匆忙设置的应用程序服务是否与运行 Jaeger all-in-one 实例的虚拟机位于同一个 azure 资源组中,否则第二个应用程序可能无法与Jaeger 实例根本不存在。

关于c# - Azure 应用服务从服务间请求中删除 Jaeger HTTP header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57419866/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com