天天看点

APM之jaeger php源码理解

flags:是否进行采样,根据采样策略来定,True代表采样

Reference对象包含 Span之间的关系及SpanContext

SpanContext对象包含 Span信息及baggage

inject是将SpanContext中的Span及baggage信息写入carrier中,carrier是数组

extract是将carrier中的Span信息写入SpanContext中(traceId、spanId、parentId、flags,Baggage)

Span对象包括SpanContext对象、Reference对象、operationName、startTime、logs、tags

Tracer对象包括reporter、sampler、gen128bit、scopeManager、spans、tags、process、serverName、propagator、processThrift

traceIdLow、traceIdHigh生成方式:microtime(true) * 10000 . rand(10000, 99999); rootSpanID等于traceIdLow。如果设置gen128bit,则设置traceIdHigh;子Span的traceIdLow、traceIdHigh都继承父Span的,子SpanID创建时生成。

TraceId:如果设置gen128bit。%x%016x "16进制$traceIdHigh" + "16进制$traceIdLow(不足16位前面补0)";否则TraceId等于$traceIdLow,也等于rootSpanId

python jaeger中TEXT_MAP和HTTP_HEADERS使用同一套编码方式, inject时carrier必须为字典, requests.get传的header参数就是dict。 extract时判断carrier必须有items方法,虽然request.headers为EnvironHeaders对象,但是有item方法,和dict操作类似。三种编码方式BINARY = 'binary';TEXT_MAP = 'text_map';HTTP_HEADERS = 'http_headers'

某网友对Java中ScopeManager和Scope的理解:在多线程环境下ScopeManager管理着各个线程的Scope,而每个线程中的Scope管理着该线程中的Span。这样当某个线程需要获取其线程中当前 活动的 span时,可以通过ScopeManager找到对应该线程的Scope,并从Scope中取出该线程 活动的 span

startSpan或者startActiveSpan需指定操作名及option。option是数组,key可以为child_of,指定父span;也可以为references,值为array,可为多个,child_of和references只允许有一个存在,option中也可指定tags,start_time,finish_span_on_close,传进去的tags会设置为Span的tags。StartSpanOptions

tracer和Span都存在tags属性,其中tracer的tags属性会将信息记录在ES的Process中

RateLimitingSampler类,控制每秒流量的一个采样类。php目前未实现,python已实现,每次都会根据上次调用与这次调用的时间差乘以我们设置的maxTracesPerSecond参数并累加后与1比较,超过1就返回true,并且让其减去1,否则返回false,继续累加

Span的finish方法标志着span的结束,finish方法还只是校验和记录的作用,真正发送span的是tracer对象的flush方法

在部署jaeger系统测试时发现当jaeger-service索引手动删除后,然后再进行追踪时发现jaeger-service索引不能被自动创建,通过ES查看发现只有 jaeger-span*索引被创建。通过github询问作者,作者回复如下

意思是Jaeger-Collector中设计的jaeger-service索引的缓存时间是48小时。但是经过测试,删除jaeger-service索引后再被自动创建是随机的,可能几分钟内就会被自动创建

Agent的服务队列是有长度限制(default 1000),如果堆积超过1000个,Agent就会毫不怜悯的把数据丢掉。当然在这里并没有不妥,Jaeger的定位就是一套日志系统,不太看重数据的可靠性。如果要想减少数据丢失的问题,可通过配置或增加Agent节点。因为Jaeger和NSQ对于数据的定位不一样,所以就不对比这部分功能。NSQ比较注重数据的可靠性。

tracer设置的tag将被记录在process中,span设置的tag将被记录在Tags中

继续阅读