使用 aspire-dashboard 展示 open-telemetry trace/logging/metrics
Intro
前段有一些项目集成了 open telemetry 但是本地不能很好的查看 trace 数据,于是就尝试了一下 dotnet aspire-board,aspire dashboard 可以比较方便地在本地进行使用,在本地查看 trace 数据,也可以将 log 和 metrics 也导出到 aspire dashboard
What
.NET Aspire 仪表板提供了出色的用户界面,可用于查看遥测数据。
仪表板:
以容器映像形式提供,可与任何支持 OpenTelemetry 的应用程序一起使用。 可以独立使用,无需 .NET Aspire 的其余部分。
NET Aspire 仪表板是一个基于浏览器的应用程序,用于查看有关分布式应用程序的运行时信息。
仪表板展示的内容包括:
组成您的应用程序的资源,例如 .NET 项目、可执行文件和容器。资源的实时控制台日志。实时遥测数据,如结构化日志、跟踪和指标。
遥测数据是存储在内存中的,为了避免过度消耗内存,仪表板对存储的遥测数据的数量和大小设置了限制。
当达到数量限制时,会添加新的遥测数据并删除最旧的遥测数据。当达到大小限制时,数据会被截断到限制值。
Dashboard:TelemetryLimits:MaxLogCount
指定最大日志条目数量,默认为10,000。Dashboard:TelemetryLimits:MaxTraceCount
指定最大追踪条数,默认为10,000。Dashboard:TelemetryLimits:MaxMetricsCount
指定最大指标数据点数量,默认为50,000。Dashboard:TelemetryLimits:MaxAttributeCount
指定遥测数据上最大属性数量,默认为128。Dashboard:TelemetryLimits:MaxAttributeLength
指定属性最大长度,默认为无限制。Dashboard:TelemetryLimits:MaxSpanEventCount
指定跨度属性上的最大事件数量,默认为无限制。这些限制是按资源计算的。例如,MaxLogCount
的值为10,000时,配置仪表板每个资源存储的日志条目可达10,000。
Sample
可以使用 docker/podman 来创建一个 aspire-dashboard:
docker run --rm -p 18888:18888 -p 4317:18889 -d --name aspire-dashboard -e DOTNET_DASHBOARD_UNSECURED_ALLOW_ANONYMOUS="true" mcr.microsoft.com/dotnet/aspire-dashboard:8.2
或
podman run --rm -p 18888:18888 -p 4317:18889 -d --name aspire-dashboard -e DOTNET_DASHBOARD_UNSECURED_ALLOW_ANONYMOUS="true" mcr.microsoft.com/dotnet/aspire-dashboard:8.2
这里指定了两个端口一个是 18888 是 dashboard http 的端口,另外一个端口是 4317:18889,4317 是默认 open telemetry protocol API 的端口,容器里默认用了 18889 端口来提供 OTLP
sample code:
builder.Logging.AddOpenTelemetry(x =>
{
x.IncludeFormattedMessage = true;
x.IncludeScopes = true;
});
if (!double.TryParse(builder.Configuration["OpenTelemetry:SamplingRatio"], out var samplingRatio))
{
samplingRatio = 1.0;
}
builder.Services.AddOpenTelemetry()
.ConfigureResource(resBuilder =>
{
resBuilder.AddService(builder.Configuration["OpenTelemetry:ServiceId"] ?? "SparkTodo-api");
})
.WithTracing(traceBuilder =>
{
traceBuilder.AddAspNetCoreInstrumentation()
.AddEntityFrameworkCoreInstrumentation()
.SetSampler(new TraceIdRatioBasedSampler(samplingRatio))
;
})
.WithMetrics(metricBuilder => metricBuilder
.AddRuntimeInstrumentation()
.AddAspNetCoreInstrumentation()
)
.UseOtlpExporter()
;
上述代码会将 log/trace/metrics 数据自动导出到 aspire
Trace 关联的 logs
Span 关联的 logs
可以看到本地有这个 dashboard 之后不仅 trace 数据可以查看而且可以和 log 进行一定的关联,这样我们就可以很方便地在本地开发调试了,如果你也在寻找本地 trace 数据,log 数据的 dashboard 可以试一试 aspire-dashboard
More
aspire dashboard 虽然是 dotnet 写的,但是不仅仅可以用于 dotnet,其他语言也可以使用。
aspire dashboard 的数据是基于内存的,所以实际测试,生产环境还是建议大家使用原来的基础设施(Prometheus/Tempo/ES/Grafana 等),如果目前的基础设置尚不支持 OTLP collector 可能需要写一些条件编译的代码,仅在本地导出到 OTLP (我们目前的基础设施 OpenTelemetry collector 就是只支持 trace 数据的处理,所以我们写了一些条件编译仅 debug 的时候把 log 和 metrics 导出到 aspire-dashboard)
aspire-dashboard 默认不是匿名的,但是 OpenTelemetry protocol(OTLP) 的接口是匿名的,所以跑 docker 命令的时候前面指定了一个环境变量 DOTNET_DASHBOARD_UNSECURED_ALLOW_ANONYMOUS=true
这样我们访问 dashboard 的时候就可以直接访问了,不用去从 log 里找 dashboard 的 token 了,感觉 aspire-dashboard 目前主要是在开发测试的时候使用,所以其实直接默认匿名访问可能更加方便一些,但是默认有 auth 的话安全性会更好一些,但目前对我们来说没什么必要,而且虽然 dashboard 默认设置了 auth 但是 OTLP endpoint 默认还是匿名的,这其实就可以随便往里面写了,只要知道 endpoint,如果想要往里面写一些脏数据是完全可能的,这其实又违反了安全的原则,所以感觉目前的默认设置很鸡肋而且影响大家上手,要么都不要设置 auth 方便大家使用(个人推荐),要么为了安全考虑都设置 auth ,大家觉得如何呢?
References
https://aspiredashboard.com/ https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/dashboard/standalone?tabs=bash&WT.mc_id=DT-MVP-5004222 https://learn.microsoft.com/en-us/dotnet/aspire/fundamentals/dashboard/configuration?tabs=bash&WT.mc_id=DT-MVP-5004222#telemetry-limits https://github.com/WeihanLi/SparkTodo/blob/c96cd6403cbae371a44b3fde39961b5c9ab0b7b0/SparkTodo.API/Program.cs#L139-L165
点击下方卡片关注DotNet NB
一起交流学习
▲ 点击上方卡片关注DotNet NB,一起交流学习
请在公众号后台