Как отслеживать запросы в обычном приложении микросервиса Spring (без загрузки Spring)? - PullRequest
0 голосов
/ 29 мая 2020

Как отслеживать запросы в обычном приложении микросервисов Spring (без загрузки Spring)? Я знаю, что загрузка Spring дает Sleuth, но я хотел сделать то же самое для приложения, отличного от Spring, это обычное приложение Spring. Когда запрос проходит через разные микросервисы, мы хотим их отследить.

1 Ответ

0 голосов
/ 29 мая 2020
  1. Вам необходимо настроить приложение Spring для использования журнала. xml файл для ведения журнала.
  2. Создайте перехватчик, который будет устанавливать дополнительные контексты MD C, как это делает Сыщик.
  3. Вам необходимо передать те же дополнительные контексты MD C другим службам в заголовках HTTP.

Конфигурация входа в систему

<configuration>
      <appender class="ch.qos.logback.core.ConsoleAppender" name="STDOUT">
        <encoder>
          <pattern>[%date{dd-MM-yyyy HH:mm:ss.SSS}]  [%thread] %-5level %X{traceId:-} %X{spanId:-} ${PID:-} %logger{36} - %msg%n</pattern>
        </encoder>
      </appender>
      <appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="FILE">
        <encoder>
          <pattern>[%date{dd-MM-yyyy HH:mm:ss.SSS}]  [%thread] %-5level %X{traceId:-} %X{spanId:-} ${PID:-} %logger{36} - %msg%n</pattern>
        </encoder>
        <file>log/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <fileNamePattern>log/app.%d{yyyy-MM-dd-HH}.log</fileNamePattern>
          <maxHistory>30</maxHistory>
          <totalSizeCap>200MB</totalSizeCap>
        </rollingPolicy>
      </appender>

      <logger level="INFO" name="root">
        <appender-ref ref="STDOUT"/>
      </logger>
    </configuration>

Перехватчик, который устанавливает MD C контекст для трассировки.

@Slf4j
public class LoggerInterceptor implements HandlerInterceptor {
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {
    String traceId = request.getHeader("TRACE_ID");
    String spanId = request.getHeader("SPAN_ID");
    if (traceId == null) {
      traceId = UUID.randomUUID().toString();
    }
    // You can generate new spanId or use the same one
    if (spanId == null) {
      spanId = UUID.randomUUID().toString();
    }
    MDC.put("TRACE_ID", traceId);
    MDC.put("traceId", traceId);
    MDC.put("SPAN_ID", spanId);
    MDC.put("spanId", spanId);
    log.info("[preHandle] HTTP: {}, URL: {} ", request.getMethod(), request.getRequestURI());
    return true;
  }

  @Override
  public void postHandle(
      HttpServletRequest request,
      HttpServletResponse response,
      Object handler,
      ModelAndView modelAndView)
      throws Exception {
    log.info("[postHandle] HTTP: {}, URL: {} ", request.getMethod(), request.getRequestURI());
    MDC.clear();
  }
}

Если вы хотите измерить время выполнения, тогда добавьте профилировщик для того же. Подробнее об этом читайте в примере Профилирование Spring Boot , там указано c о загрузке Spring, но вы можете использовать тот же подход и в приложении Spring.

Если вы ' Если вы используете RestTemplate, вы можете установить эти заголовки.

  HttpHeaders headers = new HttpHeaders();
  headers.set("TRACE_ID", MDC.get("TRACE_ID"));
  headers.set("SPAN_ID", MDC.get("SPAN_ID"));

  HttpEntity entity = new HttpEntity(headers);
  RestTemplate restTemplate = new RestTemplate();
  SimpleClientHttpRequestFactory rf =
      (SimpleClientHttpRequestFactory) restTemplate.getRequestFactory();
  rf.setReadTimeout(2 * Constants.ONE_MILLI_INT);
  rf.setConnectTimeout(2 * Constants.ONE_MILLI_INT);
  ResponseEntity<String> response =
      restTemplate.exchange(url, HttpMethod.GET, entity, String.class);

В этом простом примере были установлены заголовки TRACE_ID и SPAN_ID.

...