Elastic.Apm 源码解析
2022-09-03 14:30 qgbo 阅读(102) 评论(0) 编辑 收藏 举报源码中有如下 sample:
1 var distributedTracingData = DistributedTracingData.TryDeserializeFromString(args[0]); 2 3 WriteLineToConsole($"Callee process started - continuing trace with distributed tracing data: {distributedTracingData}"); 4 var transaction2 = Agent.Tracer.StartTransaction("Transaction2", "TestTransaction", distributedTracingData); 5 6 try 7 { 8 transaction2.CaptureSpan("TestSpan", "TestSpanType", () => Thread.Sleep(200)); 9 } 10 finally 11 { 12 transaction2.End(); 13 }
Agent.Tracer 这个是静态字段,public static ITracer Tracer => Instance.Tracer;
整个 Agent 就是一个静态类
Instance实际上是个单例,就是 new ApmAgent(Components)
这个里面的 Trace 又到了 AgentComponents里
这个 trace 这样new
TracerInternal = new Tracer(Logger, Service, PayloadSender, ConfigurationStore, currentExecutionSegmentsContainer ?? new CurrentExecutionSegmentsContainer(), ApmServerInfo, breakdownMetricsProvider);
最后这个 trace 执行start 的时候 会 new 一个 Transaction, 之后会用到 Activity
这个里面的 StartActivity() 会 把这Activity.start()这会设置Activity.Curent
最后会 End ,这会Activity.stop(), 设置Activity.Curent= parrent
2.
在worker 类项目中,上面代码的配置来自环境变量,
AgentComponents里 有这样的话:
ConfigurationReader = configurationReader ?? new EnvironmentConfigurationReader(tempLogger);
这里就是读的enviroment, Key 来自这里
3. asp.netcore 项目中,会使用下面代码开启APM:
app.UseAllElasticApm(Configuration)
这在最后会启用一个中间件,就是要在每个 request 来的时候,Trace
上面代码,如果不传参数,使用环境变量。
气功波(18037675651)