Fix NPE under MDCSetup for response code 422
[logging-analytics.git] / reference / logging-filter / logging-filter-base / src / main / java / org / onap / logging / filter / base / MDCSetup.java
index d600a2c..a90f053 100644 (file)
@@ -25,6 +25,7 @@ import java.net.UnknownHostException;
 import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
 import java.time.temporal.ChronoUnit;
 import java.util.Base64;
 import java.util.UUID;
@@ -39,25 +40,70 @@ import org.slf4j.MDC;
 public class MDCSetup {
 
     protected static Logger logger = LoggerFactory.getLogger(MDCSetup.class);
-
     private static final String INSTANCE_UUID = UUID.randomUUID().toString();
+    protected static final String serverIpAddressOverride = "SERVER_IP_ADDRESS_OVERRIDE";
+    protected static final String serverFqdnOverride = "SERVER_FQDN_OVERRIDE";
+    protected static final String INSTANT_PRECISION_OVERRIDE = "INSTANT_PRECISION_OVERRIDE";
+    protected static final String checkHeaderLogPattern = "Checking {} header to determine the value of {}";
+    protected String serverFqdn;
+    protected String serverIpAddress;
+    protected String[] prioritizedIdHeadersNames;
+    protected String[] prioritizedPartnerHeadersNames;
+    protected DateTimeFormatter iso8601Formatter;
+
+    public MDCSetup() {
+        this.prioritizedIdHeadersNames =
+                new String[] {ONAPLogConstants.Headers.REQUEST_ID, Constants.HttpHeaders.HEADER_REQUEST_ID,
+                        Constants.HttpHeaders.TRANSACTION_ID, Constants.HttpHeaders.ECOMP_REQUEST_ID};
+        this.prioritizedPartnerHeadersNames =
+                new String[] {HttpHeaders.AUTHORIZATION, ONAPLogConstants.Headers.PARTNER_NAME, HttpHeaders.USER_AGENT};
+        initServerFqdnandIp();
+        this.iso8601Formatter = createFormatter();
+    }
+
+    protected String getCurrentTimeStamp() {
+        return ZonedDateTime.now(ZoneOffset.UTC).format(iso8601Formatter);
+    }
+
+    protected DateTimeFormatter createFormatter() {
+        DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
+        try {
+            Integer instantPrecision = Integer.valueOf(System.getProperty(INSTANT_PRECISION_OVERRIDE, "3"));
+            builder.appendInstant(instantPrecision);
+        } catch (NumberFormatException nfe) {
+            logger.warn("instant precision could not be read and thus won't be set, the default will be used instead."
+                    + nfe.getMessage());
+        }
+        return builder.toFormatter();
+    }
 
     public void setInstanceID() {
         MDC.put(ONAPLogConstants.MDCs.INSTANCE_UUID, INSTANCE_UUID);
     }
 
-    public void setServerFQDN() {
-        String serverFQDN = "";
-        InetAddress addr = null;
-        try {
-            addr = InetAddress.getLocalHost();
-            serverFQDN = addr.getCanonicalHostName();
-            MDC.put(ONAPLogConstants.MDCs.SERVER_IP_ADDRESS, addr.getHostAddress());
-        } catch (UnknownHostException e) {
-            logger.warn("Cannot Resolve Host Name");
-            serverFQDN = "";
+    protected void initServerFqdnandIp() {
+        serverFqdn = getProperty(serverFqdnOverride);
+        serverIpAddress = getProperty(serverIpAddressOverride);
+
+        if (serverIpAddress.equals(Constants.DefaultValues.UNKNOWN)
+                || serverFqdn.equals(Constants.DefaultValues.UNKNOWN)) {
+            try {
+                InetAddress addr = InetAddress.getLocalHost();
+                if (serverFqdn.equals(Constants.DefaultValues.UNKNOWN)) {
+                    serverFqdn = addr.getCanonicalHostName();
+                }
+                if (serverIpAddress.equals(Constants.DefaultValues.UNKNOWN)) {
+                    serverIpAddress = addr.getHostAddress();
+                }
+            } catch (UnknownHostException e) {
+                logger.trace("Cannot Resolve Host Name." + e.getMessage());
+            }
         }
-        MDC.put(ONAPLogConstants.MDCs.SERVER_FQDN, serverFQDN);
+    }
+
+    public void setServerFQDN() {
+        MDC.put(ONAPLogConstants.MDCs.SERVER_FQDN, serverFqdn);
+        MDC.put(ONAPLogConstants.MDCs.SERVER_IP_ADDRESS, serverIpAddress);
     }
 
     public void setClientIPAddress(HttpServletRequest httpServletRequest) {
@@ -76,35 +122,18 @@ public class MDCSetup {
     }
 
     public void setEntryTimeStamp() {
-        MDC.put(ONAPLogConstants.MDCs.ENTRY_TIMESTAMP,
-                ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT));
+        MDC.put(ONAPLogConstants.MDCs.ENTRY_TIMESTAMP, getCurrentTimeStamp());
     }
 
     public String getRequestId(SimpleMap headers) {
-        logger.trace("Checking X-ONAP-RequestID header for requestId.");
-        String requestId = headers.get(ONAPLogConstants.Headers.REQUEST_ID);
-        if (requestId != null && !requestId.isEmpty()) {
-            return requestId;
-        }
-
-        logger.trace("No valid X-ONAP-RequestID header value. Checking X-RequestID header for requestId.");
-        requestId = headers.get(Constants.HttpHeaders.HEADER_REQUEST_ID);
-        if (requestId != null && !requestId.isEmpty()) {
-            return requestId;
-        }
-
-        logger.trace("No valid X-RequestID header value. Checking X-TransactionID header for requestId.");
-        requestId = headers.get(Constants.HttpHeaders.TRANSACTION_ID);
-        if (requestId != null && !requestId.isEmpty()) {
-            return requestId;
-        }
-
-        logger.trace("No valid X-TransactionID header value. Checking X-ECOMP-RequestID header for requestId.");
-        requestId = headers.get(Constants.HttpHeaders.ECOMP_REQUEST_ID);
-        if (requestId != null && !requestId.isEmpty()) {
-            return requestId;
+        String requestId = null;
+        for (String headerName : this.prioritizedIdHeadersNames) {
+            logger.trace(checkHeaderLogPattern, headerName, ONAPLogConstants.Headers.REQUEST_ID);
+            requestId = headers.get(headerName);
+            if (requestId != null && !requestId.isEmpty()) {
+                return requestId;
+            }
         }
-
         logger.trace("No valid requestId headers. Generating requestId: {}", requestId);
         return UUID.randomUUID().toString();
     }
@@ -123,40 +152,26 @@ public class MDCSetup {
     }
 
     protected String getMDCPartnerName(SimpleMap headers) {
-        String checkHeaderLogPattern = "Checking {} header to determine the value of {}";
-
-        logger.trace(checkHeaderLogPattern, HttpHeaders.AUTHORIZATION, ONAPLogConstants.MDCs.PARTNER_NAME);
-        String partnerName = getBasicAuthUserName(headers);
-        if (partnerName != null && !partnerName.isEmpty()) {
-            return partnerName;
-        }
-
-        logger.trace(checkHeaderLogPattern, ONAPLogConstants.Headers.PARTNER_NAME, ONAPLogConstants.MDCs.PARTNER_NAME);
-        partnerName = headers.get(ONAPLogConstants.Headers.PARTNER_NAME);
-        if (partnerName != null && !partnerName.isEmpty()) {
-            return partnerName;
-        }
-
-        logger.trace(checkHeaderLogPattern, HttpHeaders.USER_AGENT, ONAPLogConstants.MDCs.PARTNER_NAME);
-        partnerName = headers.get(HttpHeaders.USER_AGENT);
-        if (partnerName != null && !partnerName.isEmpty()) {
-            return partnerName;
-        }
+        String partnerName = null;
+        for (String headerName : prioritizedPartnerHeadersNames) {
+            logger.trace(checkHeaderLogPattern, headerName, ONAPLogConstants.MDCs.PARTNER_NAME);
+            if (headerName.equals(HttpHeaders.AUTHORIZATION)) {
+                partnerName = getBasicAuthUserName(headers);
+            } else {
+                partnerName = headers.get(headerName);
+            }
+            if (partnerName != null && !partnerName.isEmpty()) {
+                return partnerName;
+            }
 
-        logger.trace(checkHeaderLogPattern, Constants.HttpHeaders.CLIENT_ID, ONAPLogConstants.MDCs.PARTNER_NAME);
-        partnerName = headers.get(Constants.HttpHeaders.CLIENT_ID);
-        if (partnerName != null && !partnerName.isEmpty()) {
-            return partnerName;
         }
-
         logger.trace("{} value could not be determined, defaulting partnerName to {}.",
                 ONAPLogConstants.MDCs.PARTNER_NAME, Constants.DefaultValues.UNKNOWN);
         return Constants.DefaultValues.UNKNOWN;
     }
 
     public void setLogTimestamp() {
-        MDC.put(ONAPLogConstants.MDCs.LOG_TIMESTAMP,
-                ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT));
+        MDC.put(ONAPLogConstants.MDCs.LOG_TIMESTAMP, getCurrentTimeStamp());
     }
 
     public void setElapsedTime() {
@@ -170,7 +185,7 @@ public class MDCSetup {
             MDC.put(ONAPLogConstants.MDCs.ELAPSED_TIME,
                     Long.toString(ChronoUnit.MILLIS.between(entryTimestamp, endTimestamp)));
         } catch (Exception e) {
-            logger.warn("Unable to calculate elapsed time due to error: {}", e.getMessage());
+            logger.trace("Unable to calculate elapsed time due to error: {}", e.getMessage());
         }
     }
 
@@ -185,7 +200,7 @@ public class MDCSetup {
             MDC.put(ONAPLogConstants.MDCs.ELAPSED_TIME,
                     Long.toString(ChronoUnit.MILLIS.between(entryTimestamp, endTimestamp)));
         } catch (Exception e) {
-            logger.warn("Unable to calculate elapsed time due to error: {}", e.getMessage());
+            logger.trace("Unable to calculate elapsed time due to error: {}", e.getMessage());
         }
     }
 
@@ -196,7 +211,7 @@ public class MDCSetup {
         } else {
             statusCode = ONAPLogConstants.ResponseStatus.ERROR.toString();
             setErrorCode(code);
-            setErrorDesc(code);
+            setErrorDescription(code);
         }
         MDC.put(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE, statusCode);
     }
@@ -218,15 +233,27 @@ public class MDCSetup {
     }
 
     public void setResponseDescription(int statusCode) {
-        MDC.put(ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION, Response.Status.fromStatusCode(statusCode).toString());
+        MDC.put(ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION, extractDescription(statusCode));
+    }
+
+    private String extractDescription(int statusCode) {
+        Response.Status responseStatus = Response.Status.fromStatusCode(statusCode);
+        if (responseStatus != null) {
+            return responseStatus.toString();
+        }
+        CustomResponseStatus customResponseStatus = CustomResponseStatus.fromStatusCode(statusCode);
+        if (customResponseStatus != null) {
+            return customResponseStatus.toString();
+        }
+        return String.format("Unknown description for response code %d.", statusCode);
     }
 
     public void setErrorCode(int statusCode) {
         MDC.put(ONAPLogConstants.MDCs.ERROR_CODE, String.valueOf(statusCode));
     }
 
-    public void setErrorDesc(int statusCode) {
-        MDC.put(ONAPLogConstants.MDCs.ERROR_DESC, Response.Status.fromStatusCode(statusCode).toString());
+    public void setErrorDescription(int statusCode) {
+        MDC.put(ONAPLogConstants.MDCs.ERROR_DESC, extractDescription(statusCode));
     }
 
     public String getProperty(String property) {