Отважные падающие пролеты с помощью 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 запросов в секунду).

0 ответов

Другие вопросы по тегам