jaegeropentracing的Java-client完整分布式追踪链
jaegeropentracing的Java-client完整分布式追踪链,在分布式系统中透传trace信息
之前文章记录了jaegeropentracing的Java-client追踪链在单系统中的调用示例,现在记录下在分布式系统是如何实现一个完整的调用链的.
这篇文章是基于我之前的两篇文章编写了,链接如下:
Spring整合CXF webservice restful 实例
下面是代码:
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完整分布式追踪链的更多相关文章
- 2020-05-27:SpringCloud用了那些组件?分布式追踪链怎么做的?熔断器工作原理?
		
福哥答案2020-05-27: SpringCloud分布式开发五大组件详解服务发现——Netflix Eureka客服端负载均衡——Netflix Ribbon断路器——Netflix Hystri ...
 - [业界方案]用Jaeger来学习分布式追踪系统Opentracing
		
[业界方案]用Jaeger来学习分布式追踪系统Opentracing 目录 [业界方案]用Jaeger来学习分布式追踪系统Opentracing 0x00 摘要 0x01 缘由 & 问题 1. ...
 - 开源分布式追踪系统 — Jaeger介绍
		
目录 一.Jaeger是什么 二.Jaeger架构 1. 术语 2. 架构图 三.关于采样率 四.部署与实践 一.Jaeger是什么 Uber开发的一个受Dapper和Zipkin启发的分布式跟踪系统 ...
 - [业界方案] 用SOFATracer学习分布式追踪系统Opentracing
		
[业界方案] 用SOFATracer学习分布式追踪系统Opentracing 目录 [业界方案] 用SOFATracer学习分布式追踪系统Opentracing 0x00 摘要 0x01 缘由 &am ...
 - 【学习笔记】分布式追踪Tracing
		
在软件工程中,Tracing指使用特定的日志记录程序的执行信息,与之相近的还有两个概念,它们分别是Logging和Metrics. Logging:用于记录离散的事件,包含程序执行到某一点或某一阶段的 ...
 - Uber分布式追踪系统Jaeger使用介绍和案例
		
原文:Uber分布式追踪系统Jaeger使用介绍和案例[PHP Hprose Go] 前言 随着公司的发展,业务不断增加,模块不断拆分,系统间业务调用变得越复杂,对定位线上故障带来很大困难.整个调 ...
 - Jaeger Client Go 链路追踪|入门详解
		
目录 从何说起 Jaeger 部署 Jaeger 从示例了解 Jaeger Client Go 了解 trace.span tracer 配置 Sampler 配置 Reporter 配置 分布式系统 ...
 - ASP.NET Core使用Jaeger实现分布式追踪
		
前言 最近我们公司的部分.NET Core的项目接入了Jaeger,也算是稍微完善了一下.NET团队的技术栈. 至于为什么选择Jaeger而不是Skywalking,这个问题我只能回答,大佬们说了算. ...
 - OpenTracing:开放式分布式追踪规范
		
前言 想实现一个简单的追踪系统似乎是容易的,需要必要的调用链id,时间戳等:想实现一款易用不侵入代码的追踪系统就很麻烦了,需要接触CLR和IL相关知识:即使你费劲心力做出了那些,如果性能不够好,也没有 ...
 
随机推荐
- 使用jenkins持续集成自动化测试
			
本文采用Springboot开发一个简易的添加个人资料和查询个人资料接口,并采用testng进行测试,使用jenkis进行持续继承,allure输出测试报告. 个人资料查询接口开发(集成H2数据库) ...
 - 批量归一化batch_normalization
			
为了解决在深度神经网络训练初期降低梯度消失/爆炸问题,Sergey loffe和Christian Szegedy提出了使用批量归一化的技术的方案,该技术包括在每一层激活函数之前在模型里加一个操作,简 ...
 - 用eclipse运行java程序显示找不到main class,网上的方法都试了,还是不行,有没有知道怎么解决的呀!
			
编译器问题,jdk版本不对,Window --> Preferences -->Java --> compiler中的compiler compliance level,这里选你当前 ...
 - 【转】Linux动态链接(4)ldd与ldconfig
			
原文网址:http://tsecer.blog.163.com/blog/static/15018172012414105551345/ 一.动态链接工具ldd和ldconfig是动态链接的两个重要辅 ...
 - App测试工具
			
1.App性能测试与安全测试工具 性能测试工具:Itest(众测平台) 安全测试:Utest
 - shell三剑客之find
			
查找以ini结尾的文件[root@iZj6cbstl2n6r280a27eppZ app]# find / -name "*.ini"/app/myblog/config.ini ...
 - 封装与继承(PHP学习)
			
什么是封装? 答:封装时不知道内部构造,对外部只展现功能的这种行为.例如:收音机,你不知道收音机内部的构造,但是你知道收音机是能用来听广播的. 在PHP中,封装是,不对外公布,属性和方法,这些属性和方 ...
 - Unit02: CSS 概述 、 CSS 语法 、 CSS 选择器 、 CSS声明
			
Unit02: CSS 概述 . CSS 语法 . CSS 选择器 . CSS声明 my.css p { color: yellow; } demo1.html <!DOCTYPE html&g ...
 - MySql触发器实现数据同步学习
			
触发器实现:(增.删.改操作事件触发数据单向同步)数据库触发器教程:https://www.cnblogs.com/phpper/p/7587031.html同步代码: DELIMITER $ DRO ...
 - JAVA多线程三种实现方式
			
JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...