运维开发网

APM之jaeger php源码理解

运维开发网 https://www.qedev.com 2021-04-14 16:12 出处:51CTO 作者:似氺流年
flags:是否进行采样,根据采样策略来定,True代表采样Reference对象包含Span之间的关系及SpanContextSpanContext对象包含Span信息及baggageinject是将SpanContext中的Span及baggage信息写入carrier中,carrier是数组extract是将carrier中的Span信息写入SpanContext中(traceId、span
  1. flags:是否进行采样,根据采样策略来定,True代表采样
  2. Reference对象包含 Span之间的关系及SpanContext
  3. SpanContext对象包含 Span信息及baggage
  4. inject是将SpanContext中的Span及baggage信息写入carrier中,carrier是数组
  5. extract是将carrier中的Span信息写入SpanContext中(traceId、spanId、parentId、flags,Baggage)
  6. Span对象包括SpanContext对象、Reference对象、operationName、startTime、logs、tags
  7. Tracer对象包括reporter、sampler、gen128bit、scopeManager、spans、tags、process、serverName、propagator、processThrift
  8. traceIdLow、traceIdHigh生成方式:microtime(true) * 10000 . rand(10000, 99999); rootSpanID等于traceIdLow。如果设置gen128bit,则设置traceIdHigh;子Span的traceIdLow、traceIdHigh都继承父Span的,子SpanID创建时生成。
  9. TraceId:如果设置gen128bit。%x%016x "16进制$traceIdHigh" + "16进制$traceIdLow(不足16位前面补0)";否则TraceId等于$traceIdLow,也等于rootSpanId
  10. 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'
  11. 某网友对Java中ScopeManager和Scope的理解:在多线程环境下ScopeManager管理着各个线程的Scope,而每个线程中的Scope管理着该线程中的Span。这样当某个线程需要获取其线程中当前 活动的 span时,可以通过ScopeManager找到对应该线程的Scope,并从Scope中取出该线程 活动的 span
  12. 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
  13. tracer和Span都存在tags属性,其中tracer的tags属性会将信息记录在ES的Process中
  14. RateLimitingSampler类,控制每秒流量的一个采样类。php目前未实现,python已实现,每次都会根据上次调用与这次调用的时间差乘以我们设置的maxTracesPerSecond参数并累加后与1比较,超过1就返回true,并且让其减去1,否则返回false,继续累加
  15. Span的finish方法标志着span的结束,finish方法还只是校验和记录的作用,真正发送span的是tracer对象的flush方法
  16. 在部署jaeger系统测试时发现当jaeger-service索引手动删除后,然后再进行追踪时发现jaeger-service索引不能被自动创建,通过ES查看发现只有 jaeger-span*索引被创建。通过github询问作者,作者回复如下
    by design collector caches service names(service name with operation name). If the service index is deleted collector will not recreate the index (and store the data). The cache expiration is set to 48h.
    Make sure you do not delete all service indices and also keep at least 2 days of historical data.

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

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

精彩评论

暂无评论...
验证码 换一张
取 消