Update Logging
[so.git] / common / src / main / java / org / onap / so / logging / jaxrs / filter / JaxRsFilterLogging.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.so.logging.jaxrs.filter;
22
23
24 import java.io.ByteArrayOutputStream;
25 import java.io.IOException;
26 import java.lang.annotation.Annotation;
27 import java.lang.reflect.Type;
28 import java.util.UUID;
29 import javax.annotation.Priority;
30 import javax.servlet.http.HttpServletRequest;
31 import javax.ws.rs.container.ContainerRequestContext;
32 import javax.ws.rs.container.ContainerRequestFilter;
33 import javax.ws.rs.container.ContainerResponseContext;
34 import javax.ws.rs.container.ContainerResponseFilter;
35 import javax.ws.rs.core.Context;
36 import javax.ws.rs.core.MediaType;
37 import javax.ws.rs.core.MultivaluedMap;
38 import javax.ws.rs.core.Response;
39 import javax.ws.rs.ext.MessageBodyWriter;
40 import javax.ws.rs.ext.Provider;
41 import javax.ws.rs.ext.Providers;
42 import org.onap.logging.ref.slf4j.ONAPLogConstants;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45 import org.slf4j.MDC;
46 import org.springframework.beans.factory.annotation.Autowired;
47 import org.springframework.stereotype.Component;
48 import com.fasterxml.jackson.databind.ObjectMapper;
49
50 @Priority(1)
51 @Provider
52 @Component
53 public class JaxRsFilterLogging implements ContainerRequestFilter,ContainerResponseFilter {
54     
55     protected static Logger logger = LoggerFactory.getLogger(JaxRsFilterLogging.class);
56
57     @Context
58     private HttpServletRequest httpServletRequest;
59
60     @Context 
61     private Providers providers;
62     
63     @Autowired
64     private MDCSetup mdcSetup;
65
66     @Override
67     public void filter(ContainerRequestContext containerRequest) {
68         try {
69             MultivaluedMap<String, String> headers = containerRequest.getHeaders();
70             setRequestId(headers);
71             containerRequest.setProperty("requestId", MDC.get(ONAPLogConstants.MDCs.REQUEST_ID));
72             setInvocationId(headers);
73             setServiceName(containerRequest);
74             setMDCPartnerName(headers);
75             mdcSetup.setServerFQDN();
76             mdcSetup.setClientIPAddress(httpServletRequest);
77             mdcSetup.setInstanceUUID();
78             mdcSetup.setEntryTimeStamp();
79             MDC.put(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE, ONAPLogConstants.ResponseStatus.INPROGRESS.toString());
80             logger.info(ONAPLogConstants.Markers.ENTRY, "Entering");
81         } catch (Exception e) {
82             logger.warn("Error in incoming JAX-RS Inteceptor", e);
83         }
84     }
85
86     @Override
87     public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
88             throws IOException {
89         try {
90             setResponseStatusCode(responseContext);
91             MDC.put(ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION,payloadMessage(responseContext));      
92             MDC.put(ONAPLogConstants.MDCs.RESPONSE_CODE,String.valueOf(responseContext.getStatus()));
93             logger.info(ONAPLogConstants.Markers.EXIT, "Exiting.");
94             MDC.clear();
95         } catch ( Exception e) {
96             MDC.clear();
97             logger.warn("Error in outgoing JAX-RS Inteceptor", e);
98         } 
99     }
100
101     private void setResponseStatusCode(ContainerResponseContext responseContext) {
102         String statusCode;
103         if(Response.Status.Family.familyOf(responseContext.getStatus()).equals(Response.Status.Family.SUCCESSFUL)){             
104             statusCode=ONAPLogConstants.ResponseStatus.COMPLETED.toString();
105         }else{                                                  
106             statusCode= ONAPLogConstants.ResponseStatus.ERROR.toString();                               
107         }                       
108         MDC.put(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE, statusCode);
109     } 
110
111     private String payloadMessage(ContainerResponseContext responseContext) throws IOException {
112         String message = "";
113         if (responseContext.hasEntity()) {
114             ByteArrayOutputStream baos = new ByteArrayOutputStream();           
115             Class<?> entityClass = responseContext.getEntityClass();
116             Type entityType = responseContext.getEntityType();
117             Annotation[] entityAnnotations = responseContext.getEntityAnnotations();
118             MediaType mediaType = responseContext.getMediaType();
119             @SuppressWarnings("unchecked")
120             MessageBodyWriter<Object> bodyWriter = (MessageBodyWriter<Object>) providers.getMessageBodyWriter(entityClass, 
121                     entityType, 
122                     entityAnnotations, 
123                     mediaType);
124             bodyWriter.writeTo(responseContext.getEntity(), 
125                     entityClass, 
126                     entityType, 
127                     entityAnnotations, 
128                     mediaType, 
129                     responseContext.getHeaders(), 
130                     baos); 
131             message = message.concat(new String(baos.toByteArray()));
132         }
133         return message;
134     }
135
136
137     private void setRequestId(MultivaluedMap<String, String> headers){
138         String requestId=headers.getFirst(ONAPLogConstants.Headers.REQUEST_ID);
139         if(requestId == null || requestId.isEmpty())
140             requestId = UUID.randomUUID().toString();
141         MDC.put(ONAPLogConstants.MDCs.REQUEST_ID,requestId);
142     }
143
144     private void setInvocationId(MultivaluedMap<String, String> headers){
145         MDC.put(ONAPLogConstants.MDCs.INVOCATION_ID, findInvocationId(headers));
146     }
147
148     private void setMDCPartnerName(MultivaluedMap<String, String> headers){
149         String partnerName=headers.getFirst(ONAPLogConstants.Headers.PARTNER_NAME);
150         if(partnerName == null || partnerName.isEmpty())
151             partnerName = "";
152         MDC.put(ONAPLogConstants.MDCs.PARTNER_NAME,partnerName);
153     }
154     
155     private String findInvocationId(MultivaluedMap<String, String> headers) {
156         String invocationId = headers.getFirst(ONAPLogConstants.Headers.INVOCATION_ID);
157         if(invocationId == null || invocationId.isEmpty())
158             invocationId =UUID.randomUUID().toString();
159         return invocationId;
160     }
161
162     private void setServiceName(ContainerRequestContext containerRequest){
163         MDC.put(ONAPLogConstants.MDCs.SERVICE_NAME, containerRequest.getUriInfo().getPath());
164     }
165
166     private void clearClientMDCs() {
167         MDC.remove(ONAPLogConstants.MDCs.INVOCATION_ID);
168         MDC.remove(ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION);
169         MDC.remove(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE);
170         MDC.remove(ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION);
171         MDC.remove(ONAPLogConstants.MDCs.RESPONSE_CODE);
172         MDC.remove(ONAPLogConstants.MDCs.TARGET_ENTITY);
173         MDC.remove(ONAPLogConstants.MDCs.PARTNER_NAME);
174         MDC.remove(ONAPLogConstants.MDCs.TARGET_SERVICE_NAME);
175     }
176
177
178
179 }