zipkin源码学习

本文探讨了zipkin在业务中的应用,详细分析了配置类中的拦截器`brave.serverRequestInterceptor()`,该拦截器能够捕获请求的全部信息。同时,还解释了`brave.clientRequestInterceptor()`的作用,它负责在请求中传递traceid和spanid到下游服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务使用zipkin,需要在配置类

@Configuration
public class ZipkinBean {

    /**
     * 配置收集器
     *
 * @return
 */
@Bean
public SpanCollector spanCollector() {
    Config config = HttpSpanCollector.Config.builder().compressionEnabled(false).connectTimeout(5000)
            .flushInterval(1).readTimeout(6000).build();
    return HttpSpanCollector.create("http://192.168.119.158:9411", config, new EmptySpanCollectorMetricsHandler());
}

/**
 * Brave各工具类的封装
 *
 * @param spanCollector
 * @return
 */
@Bean
public Brave brave(SpanCollector spanCollector) {
    Builder builder = new Builder("service2");// 指定serviceName
    builder.spanCollector(spanCollector);
    builder.traceSampler(Sampler.create(1));// 采集率
    return builder.build();
}

/**
 * 拦截器,需要serverRequestInterceptor,serverResponseInterceptor 分别完成sr和ss操作
 *
 * @param brave
 * @return
 */
@Bean
public BraveServletFilter braveServletFilter(Brave brave) {
    return new BraveServletFilter(brave.serverRequestInterceptor(), brave.serverResponseInterceptor(),
            new DefaultSpanNameProvider());
}

/**
 * httpClient客户端,需要clientRequestInterceptor,clientResponseInterceptor分别完成cs和cr操作
 *
 * @param brave
 * @return
 */
@Bean
public CloseableHttpClient httpClient(Brave brave) {
    CloseableHttpClient httpclient = HttpClients.custom()
            .addInterceptorFirst(new BraveHttpRequestInterceptor(brave.clientRequestInterceptor(),
                    new DefaultSpanNameProvider()))
            .addInterceptorFirst(new BraveHttpResponseInterceptor(brave.clientResponseInterceptor())).build();
    return httpclient;
    }
}

其中的拦截器brave.serverRequestInterceptor()即为下面的这个类:

package com.github.kristofa.brave;

import com.github.kristofa.brave.internal.Util;
import java.util.Iterator;
import java.util.logging.Logger;

public class ServerRequestInterceptor {
    private static final Logger LOGGER = Logger.getLogger(ServerRequestInterceptor.class.getName());
    private final ServerTracer serverTracer;

    public ServerRequestInterceptor(ServerTracer serverTracer) {
        this.serverTracer = (ServerTracer)Util.checkNotNull(serverTracer, "Null serverTracer", new Object[0]);
    }

    public void handle(ServerRequestAdapter adapter) {
        this.serverTracer.clearCurrentSpan();
        TraceData traceData = adapter.getTraceData();
        Boolean sample = traceData.getSample();
        if (sample != null && Boolean.FALSE.equals(sample)) {
            this.serverTracer.setStateNoTracing();
            LOGGER.fine("Received indication that we should NOT trace.");
        } else {
            if (traceData.getSpanId() != null) {
            LOGGER.fine("Received span information as part of request.");
            SpanId spanId = traceData.getSpanId();
            this.serverTracer.setStateCurrentTrace(spanId.traceId, spanId.spanId, spanId.nullableParentId(), adapter.getSpanName());
        } else {
            LOGGER.fine("Received no span state.");
            this.serverTracer.setStateUnknown(adapter.getSpanName());
        }

        this.serverTracer.setServerReceived();
        Iterator var6 = adapter.requestAnnotations().iterator();

        while(var6.hasNext()) {
            KeyValueAnnotation annotation = (KeyValueAnnotation)var6.next();
            this.serverTracer.submitBinaryAnnotation(annotation.getKey(), annotation.getValue());
        }
    }

}

}

可以看到这个adaptor获取到了请求的所有内容:

在这里插入图片描述

拦截器 brave.clientRequestInterceptor()作用为:将tranceid和spanid等发往下一个节点

package com.github.kristofa.brave;

import com.github.kristofa.brave.internal.Util;
import com.twitter.zipkin.gen.Endpoint;
import java.util.Iterator;

public class ClientRequestInterceptor {
    private final ClientTracer clientTracer;

    public ClientRequestInterceptor(ClientTracer clientTracer) {
        this.clientTracer = (ClientTracer)Util.checkNotNull(clientTracer, "Null clientTracer", new Object[0]);
    }

    public void handle(ClientRequestAdapter adapter) {
        SpanId spanId = this.clientTracer.startNewSpan(adapter.getSpanName());
        if (spanId == null) {
            adapter.addSpanIdToRequest((SpanId)null);
        } else {
            adapter.addSpanIdToRequest(spanId);
            Iterator var3 = adapter.requestAnnotations().iterator();

            while(var3.hasNext()) {
                KeyValueAnnotation annotation = (KeyValueAnnotation)var3.next();
                this.clientTracer.submitBinaryAnnotation(annotation.getKey(), annotation.getValue());
            }

            this.recordClientSentAnnotations(adapter.serverAddress());
        }

    }

    private void recordClientSentAnnotations(Endpoint serverAddress) {
        if (serverAddress == null) {
            this.clientTracer.setClientSent();
        } else {
            this.clientTracer.setClientSent(serverAddress.ipv4, serverAddress.port, serverAddress.service_name);
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值