From 44651d903d83f9256c324ec2a3c8886e91e1e433 Mon Sep 17 00:00:00 2001 From: vempo Date: Mon, 6 Aug 2018 16:21:01 +0300 Subject: Minor improvements to logging for servlets Fixed import order, more resilient statuses for Spring, cleaner code and tests, more convenient APIs. Change-Id: I6493c81d9c3c1c543c354562e074876268794438 Issue-ID: SDC-1580 Signed-off-by: vempo --- .../sdc/logging/servlet/CombinedTracker.java | 33 ++++++------ .../openecomp/sdc/logging/servlet/HttpHeader.java | 2 +- .../servlet/jaxrs/LoggingRequestFilter.java | 10 ++-- .../sdc/logging/servlet/CombinedTrackerTest.java | 59 +++++++++++++++++++++ .../sdc/logging/servlet/ContextTrackerTest.java | 4 +- .../sdc/logging/servlet/HttpHeaderTest.java | 12 ++--- .../sdc/logging/logback/DispatchingAppender.java | 5 +- .../sdc/logging/slf4j/GlobalContextProvider.java | 5 +- .../openecomp/sdc/logging/slf4j/MDCDelegate.java | 3 +- .../org/openecomp/sdc/logging/slf4j/Markers.java | 6 +-- .../sdc/logging/slf4j/RequestContextProvider.java | 3 +- .../sdc/logging/slf4j/SLF4JLoggerWrapper.java | 3 +- .../logging/slf4j/SLF4JLoggingServiceProvider.java | 5 +- .../sdc/logging/slf4j/SLF4JLoggerWrapperTest.java | 4 +- .../logging/servlet/spring/LoggingInterceptor.java | 60 +++++++++++++++++++--- .../servlet/spring/LoggingInterceptorTest.java | 40 +++++++++++++++ 16 files changed, 198 insertions(+), 56 deletions(-) create mode 100644 openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/servlet/CombinedTrackerTest.java (limited to 'openecomp-be/lib/openecomp-sdc-logging-lib') diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/CombinedTracker.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/CombinedTracker.java index 2dd2c12143..5d940aa821 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/CombinedTracker.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/CombinedTracker.java @@ -17,39 +17,38 @@ package org.openecomp.sdc.logging.servlet; import javax.servlet.http.HttpServletRequest; -import org.openecomp.sdc.logging.api.Logger; /** - * Tracker for all the elements of ONAP logging and tracing at an entry point to an application - context and audit. - * The order of invocations is important, assuming the context must be kept as long as audit hasn't been finished. + * Tracker for all the elements of ONAP logging and tracing at an entry point to an application. + * The order of invocations is important, and on {@link #preRequest(HttpServletRequest)} it respects the order of + * trackers passed to the constructor. On {@link #postRequest(RequestProcessingResult)}, the invocation will be in the + * reverse order. * * @author evitaliy * @since 01 Aug 2018 */ public class CombinedTracker implements Tracker { - private final ContextTracker context; - private final AuditTracker audit; + private final Tracker[] trackers; - public CombinedTracker(Logger logger, HttpHeader partnerNameHeader, HttpHeader requestIdHeader) { - this.context = new ContextTracker(partnerNameHeader, requestIdHeader); - this.audit = new AuditTracker(logger); - } - - public CombinedTracker(Class resourceType, HttpHeader partnerNameHeader, HttpHeader requestIdHeader) { - this.context = new ContextTracker(partnerNameHeader, requestIdHeader); - this.audit = new AuditTracker(resourceType); + public CombinedTracker(Tracker... trackers) { + this.trackers = new Tracker[trackers.length]; + System.arraycopy(trackers, 0, this.trackers, 0, trackers.length); } @Override public void preRequest(HttpServletRequest request) { - this.context.preRequest(request); - this.audit.preRequest(request); + + for (Tracker t : trackers) { + t.preRequest(request); + } } @Override public void postRequest(RequestProcessingResult result) { - this.audit.postRequest(result); - this.context.postRequest(result); + + for (int i = trackers.length - 1; i > -1; i--) { + trackers[i].postRequest(result); + } } } diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/HttpHeader.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/HttpHeader.java index db10c2e4f3..dd5af859d4 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/HttpHeader.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/HttpHeader.java @@ -43,7 +43,7 @@ public class HttpHeader { * * @param headerNames cannot be null or empty */ - public HttpHeader(String[] headerNames) { + public HttpHeader(String... headerNames) { if (Objects.requireNonNull(headerNames, NAMES_CANNOT_BE_NULL).length < 1) { throw new IllegalArgumentException(AT_LEAST_ONE_NAME_REQUIRED); diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/jaxrs/LoggingRequestFilter.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/jaxrs/LoggingRequestFilter.java index f846359b82..fb651495ac 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/jaxrs/LoggingRequestFilter.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/servlet/jaxrs/LoggingRequestFilter.java @@ -27,7 +27,9 @@ import javax.ws.rs.core.Context; import javax.ws.rs.ext.Provider; import org.openecomp.sdc.logging.api.Logger; import org.openecomp.sdc.logging.api.LoggerFactory; +import org.openecomp.sdc.logging.servlet.AuditTracker; import org.openecomp.sdc.logging.servlet.CombinedTracker; +import org.openecomp.sdc.logging.servlet.ContextTracker; import org.openecomp.sdc.logging.servlet.HttpHeader; import org.openecomp.sdc.logging.servlet.Tracker; @@ -63,8 +65,8 @@ public class LoggingRequestFilter implements ContainerRequestFilter { private HttpServletRequest httpRequest; - private HttpHeader requestIdHeader = new HttpHeader(new String[] {DEFAULT_REQUEST_ID_HEADER}); - private HttpHeader partnerNameHeader = new HttpHeader(new String[] {DEFAULT_PARTNER_NAME_HEADER}); + private HttpHeader requestIdHeader = new HttpHeader(DEFAULT_REQUEST_ID_HEADER); + private HttpHeader partnerNameHeader = new HttpHeader(DEFAULT_PARTNER_NAME_HEADER); private ResourceInfo resource; @@ -107,7 +109,9 @@ public class LoggingRequestFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) { Class resourceClass = resource.getResourceMethod().getDeclaringClass(); - Tracker tracker = new CombinedTracker(resourceClass, partnerNameHeader, requestIdHeader); + Tracker tracker = new CombinedTracker( + new ContextTracker(partnerNameHeader, requestIdHeader), + new AuditTracker(resourceClass)); requestContext.setProperty(LOGGING_TRACKER_KEY, tracker); tracker.preRequest(httpRequest); } diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/servlet/CombinedTrackerTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/servlet/CombinedTrackerTest.java new file mode 100644 index 0000000000..4454493c01 --- /dev/null +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/servlet/CombinedTrackerTest.java @@ -0,0 +1,59 @@ +/* + * Copyright © 2016-2018 European Support Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openecomp.sdc.logging.servlet; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import javax.servlet.http.HttpServletRequest; +import org.junit.Test; + +/** + * Test the construction and invocation of combined tracker. + * + * @author evitaliy + * @since 01 Aug 2018 + */ +public class CombinedTrackerTest { + + @Test(expected = NullPointerException.class) + public void throwExceptionWhenTrackersNull() { + new CombinedTracker((Tracker[]) null); + } + + @Test + public void trackersCalledWhenPreRequest() { + Tracker firstTracker = mock(Tracker.class); + Tracker secondTracker = mock(Tracker.class); + CombinedTracker tracker = new CombinedTracker(firstTracker, secondTracker); + tracker.preRequest(mock(HttpServletRequest.class)); + verify(firstTracker, times(1)).preRequest(any(HttpServletRequest.class)); + verify(secondTracker, times(1)).preRequest(any(HttpServletRequest.class)); + } + + @Test + public void trackersCalledWhenPostRequest() { + Tracker firstTracker = mock(Tracker.class); + Tracker secondTracker = mock(Tracker.class); + CombinedTracker tracker = new CombinedTracker(firstTracker, secondTracker); + tracker.postRequest(mock(RequestProcessingResult.class)); + verify(firstTracker, times(1)).postRequest(any(RequestProcessingResult.class)); + verify(secondTracker, times(1)).postRequest(any(RequestProcessingResult.class)); + } +} \ No newline at end of file diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/servlet/ContextTrackerTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/servlet/ContextTrackerTest.java index a247d119c8..59c690d763 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/servlet/ContextTrackerTest.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/servlet/ContextTrackerTest.java @@ -45,10 +45,10 @@ import org.powermock.modules.junit4.PowerMockRunner; public class ContextTrackerTest { private static final String X_REQUEST_ID = "X-REQUEST-ID"; - private static final HttpHeader REQUEST_ID_HEADER = new HttpHeader(new String[] {X_REQUEST_ID}); + private static final HttpHeader REQUEST_ID_HEADER = new HttpHeader(X_REQUEST_ID); private static final String X_PARTNER_NAME = "X-PARTNER-NAME"; - private static final HttpHeader PARTNER_NAME_HEADER = new HttpHeader(new String[] {X_PARTNER_NAME}); + private static final HttpHeader PARTNER_NAME_HEADER = new HttpHeader(X_PARTNER_NAME); @Test(expected = NullPointerException.class) public void throwExceptionWhenPartnerNamesNull() { diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/servlet/HttpHeaderTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/servlet/HttpHeaderTest.java index 5cbd0c0d76..2effa9fab1 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/servlet/HttpHeaderTest.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/servlet/HttpHeaderTest.java @@ -49,7 +49,7 @@ public class HttpHeaderTest { @Test(expected = IllegalArgumentException.class) public void throwExceptionWhenInputArrayEmpty() { - new HttpHeader(new String[0]); + new HttpHeader(); } @Test(expected = IllegalArgumentException.class) @@ -59,7 +59,7 @@ public class HttpHeaderTest { @Test public void valueNotReturnedWhenNameInArrayNotRequested() { - HttpHeader header = new HttpHeader(new String[] {"A"}); + HttpHeader header = new HttpHeader("A"); assertFalse(header.getAny(NULL_WHEN_NAME_NOT_B).isPresent()); } @@ -71,7 +71,7 @@ public class HttpHeaderTest { @Test public void valueReturnedWhenSinglePossibleHeaderInArrayMatches() { - HttpHeader header = new HttpHeader(new String[] {"B"}); + HttpHeader header = new HttpHeader("B"); assertTrue(header.getAny(NULL_WHEN_NAME_NOT_B).isPresent()); } @@ -83,7 +83,7 @@ public class HttpHeaderTest { @Test public void valueReturnedWhenLastHeaderInArrayMatches() throws Throwable { - HttpHeader header = new HttpHeader(new String[] {"A", "B"}); + HttpHeader header = new HttpHeader("A", "B"); header.getAny(NULL_WHEN_NAME_NOT_B).orElseThrow(VALUE_EXPECTED); } @@ -95,7 +95,7 @@ public class HttpHeaderTest { @Test public void valueReturnedWhenFirstHeaderInArrayMatches() throws Throwable { - HttpHeader header = new HttpHeader(new String[] {"B", "A"}); + HttpHeader header = new HttpHeader("B", "A"); header.getAny(NULL_WHEN_NAME_NOT_B).orElseThrow(VALUE_EXPECTED); } @@ -107,7 +107,7 @@ public class HttpHeaderTest { @Test public void valueReturnedWhenMiddleHeaderInArrayMatches() throws Throwable { - HttpHeader header = new HttpHeader(new String[] {"A", "B", "C"}); + HttpHeader header = new HttpHeader("A", "B", "C"); header.getAny(NULL_WHEN_NAME_NOT_B).orElseThrow(VALUE_EXPECTED); } diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/logback/DispatchingAppender.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/logback/DispatchingAppender.java index b4abb8b368..fb0ceb97e2 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/logback/DispatchingAppender.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/logback/DispatchingAppender.java @@ -24,11 +24,10 @@ import ch.qos.logback.core.Appender; import ch.qos.logback.core.AppenderBase; import ch.qos.logback.core.joran.spi.DefaultClass; import ch.qos.logback.core.sift.Discriminator; -import org.slf4j.LoggerFactory; - import java.util.Iterator; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.slf4j.LoggerFactory; /** *

Allows to use EELF logging configuration almost as is, by using a custom routing function, but pre-configured @@ -55,7 +54,7 @@ public class DispatchingAppender extends AppenderBase { // "magic" appender to indicate a missing appender private static final Appender NO_APPENDER = new DispatchingAppender(); - private Map> appenders = new ConcurrentHashMap<>(); + private final Map> appenders = new ConcurrentHashMap<>(); private Discriminator discriminator; private String appenderNamePattern; diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/GlobalContextProvider.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/GlobalContextProvider.java index 3370ebfaf3..f6e933d57b 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/GlobalContextProvider.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/GlobalContextProvider.java @@ -16,13 +16,12 @@ package org.openecomp.sdc.logging.slf4j; -import org.openecomp.sdc.logging.context.HostAddressCache; -import org.openecomp.sdc.logging.context.InstanceId; - import java.net.InetAddress; import java.util.EnumMap; import java.util.Map; import java.util.Optional; +import org.openecomp.sdc.logging.context.HostAddressCache; +import org.openecomp.sdc.logging.context.InstanceId; /** * Maps global logging context to corresponding MDC fields. diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/MDCDelegate.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/MDCDelegate.java index 9c9410c764..026d3fa99b 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/MDCDelegate.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/MDCDelegate.java @@ -16,10 +16,9 @@ package org.openecomp.sdc.logging.slf4j; -import org.slf4j.MDC; - import java.util.EnumMap; import java.util.Map; +import org.slf4j.MDC; /** * Because we don't know which information should be carried over from MDC, and which shouldn't, copy just the keys that diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/Markers.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/Markers.java index 7d2d846097..17439da161 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/Markers.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/Markers.java @@ -41,10 +41,10 @@ import org.slf4j.MarkerFactory; */ public class Markers { + public static final Marker AUDIT = MarkerFactory.getMarker("AUDIT"); + public static final Marker METRICS = MarkerFactory.getMarker("METRICS"); + private Markers() { // prevent instantiation } - - public static final Marker AUDIT = MarkerFactory.getMarker("AUDIT"); - public static final Marker METRICS = MarkerFactory.getMarker("METRICS"); } diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/RequestContextProvider.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/RequestContextProvider.java index 6a74b704de..40684cc132 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/RequestContextProvider.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/RequestContextProvider.java @@ -16,10 +16,9 @@ package org.openecomp.sdc.logging.slf4j; -import org.openecomp.sdc.logging.api.ContextData; - import java.util.EnumMap; import java.util.Map; +import org.openecomp.sdc.logging.api.ContextData; /** * Maps request data sent to the context service to corresponding MDC fields. diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggerWrapper.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggerWrapper.java index 248ad43ca8..fbb5fbf1f2 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggerWrapper.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggerWrapper.java @@ -16,14 +16,13 @@ package org.openecomp.sdc.logging.slf4j; +import java.text.SimpleDateFormat; import org.openecomp.sdc.logging.api.AuditData; import org.openecomp.sdc.logging.api.Logger; import org.openecomp.sdc.logging.api.MetricsData; import org.slf4j.LoggerFactory; import org.slf4j.MDC; -import java.text.SimpleDateFormat; - /** * Delegates log calls to SLF4J API and MDC. * diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggingServiceProvider.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggingServiceProvider.java index c18716843d..9d4d507ac5 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggingServiceProvider.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggingServiceProvider.java @@ -16,13 +16,12 @@ package org.openecomp.sdc.logging.slf4j; +import java.util.Objects; +import java.util.concurrent.Callable; import org.openecomp.sdc.logging.api.ContextData; import org.openecomp.sdc.logging.api.Logger; import org.openecomp.sdc.logging.spi.LoggingServiceProvider; -import java.util.Objects; -import java.util.concurrent.Callable; - /** * Uses SLF4J as backend for logging service. * diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggerWrapperTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggerWrapperTest.java index 73dd25ccae..f2f0c1d674 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggerWrapperTest.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggerWrapperTest.java @@ -265,8 +265,8 @@ public class SLF4JLoggerWrapperTest { // build a dynamic proxy to avoid implementing the long list of Logger methods // when we actually need just Logger.info() with the audit marker ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - return SpyLogger.class.cast( - Proxy.newProxyInstance(classLoader, new Class[]{SpyLogger.class}, new SpyingInvocationHandler())); + return (SpyLogger) Proxy.newProxyInstance(classLoader, new Class[] {SpyLogger.class}, + new SpyingInvocationHandler()); } private static class SpyingInvocationHandler implements InvocationHandler { diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-spring/src/main/java/org/openecomp/sdc/logging/servlet/spring/LoggingInterceptor.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-spring/src/main/java/org/openecomp/sdc/logging/servlet/spring/LoggingInterceptor.java index a467a9e38a..cfcb62b12c 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-spring/src/main/java/org/openecomp/sdc/logging/servlet/spring/LoggingInterceptor.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-spring/src/main/java/org/openecomp/sdc/logging/servlet/spring/LoggingInterceptor.java @@ -18,6 +18,8 @@ package org.openecomp.sdc.logging.servlet.spring; import static org.openecomp.sdc.logging.api.StatusCode.COMPLETE; import static org.openecomp.sdc.logging.api.StatusCode.ERROR; +import static org.springframework.http.HttpStatus.Series.REDIRECTION; +import static org.springframework.http.HttpStatus.Series.SUCCESSFUL; import java.util.Objects; import javax.servlet.http.HttpServletRequest; @@ -25,16 +27,19 @@ import javax.servlet.http.HttpServletResponse; import org.openecomp.sdc.logging.api.Logger; import org.openecomp.sdc.logging.api.LoggerFactory; import org.openecomp.sdc.logging.api.StatusCode; +import org.openecomp.sdc.logging.servlet.AuditTracker; import org.openecomp.sdc.logging.servlet.CombinedTracker; +import org.openecomp.sdc.logging.servlet.ContextTracker; import org.openecomp.sdc.logging.servlet.HttpHeader; import org.openecomp.sdc.logging.servlet.RequestProcessingResult; import org.openecomp.sdc.logging.servlet.Tracker; import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; /** - *

IMPORTANT: For this interceptor to work, all exceptions must be properly handled before being returned to a + *

IMPORTANT: For this interceptor to work, all exceptions must be properly handled before being returned to a * client. Any unexpected, automatically handled exception bypasses the interceptor and will not be logged.

*

The interceptor must be either registered in Spring configuration XML as a bean, or programmatically as described * in @@ -43,6 +48,7 @@ import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; * @author evitaliy * @since 02 Aug 2018 */ +@Component public class LoggingInterceptor extends HandlerInterceptorAdapter { static final String LOGGING_TRACKER_KEY = "onap.logging.tracker"; @@ -60,7 +66,9 @@ public class LoggingInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { Class resourceClass = getResourceType(handler); - Tracker tracker = new CombinedTracker(resourceClass, partnerNameHeader, requestIdHeader); + Tracker tracker = new CombinedTracker( + new ContextTracker(partnerNameHeader, requestIdHeader), + new AuditTracker(resourceClass)); request.setAttribute(LOGGING_TRACKER_KEY, tracker); tracker.preRequest(request); return true; @@ -91,25 +99,63 @@ public class LoggingInterceptor extends HandlerInterceptorAdapter { static class ServletResponseResult implements RequestProcessingResult { - private final HttpStatus status; + private final StatusInfo statusInfo; ServletResponseResult(int status) { - this.status = HttpStatus.valueOf(status); + this.statusInfo = init(status); + } + + private StatusInfo init(int status) { + + try { + return new StatusInfo(HttpStatus.valueOf(status)); + } catch (IllegalArgumentException e) { + return new StatusInfo(status, "Non-standard HTTP status", HttpStatus.Series.valueOf(status)); + } } @Override public int getStatus() { - return status.value(); + return statusInfo.getStatus(); } @Override public StatusCode getStatusCode() { - return status.is2xxSuccessful() || status.is3xxRedirection() ? COMPLETE : ERROR; + return statusInfo.getStatusCode(); } @Override public String getStatusPhrase() { - return status.getReasonPhrase(); + return statusInfo.getReasonPhrase(); + } + } + + private static class StatusInfo { + + private final int status; + private final String reasonPhrase; + private final HttpStatus.Series series; + + private StatusInfo(HttpStatus httpStatus) { + this(httpStatus.value(), httpStatus.getReasonPhrase(), httpStatus.series()); + } + + private StatusInfo(int status, String reasonPhrase, HttpStatus.Series series) { + this.status = status; + this.reasonPhrase = reasonPhrase; + this.series = series; + } + + private int getStatus() { + return status; + } + + private String getReasonPhrase() { + return reasonPhrase; + } + + private StatusCode getStatusCode() { + return series.equals(SUCCESSFUL) || series.equals(REDIRECTION) ? COMPLETE : ERROR; } } } \ No newline at end of file diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-spring/src/test/java/org/openecomp/sdc/logging/servlet/spring/LoggingInterceptorTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-spring/src/test/java/org/openecomp/sdc/logging/servlet/spring/LoggingInterceptorTest.java index ccd0b70552..1aba519c7b 100644 --- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-spring/src/test/java/org/openecomp/sdc/logging/servlet/spring/LoggingInterceptorTest.java +++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-spring/src/test/java/org/openecomp/sdc/logging/servlet/spring/LoggingInterceptorTest.java @@ -114,4 +114,44 @@ public class LoggingInterceptorTest { assertEquals(status, result.getStatus()); assertEquals(COMPLETE, result.getStatusCode()); } + + @Test + public void errorStatusWhenNonStandardInformationalCode() { + final int status = 133; + LoggingInterceptor.ServletResponseResult result = new LoggingInterceptor.ServletResponseResult(status); + assertEquals(status, result.getStatus()); + assertEquals(ERROR, result.getStatusCode()); + } + + @Test + public void errorStatusWhenNonStandardClientErrorCode() { + final int status = 485; + LoggingInterceptor.ServletResponseResult result = new LoggingInterceptor.ServletResponseResult(status); + assertEquals(status, result.getStatus()); + assertEquals(ERROR, result.getStatusCode()); + } + + @Test + public void errorStatusWhenNonStandardServerErrorCode() { + final int status = 547; + LoggingInterceptor.ServletResponseResult result = new LoggingInterceptor.ServletResponseResult(status); + assertEquals(status, result.getStatus()); + assertEquals(ERROR, result.getStatusCode()); + } + + @Test + public void completeStatusWhenNonStandardSuccessCode() { + final int status = 277; + LoggingInterceptor.ServletResponseResult result = new LoggingInterceptor.ServletResponseResult(status); + assertEquals(status, result.getStatus()); + assertEquals(COMPLETE, result.getStatusCode()); + } + + @Test + public void completeStatusWhenNonStandardRedirectionCode() { + final int status = 364; + LoggingInterceptor.ServletResponseResult result = new LoggingInterceptor.ServletResponseResult(status); + assertEquals(status, result.getStatus()); + assertEquals(COMPLETE, result.getStatusCode()); + } } \ No newline at end of file -- cgit 1.2.3-korg