Отважные падающие пролеты с помощью Sampler.ALWAYS_SAMPLE
Недавно я попытался ввести сэмплер в трассировщик, который я использовал как часть агента Java для обработки входящих и исходящих вызовов RPC. Введение сэмплера привело к странной проблеме, когда 100% выборка будет происходить на моем локальном компьютере, но когда приложение будет развернуто в Cloud Foundry, будет создано несколько диапазонов, причем выборка будет ложной.
Настройка Tracer
public static Tracer tracer;
private Tracing tracing;
private AsyncReporter<zipkin2.Span> spanReporter;
private AgentSender sender;
this.sender = AgentSender.create(configuration.getCollectorURL() + SPAN_PATH);
this.spanReporter = AsyncReporter.create(this.sender);
String serviceName = Bootstrap.AGENT_NAME;
this.tracing = Tracing.newBuilder()
.localServiceName(serviceName)
.sampler(Sampler.ALWAYS_SAMPLE)
.spanReporter(this.spanReporter)
.supportsJoin(true)
.build();
Agent.tracer = tracing.tracer();
Span создать на HTTPServlet
if (Agent.tracer != null) {
//Begin getParentTraceContext
TraceContext parent;
Long zipkinTraceId = parseLong((String) httpServletRequest.getClass().getMethod("getHeader", String.class).invoke(httpServletRequest, "X-B3-TraceId"));
Long zipkinParentId = parseLong((String) httpServletRequest.getClass().getMethod("getHeader", String.class).invoke(httpServletRequest, "X-B3-ParentSpanId"));
Long zipkinSpanId = parseLong((String) httpServletRequest.getClass().getMethod("getHeader", String.class).invoke(httpServletRequest, "X-B3-SpanId"));
boolean sampled = Boolean.parseBoolean((String) httpServletRequest.getClass().getMethod("getHeader", String.class).invoke(httpServletRequest, "X-B3-Sampled"));
if (zipkinTraceId == null || zipkinSpanId == null) {
parent = null;
} else {
parent = TraceContext.newBuilder().traceId(zipkinTraceId).parentId(zipkinParentId).spanId(zipkinSpanId).sampled(sampled).build();
}
//End getParentTraceContext
Span span;
if (parent == null) {
span = Agent.tracer.newTrace();
} else {
span = Agent.tracer.joinSpan(parent);
}
this.setSpan(span);
На данный момент я был в состоянии проверить, что будет произведен промежуток, чей span.context().sampled()
будет ложным Моя теория состоит в том, что что-то работает не совсем правильно при попытке запуска диапазонов в сервлете, когда сервер находится под разумной нагрузкой (~200 запросов в секунду).