Welcome to YARP - 8.分布式跟踪

我爱普洱茶  金牌会员 | 2024-1-5 02:13:38 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 722|帖子 722|积分 2166

Welcome to YARP - 1.认识YARP并搭建反向代理服务
Welcome to YARP - 2.配置功能
Welcome to YARP - 3.负载均衡
Welcome to YARP - 4.限流
Welcome to YARP - 5.身份验证和授权
Welcome to YARP - 6.压缩、缓存
Welcome to YARP - 7.目标健康检查
Welcome to YARP - 8.分布式跟踪
这篇文章结束,YARP 的学习就先告一段落了。还有很多省略的章节(比如:中间件、HTTPS和TLS、GRPC等等)。想要了解更多的小伙伴可以自己去官网的文档了解。
介绍

在介绍 YARP 的分布式跟踪之前,我们先来了解一下什么是分布式跟踪。
当我们构建大型的应用程序或系统时,通常会将其拆分成多个部分,这些部分可能运行在不同的计算机或进程中。这种分布式架构有助于提高系统的可伸缩性和性能,但也增加了故障诊断的难度。分布式跟踪就像是应用程序的侦探工具,可以帮助工程师找出应用程序中的问题,特别是那些可能横跨多个计算机或进程的问题。
举个例子,假设我们有一个典型的网页服务,用户发送请求后,这个请求可能经过负载均衡器,然后传递给后端的Web服务器进程,最后可能会涉及数据库的多次查询。使用分布式跟踪,就像我们在调查一桩案件一样,工程师可以追踪整个请求的过程。他们能够分辨每个步骤是否成功,每个步骤花费了多少时间,甚至可以记录每个步骤产生的详细信息。
作为 ASP.NET Core 的组件,YARP 可以像任何其他 Web 应用程序一样轻松集成到不同的跟踪系统中。可以使用以下程序配置分布式跟踪,详情参考:
.NET 具有对分布式跟踪的内置可配置支持,YARP 利用这些支持来启用此类现成方案。
使用自定义跟踪标头

在使用 .NET 不原生支持的传播机制时,需要创建一个专门的传播器(DistributedContextPropagator)来处理该机制的上下文信息传递。
YARP 会移除 DistributedContextPropagator.Fields( 这是DistributedContextPropagator中的一个属性或字段,用于存储与上下文传播相关的信息 ) 中的任何标头,以便在 Inject 调用期间,传播器可以重新添加它们到请求中。 这个步骤是为了在整个传播过程中有效地管理标头信息,以确保它们被适当地处理和传递。
透传代理

如果不希望代理主动参与跟踪,并希望保留所有跟踪标头,您可以通过将SocketsHttpHandler.ActivityHeadersPropagator 设置为null来实现。这表示代理将保持对跟踪标头的透明传递,而不会主动干预。
  1. services.AddReverseProxy()
  2.     .ConfigureHttpClient((context, handler) => handler.ActivityHeadersPropagator = null);
复制代码
示例

1.创建项目
  1. dotnet new web -n YARP.Metrics -f net6.0
复制代码
2.添加项目引用
  1. <ItemGroup>
  2.         <PackageReference Include="Yarp.Telemetry.Consumption" Version="2.1.0" />
  3. </ItemGroup>
复制代码
这个是 YARP 提供的库,用来监听代理操作的各个阶段,从而收集有关请求处理的详细信息和性能指标。
在内部,YARP 使用 EventSource 来收集来自许多用于处理请求的子系统的遥测事件和指标。
要监听这些指标,需要在 DI(依赖注入)中注册实现每个功能接口的类。以下是该类库提供的功能:
功能概述:


  • Proxy(代理):代表整个代理操作,包括成功或失败。

    • 事件包括:

      • 代理请求的启动和停止时
      • 请求/响应主体处理时

    • 指标包括:

      • 启动的请求数量
      • 进行中的请求数量
      • 失败的请求数量


  • Kestrel:处理传入请求的 Web 服务器。

    • 事件包括:

      • 请求的启动/停止或失败时

    • 指标包括:

      • 连接速率 - 每秒打开的连接数
      • 总连接数
      • TLS 握手次数
      • 入站队列长度


  • Http:用于向目标服务器发出出站请求的 HttpClient。

    • 事件包括:

      • 连接创建时
      • 请求的启动/停止或失败时
      • 标头/内容发送/接收时
      • 请求在连接可用时出队列时

    • 指标包括:

      • 启动的出站请求数量
      • 失败的请求数量
      • 活动请求数量
      • 出站连接数量


  • Sockets:涉及连接尝试的事件和有关发送和接收的数据量的指标。
  • NameResolution:涉及名称解析尝试的事件和有关目标的 DNS 查询的指标。
  • NetSecurity:涉及 SslStream 握手的事件和有关每个协议的握手数量和延迟的指标。
