jaegeropentracing的Java-client完整分布式追踪链,在分布式系统中透传trace信息

之前文章记录了jaegeropentracing的Java-client追踪链在单系统中的调用示例,现在记录下在分布式系统是如何实现一个完整的调用链的.

这篇文章是基于我之前的两篇文章编写了,链接如下:

Spring整合CXF webservice restful 实例

jaegeropentracing的Java-client

下面是代码:

client端代码如下:

public static void main(String[] args) throws InterruptedException {

        Configuration conf = new Configuration("EK Demo Jaeger."); //配置全局configuration
//发送sender configuration
Configuration.SenderConfiguration senderConf = new Configuration.SenderConfiguration(); senderConf.withAgentHost("192.168.1.111");
senderConf.withAgentPort(5775); Sender sender = senderConf.getSender();
log.info("[ sender ] : "+sender); conf.withReporter(
new Configuration.ReporterConfiguration()
.withSender(senderConf)
.withFlushInterval(100)
.withLogSpans(false)
); conf.withSampler(
new Configuration.SamplerConfiguration()
.withType("const")
.withParam(1)
); Tracer tracer = conf.getTracer();
log.info(tracer.toString());
GlobalTracer.register(tracer); Tracer.SpanBuilder spanBuilder = GlobalTracer.get().buildSpan("EK Demo P");
Span parent = spanBuilder.start();
parent.log(100, "before Controller Method is running......");
log.info("before Controller Method is running......"); Tracer.SpanBuilder childB = GlobalTracer.get().buildSpan("EK Demo child").asChildOf(parent);
Span child = childB.start();
JaegerSpanContext context = (JaegerSpanContext) child.context();
child.log("......"+context.contextAsString()); String url = "http://localhost:8080/jeeek/services/phopuService/getUserPost";
HttpClient httpClient = HttpClients.createSystem();
final HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", "text/plain");
StringEntity se = null; String weatherInfo = null;
try { //透传context到服务端
tracer.inject(parent.context(), Format.Builtin.TEXT_MAP, new TextMap() {
@Override
public Iterator<Map.Entry<String, String>> iterator() {
throw new UnsupportedOperationException("TextMapInjectAdapter should only be used with Tracer.inject()");
} @Override
public void put(String key, String value) {
log.info(key+",----------------------- "+value);
httpPost.setHeader(key, value);
}
}); se = new StringEntity("101010500");
se.setContentType("text/plain");
httpPost.setEntity(se);
HttpResponse response = null; response = httpClient.execute(httpPost); int status = response.getStatusLine().getStatusCode();
log.info("[接口返回状态吗] : " + status); weatherInfo = getReturnStr(response); } catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} log.info("[接口返回信息] : " + weatherInfo); Thread.sleep(5000);
child.finish();
Thread.sleep(5000);
parent.finish();
log.info("after Controller Method is running......."); Thread.sleep(10000);
}

服务端代码如下:

@POST
@Produces(MediaType.APPLICATION_JSON) //指定返回数据的类型 json字符串
//@Consumes(MediaType.TEXT_PLAIN) //指定请求数据的类型 文本字符串
@Path("/getUserPost")
public User getUserPost(String userId) {
this.logger.info("Call getUserPost() method...." + userId); Configuration conf = new Configuration("EK Demo Jaeger."); //配置全局configuration
//发送sender configuration
Configuration.SenderConfiguration senderConf = new Configuration.SenderConfiguration(); senderConf.withAgentHost("192.168.1.111");
//senderConf.withAgentHost("192.168.3.22");
senderConf.withAgentPort(5775); Sender sender = senderConf.getSender();
logger.info("[ sender ] : "+sender); conf.withReporter(
new Configuration.ReporterConfiguration()
.withSender(senderConf)
.withFlushInterval(100)
.withLogSpans(false)
); conf.withSampler(
new Configuration.SamplerConfiguration()
.withType("const")
.withParam(1)
); Tracer tracer = conf.getTracer();
logger.info(tracer.toString());
if (!GlobalTracer.isRegistered())
GlobalTracer.register(tracer); Tracer.SpanBuilder spanBuilder = tracer.buildSpan("server Span"); /**
* 由于此处只是一个restful接口,所以自己通过request获取头信息然后封装到map中,才作为参数传递
* 在实际的RPC分布式系统中,可以直接调用 request.getAttachments() 来返回头信息的trace信息
**/
//获取客户端透传的traceId,然后绑定span到该trace对应的span上
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String traceId = request.getHeader("uber-trace-id");//此处可以根据实际遍历header来获取,header的key有可能会发生变化[不确定]
Map<String, String> map = new HashMap<>();//将header信息放到map中
map.put("uber-trace-id", traceId);
logger.info("--------------------"+traceId);
try {
//new TextMapExtractAdapter(map)此处参数是个map,在分布式系统中直接调用request.getAttachments()
SpanContext spanContext = tracer.extract(Format.Builtin.TEXT_MAP, new TextMapExtractAdapter(map));
if (spanContext != null) {
spanBuilder.asChildOf(spanContext);
}
} catch (Exception e) {
spanBuilder.withTag("Error", "extract from request fail, error msg:" + e.getMessage());
} User user = new User();
user.setUserName("中文");
user.setAge(26);
user.setSex("m"); Span span = spanBuilder.start();
span.log("xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
span.finish(); try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
} return user;
}

