dubbo+zipkin调用链监控(二)

 去年的时候写过dubbo+zipkin调用链监控,最近看到zipkin2配合brave实现起来会比我之前的实现要简单很多,因为brave将很多交互的内容都封装起来了,不需要自己去写具体的实现,比如如何去构建span,如何去上报数据。

收集器抽象

由于zipkin支持http以及kafka两种方式上报数据,所以在配置上需要做下抽象。

AbstractZipkinCollectorConfiguration

主要是针对下面两种收集方式的一些配置上的定义,最核心的是Sender接口的定义,http与kafka是两类完全不同的实现。

public abstract Sender getSender();

其次是协助性的构造函数,主要是配合构建收集器所需要的一些参数。

  • zipkinUrl

如果是http收集,那么对应的是zipkin api域名,如果是kafka,对应的是kafka集群的地址

  • topic

仅在收集方式为kafka是有效,http时传空值即可。

public AbstractZipkinCollectorConfiguration(String serviceName,String zipkinUrl,String topic){     this.zipkinUrl=zipkinUrl;     this.serviceName=serviceName;     this.topic=topic;     this.tracing=this.tracing(); }

配置上报方式,这里统一采用异常上传,并且配置上报的超时时间。

protected AsyncReporter<Span> spanReporter() {     return AsyncReporter             .builder(getSender())             .closeTimeout(500, TimeUnit.MILLISECONDS)             .build(SpanBytesEncoder.JSON_V2); }

下面这两方法,是配合应用构建span使用的。

注意那个sampler()方法,默认是什么也不做的意思,我们要想看到数据就需要配置成Sampler.ALWAYS_SAMPLE,这样才能真正将数据上报到zipkin服务器。

protected Tracing tracing() {     this.tracing= Tracing             .newBuilder()             .localServiceName(this.serviceName)             .sampler(Sampler.ALWAYS_SAMPLE)             .spanReporter(spanReporter())             .build();     return this.tracing; }  protected Tracing getTracing(){     return this.tracing; }

HttpZipkinCollectorConfiguration

主要是实现getSender方法,可以借用OkHttpSender这个对象来快速构建,api版本采用v2。

public class HttpZipkinCollectorConfiguration extends AbstractZipkinCollectorConfiguration {     public HttpZipkinCollectorConfiguration(String serviceName,String zipkinUrl) {         super(serviceName,zipkinUrl,null);     }      @Override     public Sender getSender() {         return OkHttpSender.create(super.getZipkinUrl()+"/api/v2/spans");     } }

OkHttpSender这个类需要引用这个包

<dependency>     <groupId>io.zipkin.reporter2</groupId>     <artifactId>zipkin-sender-okhttp3</artifactId>     <version>${zipkin-reporter2.version}</version> </dependency>

KafkaZipkinCollectorConfiguration

同样也是实现getSender方法

public class KafkaZipkinCollectorConfiguration extends AbstractZipkinCollectorConfiguration {     public KafkaZipkinCollectorConfiguration(String serviceName,String zipkinUrl,String topic) {         super(serviceName,zipkinUrl,topic);     }      @Override     public Sender getSender() {          return KafkaSender                 .newBuilder()                 .bootstrapServers(super.getZipkinUrl())                 .topic(super.getTopic())                 .encoding(Encoding.JSON)                 .build();     } }

KafkaSender这个类需要引用这个包:


                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信