Программная трассировка с помощью Opentelemetry и виртуальных потоковJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Программная трассировка с помощью Opentelemetry и виртуальных потоков

Сообщение Anonymous »

Нормально, например, что мой запрос сначала прибывает в oneperrequestfilter , а затем переходит в requestmdcinterceptor , который захватывает Traceid и Spanid. После этого он проходит через несколько вызовов в фильтре, таких как сохранение клавиши iDempotence в памяти. Во всех журналах Traceid остается прежним, но панель изменений. Это правильное поведение?@Component
public class RequestMdcInterceptor implements HandlerInterceptor {

private static final Logger log = LoggerFactory.getLogger(RequestMdcInterceptor.class);

private final BuildProperties buildProperties;

public RequestMdcInterceptor(final BuildProperties buildProperties) {
this.buildProperties = Objects.requireNonNull(buildProperties);
}

@Override
public boolean preHandle(
final HttpServletRequest request,
@NonNull final HttpServletResponse response,
@NonNull final Object handler
) {
final var aCurrentSpan = Span.fromContext(Context.current());

MDC.put("appName", buildProperties.getName());
MDC.put("appVersion", buildProperties.getVersion());
MDC.put("appBuildDate", buildProperties.getTime().toString());
MDC.put("traceId", aCurrentSpan.getSpanContext().isValid() ? aCurrentSpan.getSpanContext().getTraceId() : " ");
MDC.put("spanId", aCurrentSpan.getSpanContext().isValid() ? aCurrentSpan.getSpanContext().getSpanId() : " ");
MDC.put("host", request.getHeader("Host"));
MDC.put("requestMethod", request.getMethod());
MDC.put("userAgent", request.getHeader("User-Agent"));
MDC.put("requestUri", request.getRequestURI());
MDC.put("clientIp", request.getRemoteAddr());
if (request.getHeader("b3") != null) {
MDC.put("b3", request.getHeader("b3"));
} else {
MDC.put("b3", " ");
}

log.debug("Request: {}", MDC.getCopyOfContextMap());

return true;
}
}

file aspencationhelper.java
public class ObservationHelper {
private static final Logger log = LoggerFactory.getLogger(ObservationHelper.class);

private final OpenTelemetry openTelemetry;

public ObservationHelper(OpenTelemetry openTelemetry) {
this.openTelemetry = openTelemetry;
}

public void withObservation(String tracerName, String spanName, Function block) {
Tracer tracer = openTelemetry.getTracer(tracerName);
Span span = tracer.spanBuilder(spanName)
.setParent(Context.current()).startSpan();

try (Scope scope = span.makeCurrent()) {
log.debug("Starting span: {} {}", spanName, span.getSpanContext());
block.apply(span);
} catch (Exception e) {
span.recordException(e);
throw e;
} finally {
span.end();
}
}
}

file inmemoryemempotencekeygateway.java
@Override
public void save(final String idempotencyKey, final long ttl, final TimeUnit timeUnit) {
this.observationHelper.withObservation(
"in_memory_idempotency_key_save",
"idempotency_key_initial_save",
(span) -> {
span.setAttribute("idempotency", idempotencyKey);
span.setAttribute("ttl", String.valueOf(ttl));
span.setAttribute("time_unit", timeUnit.name());

log.debug("Saving idempotency key: {}", idempotencyKey);
this.idempotencyKeyMap.put(idempotencyKey, Json.writeValueAsString(
new IdempotencyKeyDTO(0, "", Map.of())
));
log.info("Idempotency key saved: {}", idempotencyKey);
return idempotencyKey;
}
);
}

@Override
public void save(final String idempotencyKey, final IdempotencyKeyInput body, final long ttl, final TimeUnit timeUnit) {
this.observationHelper.withObservation(
"in_memory_idempotency_key_save",
"idempotency_key_save",
(span) -> {
span.setAttribute("idempotency", idempotencyKey);
span.setAttribute("ttl", String.valueOf(ttl));
span.setAttribute("time_unit", timeUnit.name());

log.debug("Saving idempotency key with body: {}", idempotencyKey);
this.idempotencyKeyMap.put(idempotencyKey, Json.writeValueAsString(body));
log.info("Idempotency key saved with body: {}", idempotencyKey);
return idempotencyKey;
}
);
}

Пример для журналов
17:30:55.843-0300 [XNIO-1 task-2] [d3ce3145df80dc59fe55baa48042e995] [094c62c947f7e5c7] DEBUG c.k.t.i.i.IdempotencyKeyFilter - Processing the idempotency key filter
17:30:55.845-0300 [XNIO-1 task-2] [d3ce3145df80dc59fe55baa48042e995] [6d98d056f883688b] INFO c.k.t.i.utils.ObservationHelper - Starting span: process_idempotency_key_filter ImmutableSpanContext{traceId=d3ce3145df80dc59fe55baa48042e995, spanId=6d98d056f883688b, traceFlags=01, traceState=ArrayBasedTraceState{entries=[]}, remote=false, valid=true}
17:30:55.849-0300 [XNIO-1 task-2] [d3ce3145df80dc59fe55baa48042e995] [6d98d056f883688b] DEBUG c.k.t.i.i.IdempotencyKeyFilter - Idempotency key not found, saving before processing the request [key:123e4567-e89b-12d3-a456-426614174000] [ttl:1] [timeUnit:HOURS]
17:30:55.851-0300 [XNIO-1 task-2] [d3ce3145df80dc59fe55baa48042e995] [4bd2a564148311c4] INFO c.k.t.i.utils.ObservationHelper - Starting span: idempotency_key_initial_save ImmutableSpanContext{traceId=d3ce3145df80dc59fe55baa48042e995, spanId=4bd2a564148311c4, traceFlags=01, traceState=ArrayBasedTraceState{entries=[]}, remote=false, valid=true}
17:30:55.851-0300 [XNIO-1 task-2] [d3ce3145df80dc59fe55baa48042e995] [4bd2a564148311c4] DEBUG c.k.t.i.i.g.InMemoryIdempotencyKeyGateway - Saving idempotency key: 123e4567-e89b-12d3-a456-426614174000
17:30:55.890-0300 [XNIO-1 task-2] [d3ce3145df80dc59fe55baa48042e995] [4bd2a564148311c4] INFO c.k.t.i.i.g.InMemoryIdempotencyKeyGateway - Idempotency key saved: 123e4567-e89b-12d3-a456-426614174000
17:30:55.898-0300 [XNIO-1 task-2] [d3ce3145df80dc59fe55baa48042e995] [6d98d056f883688b] DEBUG c.k.t.i.c.i.RequestMdcInterceptor - Request: {traceId=d3ce3145df80dc59fe55baa48042e995, spanId=6d98d056f883688b, b3= , appVersion=0.1.0, appBuildDate=2025-01-30T20:30:51.830Z, appName=java-template, requestMethod=POST, clientIp=127.0.0.1, host=localhost:8081, userAgent=curl/7.81.0, requestUri=/api/hello/rest}


Подробнее здесь: https://stackoverflow.com/questions/794 ... al-threads
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»