在springMVC系统中手动获取request,需要配置web.xml,如下:

<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

当然,这只是一个demo,坐下简单记录,有问题可以留言交流。

jaegeropentracing的Java-client完整分布式追踪链的更多相关文章

  1. 2020-05-27:SpringCloud用了那些组件?分布式追踪链怎么做的?熔断器工作原理?

    福哥答案2020-05-27: SpringCloud分布式开发五大组件详解服务发现——Netflix Eureka客服端负载均衡——Netflix Ribbon断路器——Netflix Hystri ...

  2. [业界方案]用Jaeger来学习分布式追踪系统Opentracing

    [业界方案]用Jaeger来学习分布式追踪系统Opentracing 目录 [业界方案]用Jaeger来学习分布式追踪系统Opentracing 0x00 摘要 0x01 缘由 & 问题 1. ...

  3. 开源分布式追踪系统 — Jaeger介绍

    目录 一.Jaeger是什么 二.Jaeger架构 1. 术语 2. 架构图 三.关于采样率 四.部署与实践 一.Jaeger是什么 Uber开发的一个受Dapper和Zipkin启发的分布式跟踪系统 ...

  4. [业界方案] 用SOFATracer学习分布式追踪系统Opentracing

    [业界方案] 用SOFATracer学习分布式追踪系统Opentracing 目录 [业界方案] 用SOFATracer学习分布式追踪系统Opentracing 0x00 摘要 0x01 缘由 &am ...

  5. 【学习笔记】分布式追踪Tracing

    在软件工程中,Tracing指使用特定的日志记录程序的执行信息,与之相近的还有两个概念,它们分别是Logging和Metrics. Logging:用于记录离散的事件,包含程序执行到某一点或某一阶段的 ...

  6. Uber分布式追踪系统Jaeger使用介绍和案例

    原文:Uber分布式追踪系统Jaeger使用介绍和案例[PHP Hprose Go] 前言   随着公司的发展,业务不断增加,模块不断拆分,系统间业务调用变得越复杂,对定位线上故障带来很大困难.整个调 ...

  7. Jaeger Client Go 链路追踪|入门详解

    目录 从何说起 Jaeger 部署 Jaeger 从示例了解 Jaeger Client Go 了解 trace.span tracer 配置 Sampler 配置 Reporter 配置 分布式系统 ...

  8. ASP.NET Core使用Jaeger实现分布式追踪

    前言 最近我们公司的部分.NET Core的项目接入了Jaeger,也算是稍微完善了一下.NET团队的技术栈. 至于为什么选择Jaeger而不是Skywalking,这个问题我只能回答,大佬们说了算. ...

  9. OpenTracing:开放式分布式追踪规范

    前言 想实现一个简单的追踪系统似乎是容易的,需要必要的调用链id,时间戳等:想实现一款易用不侵入代码的追踪系统就很麻烦了,需要接触CLR和IL相关知识:即使你费劲心力做出了那些,如果性能不够好,也没有 ...

随机推荐

  1. stm32寄存器版学习笔记07 ADC

    STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...

  2. BZOJ3924 ZJOI2015 幻想乡战略游戏 【动态点分治】

    BZOJ3924 ZJOI2015 幻想乡战略游戏 Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂 ...

  3. 如何向map和reduce脚本传递参数,加载文件和目录

    本文主要讲解三个问题:       1 使用Java编写MapReduce程序时,如何向map.reduce函数传递参数.       2 使用Streaming编写MapReduce程序(C/C++ ...

  4. mysql系列:加深对脏读、脏写、可重复读、幻读的理解

    关于相关术语的专业解释,请自行百度了解,本文皆本人自己结合参考书和自己的理解所做的阐述,如有不严谨之处,还请多多指教. 事务有四种基本特性,叫ACID,它们分别是: Atomicity-原子性,Con ...

  5. apache phoenix 安装试用

    备注:   本次安装是在hbase docker 镜像的基础上配置的,主要是为了方便学习,而hbase搭建有觉得   有点费事,用镜像简单.   1. hbase 镜像 docker pull har ...

  6. 总结css的使用技巧

    1. 纯 CSS 的 tooltips 现在的要求是使用纯css在页面上显示一个title,或者图片的描述文字(在鼠标移入图片之后): content,attr() content一般与::befor ...

  7. 页面加载完之后在执行js代码

    把代码写在 window.onload = function () { //js代码 //此处js代码是页面完全加载完之后执行 } 即可. 例: <script type="text/ ...

  8. 从汇编的角度看待变量类型与sizeof的机制

    1.动机:前段时间,一直有个疑问,就是编译器是从哪里知道数据的类型的,数据的类型是存在内存里面的么,因为自己调试编译器,发现内存中并没有多余的数据,后来在群上发问,才知道数据在编译成汇编的过程就知道数 ...

  9. 1072. Gas Station (30) 多源最短路

    A gas station has to be built at such a location that the minimum distance between the station and a ...

  10. C# 6.0 新特性收集

    先来看一段Json.Net的代码 public JObject ToJson() { var result = new JObject(); result["X"] = X; re ...