Пользовательский стартер весенней загрузки не заполняет контекст MD C - PullRequest
0 голосов
/ 15 января 2020

Я работаю над настраиваемым стартером с пружинной загрузкой, чтобы обеспечить автоматическую настройку для всех приложений с пружинной загрузкой, которые есть в нашей распределенной системе, поэтому каждый раз, когда необходимо изменить конфигурацию, может быть сделано в одном месте, вместо того, чтобы проходить через все разные приложения, применяющие изменения, вместо этого достаточно просто обновления версии зависимости.

У меня есть собственные запросчики запросов и ответов для выборки URI запроса и статуса ответа и используя GenericFilterBean, я перехватываю http-запросы и заполняю значения в MD C, чтобы он был доступен во время регистрации, это хорошо работает с интеграционным тестом самого модуля, однако контекст MD C недоступен, когда этот модуль включен в виде библиотеки в другие службы.

Мои пользовательские шаблоны HttpResolvers, GenericFilterBean и log приведены ниже

public interface HttpRequestResolver {

 String resolve(HttpServletRequest request);

 String name();

 default int order() {
   return -1;
 }
}
public class Resolvers {

  public static HttpRequestResolver uriResolver() {
    return new HttpRequestResolver() {
      @Override
      public String resolve(HttpServletRequest request) {
        return StringUtils.defaultString(request.getRequestURI(), "n/a");
      }

      @Override
      public String name() {
        return "uri";
      }
    };
  }

  public static HttpResponseResolver status() {
    return new HttpResponseResolver() {
      @Override
      public String resolve(HttpServletResponse response) {
        return StringUtils.defaultString(String.valueOf(response.getStatus()), "-1");
      }

      @Override
      public String name() {
        return "status";
      }
    };
  }
}

GenericFilterBean:

@Order(TraceWebServletAutoConfiguration.TRACING_FILTER_ORDER + 1)
public class MyTraceLoggingFilter extends GenericFilterBean {

  private static final Logger plog = LoggerFactory.getLogger("PERF");
  private final List<HttpRequestResolver> requestResolvers;
  private final List<HttpResponseResolver> responseResolvers;

  @Value("${spring.application.name}")
  private String appName;

  public MyTraceLoggingFilter (
      List<HttpRequestResolver> requestResolvers, List<HttpResponseResolver> responseResolvers) {
    this.requestResolvers = requestResolvers;
    this.responseResolvers = responseResolvers;
  }

  @Override
  public void doFilter(
      ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
      throws IOException, ServletException {
    long start = System.currentTimeMillis();
    try {

      requestResolvers
          .stream()
          .forEach(r -> MDC.put(r.name(), r.resolve((HttpServletRequest) servletRequest)));

      filterChain.doFilter(servletRequest, servletResponse);

    } finally {

      responseResolvers.forEach(
          r -> MDC.put(r.name(), r.resolve((HttpServletResponse) servletResponse)));

      long elapsed = System.currentTimeMillis() - start;
      MDC.put("rt", elapsed + "ms");
      MDC.put("appName", appName);

      plog.info(".");
    }
  }
}

logback-spring. xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <property name="PERF_LOG_PATTERN"
              value="%clr(appName:%X{appName:-n/a}) %clr(time:%d{yyyy-MM-ddHH:mm:ss.SSS}) %clr(traceId:%X{X-B3-TraceId:-n/a}) %clr(spanId:%X{X-B3-SpanId:-n/a}) %clr(parentSpanId:%X{X-B3-ParentSpanId:-n/a}) %clr(uri:%X{uri:-n/a}) %clr(rt:%X{rt:-n/a}) %clr(status:%X{status:-n/a})"/>

    <!-- Appender to log to console -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- Minimum logging level to be presented in the console logs-->
            <level>INFO</level>

        </filter>
        <encoder>
            <pattern>${PERF_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <logger name="PERF" level="INFO">
        <appender-ref ref="console"/>
    </logger>

</configuration>

Итак, когда модуль включен в другой сервис, тогда он печатает только **INFO PERF-.**

Может кто-нибудь предложить, пожалуйста, какой еще конфиг я должен включить, чтобы это работало. Заранее спасибо.

...