在本地运行aspire-dashboard (aspire.net)
背景:
在试用 aspire.net 时,看到官方文档提供了一个 “独立模式”的使用方式使用 aspire 仪表盘(独立 .NET.NET Aspire 仪表板 - .NET Aspire | Microsoft Learn),但是这个用法是通过docker 方式运行了。然而本机又不太适合跑docker(或者我就是不想通过docker跑)。于是想办法实现本地启用 。
分析
在本地创建了一个 aspire.net 的“入门应用”,即可得到官方的应用demo。其中本就包含了 仪表盘 功能,看着跟官方提供的docker 运行起来的平台类似。这样看来,官方提供的镜像应该也只是一个空的 aspire host 的打包 。那么如果将数据推送到该入门aspire host 接口,按理就可以展示跟踪数据。
尝试
创建了 aspire 入门 演示程序运行后,发现没有启动数据接入的端口,后面看了文档中的配置 (.NET .NET Aspire 仪表板配置 - .NET Aspire | Microsoft Learn),翻看 host 的启动配置,增加了几个配置后,就可以接受数据。
实现
aspire-dashboard host
通过 创建项目 模板创建一个 aspire.net 空项目。
在 launchSettings.json 配置增加以下配置:
"DOTNET_DASHBOARD_OTLP_HTTP_ENDPOINT_URL": "http://localhost:4317",
"DOTNET_DASHBOARD_UNSECURED_ALLOW_ANONYMOUS": "true",
"DOTNET_ASPIRE_SHOW_DASHBOARD_RESOURCES": "true",
"ASPIRE_ALLOW_UNSECURED_TRANSPORT": "true"
在自己的项目通过 OpenTelemetry 将以http方式将数据推送到 DOTNET_DASHBOARD_OTLP_HTTP_ENDPOINT_URL 即可。
依赖项配置:
<PackageReference Include="OpenTelemetry.Api.ProviderBuilderExtensions" Version="1.11.1" />
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.11.1" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.11.1" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.11.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.11.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.11.0-beta.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.11.0" />
服务配置
var otel = services.AddOpenTelemetry();
// Add Tracing for ASP.NET Core and our custom ActivitySource and export via OTLP
otel.WithTracing(tracing =>
{
tracing.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("WorkFlowCore.Host"));
tracing.AddSource(WorkflowActivitySource.SourceName);
tracing.AddAspNetCoreInstrumentation(opt =>
{
opt.EnrichWithHttpRequest = (act, req) =>
{
if (string.IsNullOrEmpty(act.ParentId))
{
act.DisplayName = req.Path;
}
};
opt.Filter = context =>
{
return context.Request.Path.ToString().StartsWith("/api/");
};
});
tracing.AddHttpClientInstrumentation(opt =>
{
opt.EnrichWithHttpWebRequest = (act, req) =>
{
act.DisplayName = req.RequestUri.AbsolutePath;
};
opt.EnrichWithHttpRequestMessage = (act, req) =>
{
act.DisplayName = req.RequestUri.AbsolutePath;
};
});
#if DEBUG
tracing.AddEntityFrameworkCoreInstrumentation(options =>
{
options.SetDbStatementForText = true; // 将 SQL 文本设置为 db.statement 标签
options.EnrichWithIDbCommand = (activity, command) =>
{
// 添加自定义标签(例如数据库类型)
activity.SetTag("db.system", command.Connection?.Database ?? "unknown");
};
});
//tracing.AddConsoleExporter();//控制台输出
#endif
});
// Export OpenTelemetry data via OTLP, using env vars for the configuration
// Export OpenTelemetry data via OTLP, using env vars for the configuration
otel.UseOtlpExporter(OpenTelemetry.Exporter.OtlpExportProtocol.HttpProtobuf, new Uri("http://localhost:4317"));


浙公网安备 33010602011771号