微软官方推荐:
https://docs.microsoft.com/zh-cn/dotnet/core/diagnostics/distributed-tracing-collection-walkthroughs
https://opentelemetry.io/
 
 
OpenTelemetry for .NET
OpenTelemetry for .NET 在 OpenTelemetry 实现中是独一无二的,因为它与 .NET
System.Diagnostics
库集成。
https://opentelemetry.io/docs/instrumentation/net/
 
经验总结如下:
 
 
OpenTelemetry分为SDK和API 两个部分。
SDK一般支持在Console的【桌面】项目中使用。
API一般支持在ASP.NETCORE 等【web】项目中使用。
 
 
 
OpenTelemetry内部采用Builder建造者模式
内部对 组件进行拼装:
组件有-Instrumentation 插装探测仪器、数据处理器Process、采样器Sample、Exporter导出器等几大类。
按照组装流程组件。每个类型都可以装入N个不同的组件。
最终是Instrumentation (N个)+Process(N个链式处理)+Sample(N个)+Exporter(N个)的形式。
 
 
 
Instrumentation 插装探测仪器
不论是SDK还是API,都支持相同方式来使用-Instrumentation 插装探测仪器。
不同的类库【sql、mysql、redis、rocketmq、mns、aspnetcore、httpclient等】有不同的-Instrumentation 插装探测仪器。
还可以遵循规范,自己定制扩展属于自己的-Instrumentation 插装探测仪器。
 
 
 
Instrumentation 插装探测仪器内部
内部实质是采用了BCL的DiagnosticListener来实现【观察者模式下的观测者】来进行消费。
那么生产者就在各个官方【sql、mysql、redis、rocketmq、mns、aspnetcore、httpclient等】的类库里面埋了点。具体要看sqlclient、mysql.data、servicestack.redis、aspnetcore源码里面怎么埋的了。
 
生产者因为netfx和netcore的版本差异,一般埋点有2种方式:
一种是EventSource/ActivitySource埋点,一种是DiagnosticListener埋点。
 
 
1.EventSource/ActivitySource埋点的方式:
一般多用于EventSource多用于netfx较低版本,ActivitySource多用于netfx较高版本+netcore及以上版本。
实质上,OT的Instrumentation 插装探测仪器内部只是帮忙注册一个默认的同名的linstener,让生产者能正常产生埋点数据(因为EventSource/ActivitySource的原理是必须有linstener才能有效,否则不产生埋点数据),并不做其他任何定制。
 
 
2.DiagnosticListener埋点的方式:
一般多用于netcore及以上版本。
实质上,OT的Instrumentation 插装探测仪器内部要遵守规范标准,完整的实现一整套代码。生产者的命名和OT的Instrumentation里面的命名必须严格一致。
 
 
 
OpenTelemetry的导出器
有很多【Console、Oltp协议、jagger、Zipkin、Prometheus等】,可以随意替换,也可以叠加使用。
导出器非必要不建议扩展。Oltp协议是公共协议,对接阿里云、es等遵守公共规范的平台,足够使用了。
 
还可以通过jagger等组件,将数据导入到jagger等平台,更好的查看web页面。