内容简介:本文内容主要翻译(意译)自Yurishkuro大神的学习:在上一节中看到,SpanContext是如何在不同的服务之间传递的。我们可以将这种机制通用化,相当于实现了一个在分布式环境中进行信息传递的通道,这样就可以在服务间传递一些自定义数据了。
本文内容主要翻译(意译)自Yurishkuro大神的 opentracing-tutorial java ,加了一些补充说明,方便理解,习惯看英文的也可以看原文。总共4篇,本文是第4篇。如果你还没接触过OpenTracing,建议先读这篇文章《 OpenTracing概念术语介绍 》和 官方文档 。
- 第1篇:单span的trace创建 。
- 第2篇:多span的trace创建(进程内SpanContext传递 )。
- 第3篇:跨服务(进程)传递SpanContext 。
- 第4篇:Baggage介绍 ( 本文 )。
学习:
- 理解分布式上下文的传递
- 使用baggage来传递数据
开发流程
在上一节中看到,SpanContext是如何在不同的服务之间传递的。我们可以将这种机制通用化,相当于实现了一个在分布式环境中进行信息传递的通道,这样就可以在服务间传递一些自定义数据了。
这就是OpenTracing定义的 Baggage :baggage是SpanContext的一部分,也是以key-value形式存在的。和tags、logs的差别在于, baggage是全局传递的 。父Span里面的baggage信息会自动被所有子span继承,这就是所谓的全局性。也就是你能在调用链上任意地方读取到该信息。下面我们看个具体的例子。
在Client中增加Baggage
代码还是在上一篇文章的代码之上修改。我们再增加一个命令行参数,然后将这个参数放到baggage里面。修改Hello的main方法:
public static void main(String[] args) { if (args.length != 2) { throw new IllegalArgumentException("Expecting two arguments, helloTo and greeting"); } String helloTo = args[0]; String greeting = args[1]; Tracer tracer = Tracing.init("hello-world"); new Hello(tracer).sayHello(helloTo, greeting); }
然后将第二个参数放到baggage里面:
private void sayHello(String helloTo, String greeting) { Span span = tracer.buildSpan("say-hello").start(); try (Scope scope = tracer.scopeManager().activate(span)) { span.setTag("hello-to", helloTo); // 把第二个参数信息放到baggage里面 span.setBaggageItem("greeting", greeting); String helloStr = formatString(helloTo); printHello(helloStr); } finally { span.finish(); } }
其它地方都不用修改。
在Formatter服务中读取Baggage
@GET public String format(@QueryParam("helloTo") String helloTo, @Context HttpHeaders httpHeaders) { Span span = Tracing.startServerSpan(tracer, httpHeaders, "format"); try (Scope scope = tracer.scopeManager().activate(span)) { // 读取Baggage String greeting = span.getBaggageItem("greeting"); if (greeting == null) { greeting = "Hello"; } String helloStr = String.format("%s, %s!", greeting, helloTo); span.log(ImmutableMap.of("event", "string-format", "value", helloStr)); return helloStr; } finally { span.finish(); } }
Baggage注意点
首先,上面实现的功能也可以通过在接口中增加参数来实现。但服务比较多的时候比较麻烦,而且接口改动是一个比较大的改动,一般定了以后不能随意更改。而Baggage是不需要改动接口的,基本对于服务自身是透明的。这也是Baggage的意义所在。这里列举一些Baggage的使用场景:
- 多租户系统的租户信息
- 底层调用者的标识信息
- 混沌工程中传递一些错误注入指令
- passing request-scoped dimensions for other monitoring data, like separating metrics for prod vs. test traffic
但需要主要的是Baggage是全局传递的,所以数据量不能太大,否则可能会产生性能问题。一些库/框架会在实现层限制这个大小。
Baggage是链路跟踪给出的一个通用的分布式数据传输机制,可以根据场景合理利用。
以上所述就是小编给大家介绍的《OpenTracing Java Library教程(4)——Baggage介绍》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Charles 功能介绍和使用教程
- 重新介绍 JavaScript(JS 教程)
- VXLAN 基础教程:VXLAN 协议原理介绍
- 介绍性SQL教程:如何编写简单查询
- webpack 3 零基础入门教程 #1 - 介绍
- Libero系列教程(一)介绍、下载、安装与注册
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Effective JavaScript
David Herman / Addison-Wesley Professional / 2012-12-6 / USD 39.99
"It's uncommon to have a programming language wonk who can speak in such comfortable and friendly language as David does. His walk through the syntax and semantics of JavaScript is both charming and h......一起来看看 《Effective JavaScript》 这本书的介绍吧!