3.关键文件


  • ForwarderTelemetryConsumer(监听来自代理遥测的事件,记录与代理请求处理的高级别过程相关的时序和信息。)
  • HttpClientTelemetryConsumer(监听来自 HttpClient 遥测的事件,记录与目标服务器的出站请求和响应相关的时序和信息。)
  • PerRequestMetrics(存储按每个请求计算的指标的类。实例在请求的整个生命周期内存储在 AsyncLocal 存储中。)
  • PerRequestYarpMetricCollectionMiddleware(处理请求的第一步和最后一步。它初始化每个请求的指标,并在请求结束时记录结果。)
4.在DI中注册
  1. using YARP.Metrics;
  2. var builder = WebApplication.CreateBuilder(args);
  3. var services = builder.Services;
  4. services.AddControllers();
  5. services.AddReverseProxy()
  6.     .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
  7. services.AddHttpContextAccessor();
  8. // 用于收集有关代理转发的常规指标的接口
  9. services.AddMetricsConsumer<ForwarderMetricsConsumer>();
  10. // 将使用者注册到代理转发器遥测的事件
  11. services.AddTelemetryConsumer<ForwarderTelemetryConsumer>();
  12. // 将使用者注册到HttpClient遥测事件
  13. services.AddTelemetryConsumer<HttpClientTelemetryConsumer>();
  14. services.AddTelemetryConsumer<WebSocketsTelemetryConsumer>();
  15. var app = builder.Build();
  16. // 收集和报告代理度量的自定义中间件
  17. // 放置在开头,因此它是每个请求运行的第一件也是最后一件事
  18. app.UsePerRequestMetricCollection();
  19. // 用于拦截WebSocket连接并收集暴露给WebSocketsTemetryConsumer的遥测的中间件
  20. app.UseWebSocketsTelemetry();
  21. app.MapReverseProxy();
  22. app.Run();
复制代码
5.Appsettings.json配置
  1. {
  2.   "Logging": {
  3.     "LogLevel": {
  4.       "Default": "Information",
  5.       // "Microsoft": "Warning",
  6.       "Microsoft.Hosting.Lifetime": "Information"
  7.     }
  8.   },
  9.   "AllowedHosts": "*",
  10.   "ReverseProxy": {
  11.     "Routes": {
  12.       "route1": {
  13.         "ClusterId": "cluster1",
  14.         "Match": {
  15.           "Path": "{**catch-all}"
  16.         }
  17.       }
  18.     },
  19.     "Clusters": {
  20.       "cluster1": {
  21.         "Destinations": {
  22.           "cluster1/destination1": {
  23.             "Address": "https://www.baidu.com/"
  24.           }
  25.         }
  26.       }
  27.     }
  28.   }
  29. }
复制代码
5.运行项目

接下来我们运行项目,就可以看到代理请求的一些指标数据:

总结

到这里分布式跟踪篇章也已经结束了,它在分布式系统中尤为重要,可以分析性能瓶颈,定位错误和异常。而且收集的这些遥测数据(指标)可以导出到多种不同的后端存储或可视化工具中。比如:ZipkinJaegerPrometheus,这都是后话了。有兴趣的小伙伴自己研究吧。相关代码已上传Github,关键文件也都有注释。至此 YARP 的学习就先告一段落了。还有很多省略的章节(比如:中间件、HTTPS和TLS、GRPC等等)。想要了解更多的小伙伴可以自己去官网的文档了解。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表