C# azure 应用程序洞察跟踪在 Linux 上不起作用

问题描述 投票:0回答:1

我正在尝试在应用程序洞察中获取开放的遥测跟踪。当我在 Windows 上运行代码(尝试过多个)时,一切正常,但每当代码在 Linux 上运行时(尝试过 docker alpine 和 VM ubuntu),微服务就无法正常启动。有时它会死掉,有时 6 分钟后它会正常启动并发送日志。没有显示日志,服务什么也不做。

有人知道如何解决这个问题以在 linux docker 中工作吗?

使用的框架版本.NET7

已安装的软件包:

        <PackageReference Include="Azure.Monitor.OpenTelemetry.AspNetCore" Version="1.0.0-beta.6" />
        <PackageReference Include="Npgsql.OpenTelemetry" Version="7.0.4" />
        <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.21.0" />

代码示例:

        services.AddOpenTelemetry().UseAzureMonitor(options => {
            options.ConnectionString = config.ApplicationInsights.ConnectionString;
            options.SamplingRatio = 0.1F;
        });
        
        services.ConfigureOpenTelemetryTracerProvider((sp, builder) => 
            builder.ConfigureResource(resourceBuilder => 
                    resourceBuilder.AddAttributes(new Dictionary<string, object> {
                        { "Service", config.MicroserviceName }
                    }))
                .AddNpgsql()
                .SetSampler(new AlwaysOnSampler()));
c# azure-application-insights
1个回答
0
投票

有人知道如何解决这个问题以在 linux docker 中工作吗?

  • 这是由于兼容性或配置问题导致微服务在 Linux 上的行为与 Windows 上不同。

这里我尝试通过以下步骤来实现上述要求:

创建了一个具有微服务配置的示例 dotnet 应用程序。

Startup.cs:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Azure.Monitor.OpenTelemetry.Exporter;
using OpenTelemetry.Trace;
using Microsoft.Extensions.Logging;

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

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            // Add Application Insights Telemetry
            services.AddApplicationInsightsTelemetry();

            // Add OpenTelemetry Tracing
            services.AddOpenTelemetryTracing((sp, builder) =>
            {
                builder
                    .AddAspNetCoreInstrumentation()
                    .AddHttpClientInstrumentation()
                    .AddNpgsqlInstrumentation()
                    .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(Configuration["MicroserviceName"]))
                    .AddAzureMonitorTraceExporter(config =>
                    {
                        config.ConnectionString = Configuration["ApplicationInsights:ConnectionString"];
                    });
            });
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logger)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            // Log an informational trace message
            logger.LogInformation("This is an informational trace log.");

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}
  • 上述应用程序将 OpenTelemetry 配置为从 ASP.NET Core 应用程序捕获跟踪和日志,并将其导出到 Azure Application Insights。

Dockerfile:

FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["SampleDotNetApp.csproj", "./"]
RUN dotnet restore "SampleDotNetApp.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "SampleDotNetApp.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "SampleDotNetApp.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SampleDotNetApp.dll"]

docker-compose.yml:在下面的文件中提供您的 AppInsight 连接字符串

version: '3.8'

services:
  mymicroservice:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - ApplicationInsights__InstrumentationKey= your_InstrumentationKey
      - ApplicationInsights__ConnectionString= your_ConnectionString
    ports:
      - "8080:80"

配置linux Docker:解决方案

enter image description here

enter image description here

Docker 状态:

enter image description here

运行状态: enter image description here

现在,我可以在这里看到发送到 Azure Application Insights 的生成的跟踪和日志。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.