.NET Core集成CorrelationId打印请求链路唯一标识
.NET Core集成CorrelationId打印请求链路唯一标识
一,链路追踪
随着微服务架构的流行,一次请求会涉及多个服务的调用,并且服务本身也可能会依赖其他服务,整个请求路径会构成一个调用链,当某个节点发生异常时,整个调用链的稳定性都会受到影响,由此APM(应用性能管理)应运而生。
APM可以用于分布式追踪、性能指标分析、应用和服务依赖分析等,可以帮助理解系统行为和分析性能问题。
常见的APM有SkyWalking,Cat、Zipkin、Pinpoint等。其中,SkyWalking可以通过SkyAPM-dotnet集成,Zipkin可以通过zipkin4net集成,对SkyWalking有兴趣的童鞋可以看我另外一篇博文《.NET Core集成SkyWalking+SkyAPM-dotne实现分布式链路追踪》。
虽然APM可以捕捉到整个链路请求,但个人感觉在日志层面还是比较薄弱,更多的还是用于性能分析和追踪。
在实际的生产应用中,大部分的异常更多的是业务异常,APM并不能对日志的定位寻找产生太大帮助,最好的方案还是在日志中输出请求链路的唯一标识,利用唯一标识,我们可以很容易的在日志中心中把请求链路的所有日志检索出来。
二,CorrelationId
CorrelationId会在请求中产生一个唯一标识,并可以将唯一标识作为一个Header传递到下一请求,以此类推,从而整个链路都可以获取到这个标识,并自主打印到日志当中。
下面来看一下详细的实现:
安装nuget包CorrelationId
修改Startup.cs
1.注入组件,可不声明option,UpdateTraceIdentifier = true会自动更新httpcontext中TraceIdentifier字段
2.同一链路中所有节点需声明同一个Client名称,加入此句才能将CorrelationId传递出去
3.
到此,单个应用节点就已经配置完成了,是不是so easy。同理,其他应用节点也是这么配置。
下面,我们来使用这个唯一标识
声明ICorrelationContextAccessor对象,并通过构造函数注入
通过_correlationContextAccessor对象即可获取到唯一标识,后续输出日志时,便可打印出来
需要特别注意的是,如调用的是gRPC服务,header默认是空的,无法通过配置直接带过去,需要手动传递
如设置UpdateTraceIdentifier = true,也可直接获取HttpContext中TraceIdentifier的字段,两者值是一样的
最后,让我们看一下日志输出的效果:
附上GitHub中详细的使用文档:https://github.com/stevejgordon/CorrelationId/wiki
__EOF__

本文链接:https://www.cnblogs.com/night-li/p/14144112.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界