当然 , ISpan 提供了结构化日志的方法 , 我们可以编写一个方法 , 用于格式化日志 。
跟踪单个功能:
在 Hello 类中添加以下代码:
privatestringFormatString( ISpan rootSpan, stringhelloTo ) {varspan = _tracer.BuildSpan( "format-string").Start; try{varhelloString = $"Hello, {helloTo}!" ; span.Log( newDictionary< string, object> {[ LogFields.Event] = "string.Format", [ "value"] = helloString });returnhelloString; }finally{span.Finish;}}另外 , 我们还可以封装一个输出字符串信息的函数:
privatevoidPrintHello( ISpan rootSpan, stringhelloString ) {varspan = _tracer.BuildSpan( "print-hello").Start; try{_logger.LogInformation(helloString);span.Log( "WriteLine"); }finally{span.Finish;}}将 SayHello 方法改成:
publicvoidSayHello( stringcontent ) {varspanBuilder = _tracer.BuildSpan( "say-hello"); varspan = spanBuilder.Start; varstr = FormatString(span, content); PrintHello(span,str);span.Finish;}改以上代码的原因是 , 不要在一个方法中糅合太多代码 , 可以尝试将一些代码复用 , 封装一个统一的代码 。
但是 , 原本我们只需要调用 SayHello 一个方法 , 这里一个方法会继续调用另外两个方法 。 原本是一个 Span , 最后变成三个 Span 。
info: Jaeger.Configuration[0]info: Jaeger.Reporters.LoggingReporter[0]Spanreported: 77 f1a24676a3ffe1:77f1a24676a3ffe1:0000000000000000:1-format-stringinfo: ConsoleApp1.Hello[0]Hello, Thistrace! info: Jaeger.Reporters.LoggingReporter[0]Spanreported: cebd31b028a27882:cebd31b028a27882:0000000000000000:1-print-helloinfo: Jaeger.Reporters.LoggingReporter[0]Spanreported: 44 d89e11c8ef51d6:44d89e11c8ef51d6:0000000000000000:1-say-hello注:0000000000000000 表示一个 Span 已经结束 。
优点:从代码上看 , SayHello -> FormaString ,SayHello -> PrintHello , 我们可以清晰知道调用链路;
缺点:从输出来看 , Span reported 不同 , 我们无法中输出中判断三个函数的因果关系;
我们不可能时时刻刻都盯着代码来看 , 运维人员和实施人员也不可能拿着代码去对比以及查找代码逻辑 。
将多个跨度结合到一条轨迹中:
ITracer 负责创建链路追踪 , 因此 ITracer 也提供了组合多个 Span 因果关系的 API 。
使用方法如下:
varrootSapn = _tracer.BuildSpan( "say-hello"); // Avarspan = _tracer.BuildSpan( "format-string").AsChildOf(rootSpan).Start; // B// A -> B我们创建了一个 rootSpan, 接着创建一个延续 rootSpan 的 sapn , rootSpan -> span 。
info: Jaeger.Reporters.LoggingReporter[0]Spanreported: 2 f2c7b36f4f6b0b9:3dab62151c641380:2f2c7b36f4f6b0b9:1-format-stringinfo: ConsoleApp1.Hello[0]Hello, Thistrace! info: Jaeger.Reporters.LoggingReporter[0]Spanreported: 2 f2c7b36f4f6b0b9:9824227a41539786:2f2c7b36f4f6b0b9:1-print-helloinfo: Jaeger.Reporters.LoggingReporter[0]Spanreported: 2 f2c7b36f4f6b0b9:2f2c7b36f4f6b0b9:0000000000000000:1-say-hello
Spanreported: 2f2c7b36f4f6b0b9 输出顺序为执行完毕的顺序 , say-hello 是最后才执行完成的 。
传播过程中的上下文:
从什么代码中 , 大家发现 , 代码比较麻烦 , 因为:
- 要将 Span 对象作为第一个参数传递给每个函数;
- 每个函数中加上冗长的 try-finally{} 确保能够完成 Span
为此 ,OpenTracing API 提供了一种更好的方法 , 我们可以避免将 Span 作为参数传递给代码 , 可以统一自行调用 _tracer 即可 。
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。