我正在尝试在应用程序洞察中获取开放的遥测跟踪。当我在 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()));
有人知道如何解决这个问题以在 linux docker 中工作吗?
这里我尝试通过以下步骤来实现上述要求:
创建了一个具有微服务配置的示例 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();
});
}
}
}
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:解决方案
Docker 状态:
运行状态:
现在,我可以在这里看到发送到 Azure Application Insights 的生成的跟踪和日志。