修改 FormatString 和 PrintHello 代码如下: privatestringFormatString( stringhelloTo ) {usingvarscope = _tracer.BuildSpan( "format-string").StartActive( true); varhelloString = $"Hello, {helloT...
修改 FormatString 和 PrintHello 代码如下:
privatestringFormatString( stringhelloTo ) {usingvarscope = _tracer.BuildSpan( "format-string").StartActive( true); varhelloString = $"Hello, {helloTo}!" ; scope.Span.Log( newDictionary< string, object> {[ LogFields.Event] = "string.Format", [ "value"] = helloString });returnhelloString; }privatevoidPrintHello( stringhelloString ) {usingvarscope = _tracer.BuildSpan( "print-hello").StartActive( true); _logger.LogInformation(helloString);scope.Span.Log( newDictionary< string, object> {[ LogFields.Event] = "WriteLine"});}
修改 SayHello 代码如下:
publicvoidSayHello( stringhelloTo ) {usingvarscope = _tracer.BuildSpan( "say-hello").StartActive( true); scope.Span.SetTag( "hello-to", helloTo); varhelloString = FormatString(helloTo); PrintHello(helloString);}通过上面的代码 , 我们实现去掉了那些烦人的代码 。
- StartActive 代替Start , 通过将其存储在线程本地存储中来使 span 处于“活动”状态;
- StartActive 返回一个IScope对象而不是一个对象ISpan 。 IScope是当前活动范围的容器 。 我们通过访问活动跨度scope.Span , 一旦关闭了作用域 , 先前的作用域将成为当前作用域 , 从而重新激活当前线程中的先前活动范围;
- IScope 继承 IDisposable , 它使我们可以使用using语法;
- StartActive(true)告诉Scope , 一旦它被处理 , 它就应该完成它所代表的范围;
- StartActive自动创建 ChildOf 对先前活动范围的引用 , 因此我们不必AsChildOf显式使用 builder 方法;
如果运行此程序 , 我们将看到所有三个报告的跨度都具有相同的跟踪ID 。
分布式链路跟踪
在不同进程中跟踪:
微服务将多个程序分开部署 , 每个程序提供不同的功能 。 在前面 , 我们已经学会了 OpenTracing 链路跟踪 。 接下来 , 我们将把代码拆分 , 控制台程序将不再提供 FormatString 函数的实现 , 我们使用 一个 Web 程序来实现 FormatString 服务 。
创建一个 ASP.NET Core 应用程序 , 在模板中选择带有视图模型控制器的模板 。
添加一个 FormatController 控制器在 Controllers 目录中 , 其代码如下:
usingMicrosoft.AspNetCore.Mvc; namespaceWebApplication1.Controllers{[ Route( "api/[controller]") ] publicclassFormatController: Controller{[ HttpGet] publicstringGet( ) {return"Hello!"; }
[ HttpGet( "{helloTo}", Name = "GetFormat") ] publicstringGet( stringhelloTo ) {varformattedHelloString = $"Hello, {helloTo}!" ; returnformattedHelloString; }}}
Web 应用将作为微服务中的其中一个服务 , 而这个服务只有一个 API, 这个 API 很简单 , 就是提供字符串的格式化 。 你也可以编写其它 API 来提供服务 。
将 Program 的 CreateHostBuilder 改一下 , 我们固定这个服务的 端口 。
publicstaticIHostBuilder CreateHostBuilder( string[] args) => Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults( webBuilder=> {webBuilder.UseUrls( "http://*:8081"); webBuilder.UseStartup<Startup>;});再到 Startup 中删除 app.UseHttpsRedirection; 。
修改之前控制台程序的代码 , 把 FormatString 方法改成:
privatestringFormatString( stringhelloTo ) {using( varscope = _tracer.BuildSpan( "format-string").StartActive( true)) {usingWebClient webClient = newWebClient; varurl = $"http://localhost:8081/api/format/ {helloTo}" ; varhelloString = webClient.DownloadString(url); scope.Span.Log( newDictionary< string, object> {[ LogFields.Event] = "string.Format", [ "value"] = helloString });returnhelloString; }}启动 Web 程序后 , 再启动 控制台程序 。
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。