zipkin源码 3.zipkin client brave-okhttpclient

之前分析了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四种拦截器来处理的。

转载于:https://my.oschina.net/u/913896/blog/793912

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值