使用 aspire-dashboard 展示 open-telemetry trace/logging/metrics

科技   2024-11-20 08:01   广东  

使用 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

logging-0

tracing

metrics

tracing-details

Trace 关联的 logs

trace-logs

Span 关联的 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


推荐阅读:
真心不错,使用 C# 和 Winform 开源一个仿 QQ 项目
C#中使用 record 的好处 因为好用所以推荐!
推荐一个基于 C# 和 WPF 实现的短视频自动发布管理系统
使用 C#、OpenAI 和 Spectre.Console 创建控制台 ChatGPT 客户端
.NET 9正式发布,亮点是.NET Aspire和AI
今晚零点!一同相约 .NET Conf 2024

点击下方卡片关注DotNet NB

一起交流学习

▲ 点击上方卡片关注DotNet NB,一起交流学习

请在公众号后台

回复 【路线图】获取.NET 2024开发者路线
回复 【原创内容】获取公众号原创内容
回复 【峰会视频】获取.NET Conf大会视频
回复 【个人简介】获取作者个人简介
回复 【年终总结】获取作者年终回顾
回复 加群加入DotNet NB 交流学习群

长按识别下方二维码,或点击阅读原文。和我一起,交流学习,分享心得。

DotNet NB
.NET 技术学习分享,社区热点分享,专注为 .NET 社区做贡献,愿我们互相交流学习,共同推动社区发展
 最新文章