Update Logging
[so.git] / common / src / main / java / org / onap / so / logging / jaxrs / filter / SpringClientFilter.java
index 6af7a91..cecef19 100644 (file)
 
 package org.onap.so.logging.jaxrs.filter;
 
+import org.onap.logging.ref.slf4j.ONAPLogConstants;
+import org.onap.so.logger.LogConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpRequest;
 import org.springframework.http.client.ClientHttpRequestExecution;
 import org.springframework.http.client.ClientHttpRequestInterceptor;
@@ -30,20 +34,31 @@ import org.springframework.util.StreamUtils;
  
 import java.io.IOException;
 import java.nio.charset.Charset;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.UUID;
+import javax.ws.rs.core.Response;
  
 public class SpringClientFilter implements ClientHttpRequestInterceptor {
  
     private final Logger log = LoggerFactory.getLogger(this.getClass());
+    
+    private static final String TRACE = "trace-#";
+    private static final String SO = "SO";
  
     @Override
     public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
-        logRequest(request, body);
+       processRequest(request, body);
         ClientHttpResponse response = execution.execute(request, body);
-        logResponse(response);
+        processResponse(response);
         return response;
     }
  
-    private void logRequest(HttpRequest request, byte[] body) throws IOException {
+    private void processRequest(HttpRequest request, byte[] body) throws IOException {
+       setupHeaders(request);
+       setupMDC(request);
         if (log.isDebugEnabled()) {
             log.debug("===========================request begin================================================");
             log.debug("URI         : {}", request.getURI());
@@ -53,8 +68,60 @@ public class SpringClientFilter implements ClientHttpRequestInterceptor {
             log.debug("==========================request end================================================");
         }
     }
+    
+    private void setupHeaders(HttpRequest clientRequest) {
+        HttpHeaders headers = clientRequest.getHeaders();
+        headers.add(ONAPLogConstants.Headers.REQUEST_ID, extractRequestID(clientRequest));
+        headers.add(ONAPLogConstants.Headers.INVOCATION_ID, MDC.get(ONAPLogConstants.MDCs.INVOCATION_ID));
+        headers.add(ONAPLogConstants.Headers.PARTNER_NAME, SO);
+    }
+    
+    private String extractRequestID(HttpRequest clientRequest) {
+        String requestId = MDC.get(ONAPLogConstants.MDCs.REQUEST_ID);
+        if(requestId == null || requestId.isEmpty() || requestId.equals(TRACE)){
+            requestId = UUID.randomUUID().toString();
+            log.warn("Could not Find Request ID Generating New One: {}",clientRequest.getURI());
+        }
+        return requestId;
+    }  
+
+    private void setupMDC(HttpRequest clientRequest) {
+        MDC.put(ONAPLogConstants.MDCs.INVOKE_TIMESTAMP, ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT));
+        MDC.put(ONAPLogConstants.MDCs.TARGET_SERVICE_NAME, clientRequest.getURI().toString());       
+        MDC.put(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE, ONAPLogConstants.ResponseStatus.INPROGRESS.toString());
+        setInvocationId();
+        MDC.put(ONAPLogConstants.MDCs.TARGET_ENTITY,extractTargetEntity(clientRequest));
+    }
+    
+    private String extractTargetEntity(HttpRequest clientRequest) {
+       HttpHeaders headers = clientRequest.getHeaders();
+       String headerTargetEntity = null;
+       List<String> headerTargetEntityList = headers.get(LogConstants.TARGET_ENTITY_HEADER);
+       if(headerTargetEntityList!= null && !headerTargetEntityList.isEmpty())
+               headerTargetEntity = headerTargetEntityList.get(0);
+        String targetEntity = MDC.get(ONAPLogConstants.MDCs.TARGET_ENTITY);
+        if(targetEntity != null &&
+                       !targetEntity.isEmpty() ){
+               return targetEntity;            
+        }else if(headerTargetEntity != null &&
+                       !headerTargetEntity.isEmpty()){
+               targetEntity = headerTargetEntity;
+        }else{
+               targetEntity = LogConstants.UNKNOWN_TARGET_ENTITY;
+               log.warn("Could not Target Entity: {}",clientRequest.getURI());
+        }
+        return targetEntity;
+    }  
+    
+    private void setInvocationId() {
+        String invocationId = MDC.get(ONAPLogConstants.MDCs.INVOCATION_ID);
+        if(invocationId == null || invocationId.isEmpty())
+            invocationId =UUID.randomUUID().toString();
+        MDC.put(ONAPLogConstants.MDCs.INVOCATION_ID, invocationId);
+    }
+
  
-    private void logResponse(ClientHttpResponse response) throws IOException {
+    private void processResponse(ClientHttpResponse response) throws IOException {
         if (log.isDebugEnabled()) {
             log.debug("============================response begin==========================================");
             log.debug("Status code  : {}", response.getStatusCode());
@@ -63,5 +130,28 @@ public class SpringClientFilter implements ClientHttpRequestInterceptor {
             log.debug("Response body: {}", StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
             log.debug("=======================response end=================================================");
         }
+        String statusCode;
+        if(Response.Status.Family.familyOf(response.getRawStatusCode()).equals(Response.Status.Family.SUCCESSFUL)){            
+            statusCode=ONAPLogConstants.ResponseStatus.COMPLETED.toString();
+        }else{                                                 
+            statusCode=ONAPLogConstants.ResponseStatus.ERROR.toString();                               
+        }
+        MDC.put(ONAPLogConstants.MDCs.RESPONSE_CODE, String.valueOf(response.getRawStatusCode()));
+        MDC.put(ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION,"");
+        MDC.put(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE, statusCode);
+        log.info(ONAPLogConstants.Markers.INVOKE_RETURN, "InvokeReturn");
+        clearClientMDCs();
+    }
+    
+    private void clearClientMDCs() {
+        MDC.remove(ONAPLogConstants.MDCs.INVOCATION_ID);
+        MDC.remove(ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION);
+        MDC.remove(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE);
+        MDC.remove(ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION);
+        MDC.remove(ONAPLogConstants.MDCs.RESPONSE_CODE);
+        MDC.remove(ONAPLogConstants.MDCs.TARGET_ENTITY);
+        MDC.remove(ONAPLogConstants.MDCs.PARTNER_NAME);
+        MDC.remove(ONAPLogConstants.MDCs.TARGET_SERVICE_NAME);
+        MDC.remove(ONAPLogConstants.MDCs.INVOKE_TIMESTAMP);
     }
 }