文档章节

zipkin源码 3.zipkin client brave-okhttpclient

markeloff
 markeloff
发布于 2016/11/24 21:20
字数 425
阅读 80
收藏 0

之前分析了sr,ss,接下来分析cr,cs 下面以okhttp client为例:

@Bean
public OkHttpClient okHttpClient(Brave brave) {
    OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(
                    new BraveOkHttpRequestResponseInterceptor(
                            brave.clientRequestInterceptor(),
                            brave.clientResponseInterceptor(),
                            new DefaultSpanNameProvider()))
            .build();
    return client;
}

上面代码创建了OkHttpClient,并且织入了拦截器,在真正请求执行前、后触发。

下面看BraveOkHttpRequestResponseInterceptor的intercept方法

@Override
  public Response intercept(Chain chain) throws IOException {
    Request request = chain.request();
    Request.Builder builder = request.newBuilder();
    OkHttpRequest okHttpRequest = new OkHttpRequest(builder, request);
    //前置处理
    clientRequestInterceptor.handle(new HttpClientRequestAdapter(okHttpRequest, spanNameProvider));
    if(request.url()!=null&&request.url().query()!=null){
      clientTracer.submitBinaryAnnotation("params",request.url().query());
    }
    //真正的请求处理
    Response response = chain.proceed(builder.build());
    //后置处理
    clientResponseInterceptor.handle(new HttpClientResponseAdapter(new OkHttpResponse(response)));
    return response;
  }

首先看前置处理:

public class ClientRequestInterceptor {

    private final ClientTracer clientTracer;

    public ClientRequestInterceptor(ClientTracer clientTracer) {
        this.clientTracer = checkNotNull(clientTracer, "Null clientTracer");
    }

    /**
     * Handles outgoing request.
     *
     * @param adapter The adapter deals with implementation specific details.
     */
    public void handle(ClientRequestAdapter adapter) {
        //通过clientTracer创建SpanId,对应有ServerTracer
        SpanId spanId = clientTracer.startNewSpan(adapter.getSpanName());
        if (spanId == null) {
            // We will not trace this request.
            adapter.addSpanIdToRequest(null);
        } else {
            //将span信息放入header中,便于传递
            adapter.addSpanIdToRequest(spanId);
            //jiang将uri信息存入binaryAnnotation
            for (KeyValueAnnotation annotation : adapter.requestAnnotations()) {
                clientTracer.submitBinaryAnnotation(annotation.getKey(), annotation.getValue());
            }
            //添加cs annotation到span
            recordClientSentAnnotations(adapter.serverAddress());
        }
    }

    private void recordClientSentAnnotations(Endpoint serverAddress) {
        if (serverAddress == null) {
            clientTracer.setClientSent();
        } else {
            clientTracer.setClientSent(serverAddress);
        }
    }
}

下面看后置处理:

public class ClientResponseInterceptor {

    private final ClientTracer clientTracer;

    public ClientResponseInterceptor(ClientTracer clientTracer) {
        this.clientTracer = checkNotNull(clientTracer, "Null clientTracer");
    }

    /**
     * Handle a client response.
     *
     * @param adapter Adapter that hides implementation details.
     */
    public void handle(ClientResponseAdapter adapter) {
        try {
            //将响应码添加到BinaryAnnotation
            for (KeyValueAnnotation annotation : adapter.responseAnnotations()) {
                clientTracer.submitBinaryAnnotation(annotation.getKey(), annotation.getValue());
            }
        }
        finally
        {    
            //设置cr状态,并且提交span
            clientTracer.setClientReceived();
        }
    }
}

其实还有一种trace,那就是lc,即localTracer,它的使用方法如下:

 //生成新的span
 localTracer.startNewSpan("codec", "encode");
   try {
    //业务处理
   } finally {
     tracer.finishSpan();
   }

localTracer可以嵌入业务代码,根据自己的业务需求添加,跟踪代码块比如file io操作,业务指标比如下单次数等。

总结

1.zipkin brave基于ServerRequestInterceptor、ServerResponseInterceptor、ClientRequestInterceptor、ClientResponseInterceptor四种拦截器来处理的。

© 著作权归作者所有

markeloff
粉丝 5
博文 18
码字总数 23124
作品 0
南京
高级程序员
私信 提问
zipkin源码目录

client 1.zipkin源码 1.简介 2.zipkin源码 2.zipkin client brave-springmvc 3.zipkin源码 3.zipkin client brave-okhttpclient 4.zipkin源码 4.reporter 5.zipkin源码 5.thrift编码分析 待续......

markeloff
2016/11/24
146
0
ZipKin原理学习--ZipKin入门介绍

ZipKin入门介绍 Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper的论文设计而来,由 Twitter 公司开发贡献。其主要功能是聚集来自各个异构系...

qq924862077
2018/05/12
0
0
ZipKin原理学习(分布式实时数据追踪系统)+window部署zipkin+k8s部署zipkin

版权声明:本文为博主原创文章,转载请注明来源。开发合作联系luanpenguestc@sina.com https://blog.csdn.net/luanpeng825485697/article/details/85772954 ZipKin入门介绍 Zipkin是一款开源...

数据架构师
01/08
0
0
采用brave接入zipkin实现自定义rpc跟踪

本文假设你已经阅读过Dapper文章:http://bigbully.github.io/Dapper-translation/,对分布式服务跟踪有了初步了解。另一篇zipkin的介绍文章(基础篇)可以参考:http://www.tangrui.net/im...

郑浩锋
2016/08/23
3.2K
2
zipkin源码 2.zipkin client brave-springmvc

brave是zipkin的java客户端,负责数据收集以及上传。首先看下怎么构造一个brave对象: 下面分析brave怎么集成springmvc的: ServerRequestInterceptor处理逻辑: ServerResponseInterceptor处...

markeloff
2016/11/24
207
0

没有更多内容

加载失败,请刷新页面

加载更多

实战项目-学成在线(一)

之前看的黑马程序员实战项目之一,打算以博客的形式写出来,也让自己重新温习一下。 1、项目背景 略(就是当前这东西很火,我们重点在开发,这些就略过) 2、功能模块 门户,学习中心,教学管...

lianbang_W
19分钟前
2
0
基于Vue的数字输入框组件开发

本文转载于:专业的前端网站➫基于Vue的数字输入框组件开发 1、概述 Vue组件开发的API:props、events和slots 2、组件代码 github地址:https://github.com/MengFangui/VueInputNumber 效果:...

前端老手
28分钟前
2
0
百度地图根据经纬度获取运动轨迹

<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1.0, user-scalable=n......

泉天下
30分钟前
4
0
学习记录(day04-axios增删改查、v-for循环、页面加载成功处理函数)

[TOC] 1.1 基本语法:插值表达式 <template> <div> {{username}} <br/> {{1+2+3}} <br/> {{'你的名字是:' + username}} <br/> {{'abc'.split('')}} </div><......

庭前云落
今天
3
0
CentOS Linux 7上将ISO映像文件写成可启动U盘

如今,电脑基本上都支持U盘启动,所以,可以将ISO文件写到U盘上,用来启动并安装操作系统。 我想将一个CentOS Linux 7的ISO映像文件写到U盘上,在CentOS Linux 7操作系统上,执行如下命令: ...

大别阿郎
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部