使用方式:
1.将dll文件直接copy引用
2.打包发到nuget上
程序修改开发:
1.请下载OpenTelemetry源码,在源码的dotnet解决方案中开发。 将本项目添加到解决方案中。 路径位置在src下。
https://github.com/open-telemetry/opentelemetry-dotnet 注意版本--当前主版本是1.2.0-rc5。
原因:有些代码Shared直接includes。
2.基本结构说明:
2.1 TracerProviderBuilderExtensions ----是DI侧、链式追加仪器到OT组件(build模式)的---这个仪器的扩展。
2.2 Instrumentation--核心类--数据来源
///这个类有3种写法: ///第1种:基于DiagnosticListener的--类似于SqlClient ///使用DiagnosticSourceSubscriber, 其实也就是DiagnosticListener.AllListeners挂载观察员。 ///DiagnosticListenerName参考SqlClient定义,要一致https://github.com/dotnet/SqlClient/blob/main/src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlClientDiagnosticListenerExtensions.cs ///exp:https://github.com/open-telemetry/opentelemetry-dotnet/blob/main/src/OpenTelemetry.Instrumentation.SqlClient/SqlClientInstrumentation.cs ///第2种:基于老版的TraceListener--类似于MySql ///整个做法都改变,这里直接使用DefaultTraceListener ///参考https://github.com/mysql/mysql-connector-net/blob/8.0/MySQL.Data/src/MySqlTrace.cs ///Mysql订阅回调集合,在本类中挂载上新的回调 MySqlTrace.Listeners.Add(this);最终看回调的函数是什么,再新增1个回调函数TraceEvent ///exp:https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/main/src/OpenTelemetry.Instrumentation.MySqlData/MySqlDataInstrumentation.cs ///第3种:自定义Source ///很多组件C#版本没有埋监控的来源,需要自己实现 ///1.单例化整个数据来源的封装类,内部封装 ActivitySource ///2.从PropagationContext抽取上下文、头信息。 ///3.创建新的子Activity,setTag等信息。 ///4.将AddSource与AddXXXXInstrumentation 同等意义,集成到OT的链条上, 并通用、共用导出结果器 ///exp:https://github.com/open-telemetry/opentelemetry-dotnet/blob/main/examples/MicroserviceExample/Utils/Messaging/MessageReceiver.cs
2.3 MNSMQActivitySourceHelper---定义ActivitySource。
确保本仪器内都操作这个ActivitySource, 同时这个ActivitySource在之前的Context上下文中(创建时配置)。
2.4 EventSource---当Instrumentation中出现无法处理的事件后,使用EventSource来处理--写入事件提醒用户、给用户查找原因的日志。
2.5特别说明下--OT内部的DiagnosticSourceSubscriber类-----是一个:IObserver 的 观测者
构造函数:
DiagnosticSourceSubscriber 里的属性 是 一个ListenerHandler 对象。
OT下XXXXDiagnosticListener 是ListenerHandler的一个子类-实现类。---name是委托传入的,基本用不到。
第一层订阅-消费流程:
DiagnosticSourceSubscriber执行Subscribe--- DiagnosticListener.AllListeners.Subscribe(this);
--实质上是把DiagnosticListener作为一个被观测元素 被AllListenerObservable--被观测对象统一管理。
于是【生产者-被观测对象】当DiagnosticListener被创建、挂载到BCL时,就通知所有监听DiagnosticListener的观测者。
【消费者-观测者】其中一个观测者DiagnosticSourceSubscriber会收到消息,在OnNext里面做逻辑,判断触发的DiagnosticListener的name是否是固定匹配的字符串。
[ 特别说明下--OT内部DiagnosticSourceListener类---是一个:IObserver<KV> 的 观测者 构造函数: DiagnosticSourceListener 里的属性 是 一个ListenerHandler 对象。 OT下XXXXDiagnosticListener 是ListenerHandler的一个子类-实现类。---name是委托传入的,基本用不到。 ]
第二层订阅-消费流程:
OnNext中Name通过判断后--
将OT下XXXXDiagnosticListener做参数 new出一个DiagnosticSourceListener对象。
将DiagnosticSourceListener对象”--kv的观测者,单独subscribe到这个 DiagnosticListener 上面。
--实质上把DiagnosticListener 作为一个“被观测对象”,其观测的元素是 KV.
于是【生产者-被观测对象】当KV被创建时,就通知所有监听KV的观测者。
-- 当DiagnosticListener触发write时,创建KV。
【消费者-观测者】其中一个观测者DiagnosticSourceListener会收到消息,在OnNext里面做逻辑.
其OnNext内部使用了 【XXXXDiagnosticListener】.函数方法 执行具体的逻辑操作。
OnNext里面的按照key的后缀划分成4个方法, 在XXXXDiagnosticListener 里面 只是去重写这4个方法,