代码改变世界

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

上面代码,如果不传参数,使用环境变量。