美文网首页
brave二次开发

brave二次开发

作者: flystarts | 来源:发表于2023-12-25 12:19 被阅读0次

brave是zipkin提供的调用链sdk,提供了丰富的调用链埋点能力,既可以直接使用,也适合二次开发

先看一下他的几个核心类:
Tracing: 核心的跟踪类,一般全局一个bean,用来表示当前的跟踪对象,本身是一个抽象类,需要我们扩展成一个具体类。里边包装了Tracer、Sampler等关键类和spanHandlers、setNoop方法:
Tracer:用来生成span。关键方法 nextSpan:生成一个span; currentSpan:获取当前span
Sampler:抽象类,定义了isSampled采样接口,用户可以扩展此类实现自己的采样
CurrentTraceContext:保存当前上下文
TraceContext:上下文,里边包括了traceId、spanId、parentId、extraList
spanHandlers:返回注册的span处理器,SpanHandler接口类提供了begin和end两个接口,用来在span开始和结束时进行一些处理
setNoop:用于设置Tracing开关是否打开,如果关闭,则不生成span

Span:抽象类,几个关键方法:isNoop context start
RealSpan: span的子类,里边有个MutableSpan,里边定义了span的字段:
String traceId, localRootId, parentId, id;
long startTimestamp, finishTimestamp;
String name, localServiceName, localIp, remoteServiceName, remoteIp;
int localPort, remotePort;
Object[] tags , annotations ;

NoopSpan:采样没中的时候生成的空span,里边没有数据,只有TraceContext
LazySpan:只是个代理类,会委托给RealSpan或NoopSpan

下面来看一下二次开发要做哪些:
1、配置Tracing对象,调用他的Builder来创建,主要需要设置:
localServiceName:服务名
sampler: 注册采样器,不配默认是ALWAYS_SAMPLE。默认提供了几种
BoundarySampler:按百分比采样,精确度不高,性能好
CountingSampler:按百分比采样, 基于计数器来实现,统计的百分比是精准的,适合小流量应用
RateLimitingSampler:按每秒个数采样
我们可以自定义一个Sampler来实现定制需求,比如按照url来决定是否采样

currentTraceContext:注册上下文
traceId128Bit:是否生成128位的traceID,不配生成64位
addSpanHandler:注册span handler,通过注册span来实现span的输出,比如上报到zipkin(ZipkinSpanHandler)或者打印到文件(LogSpanHandler)

常用打点:

1、服务端rest接口:
通过spring注册filter,
通过TracingFilter可以生成默认的filter
Filter tracingFilter = TracingFilter.create(httpTracing),在这个filter里会生成一个scope,然后继续filter
Scope scope = currentTraceContext.newScope(span.context());
try {
// any downstream code can see Tracer.currentSpan() or use Tracer.currentSpanCustomizer()
chain.doFilter(req, res);
}

注册inteceptor:SpanCustomizingAsyncHandlerInterceptor,作用:
打上class和method、error标签
customizer.tag("mvc.controller.class", handlerMethod.getBeanType().getSimpleName());
customizer.tag("mvc.controller.method", handlerMethod.getMethod().getName());
request.setAttribute("error", ex);

2、rest客户端打点:
RestTemplate template = new RestTemplate();
template.setInterceptors(
Arrays.asList(new TracingClientHttpRequestInterceptor[]
{tracingClientHttpRequestInterceptor}));
还有其他rest客户端也是类似的,brave已经为常用的客户端提供了默认打点

3、mysql:
?statementInterceptors=brave.mysql.TracingStatementInterceptor

brave自身提供了很多组件的打点,参考:https://github.com/openzipkin/brave/tree/master/instrumentation
有些他本身没提供的,也可以通过组件本身的钩子机制来实现打点,比如druid连接池,需要实现一个FilterEventAdapter

常见的几种定制:
1、对调用链进行自定义输出
比如希望将调用链转成自己的格式上报到自己的服务端,可以定义一个span handler,调addSpanHandler注册上去
2、自定义采样算法,定义一个Sampler注册
3、根据url控制是否采样
我们并不能根据url来控制是否采样(采样的接口入参只有traceID),但可以根据url控制span是否输出。可以注册一个filter,根据url去设置BaggageField,利用BaggageField的传递机制把这个标志传递到整条trace,输出的时候根据这个标志控制是否输出
配置BaggageField:
BaggageField baggageField = BaggageField.create("X-B3-XXX");
在创建tracing对象时加上:
.propagationFactory(BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY)
.add(SingleBaggageField.remote(baggageField))
.build())
在filter里给他赋值:
BaggageField.getByName("X-B3-xxx").updateValue("true");

相关文章

网友评论

      本文标题:brave二次开发

      本文链接:https://www.haomeiwen.com/subject/ppnsgdtx.html