Containerization feature of SO
[so.git] / common / src / main / java / org / onap / so / logging / jaxrs / filter / jersey / 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.jersey;
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.time.Instant;
29 import java.time.ZoneId;
30 import java.time.format.DateTimeFormatter;
31 import java.util.Locale;
32 import java.util.UUID;
33
34 import javax.annotation.Priority;
35 import javax.servlet.http.HttpServletRequest;
36 import javax.ws.rs.container.ContainerRequestContext;
37 import javax.ws.rs.container.ContainerRequestFilter;
38 import javax.ws.rs.container.ContainerResponseContext;
39 import javax.ws.rs.container.ContainerResponseFilter;
40 import javax.ws.rs.core.Context;
41 import javax.ws.rs.core.MediaType;
42 import javax.ws.rs.core.MultivaluedMap;
43 import javax.ws.rs.core.Response;
44 import javax.ws.rs.ext.MessageBodyWriter;
45 import javax.ws.rs.ext.Provider;
46 import javax.ws.rs.ext.Providers;
47
48 import org.onap.so.logger.MsoLogger;
49 import org.slf4j.MDC;
50 import org.springframework.beans.factory.annotation.Autowired;
51 import org.springframework.stereotype.Component;
52
53 import com.fasterxml.jackson.databind.ObjectMapper;
54
55 @Priority(1)
56 @Provider
57 @Component
58 public class JaxRsFilterLogging implements ContainerRequestFilter,ContainerResponseFilter {
59         
60         private static MsoLogger logger = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA,JaxRsFilterLogging.class);
61         
62         @Context
63         private HttpServletRequest httpServletRequest;
64         
65         @Context 
66         private Providers providers;
67         
68         @Autowired
69         ObjectMapper objectMapper;
70         
71         @Override
72         public void filter(ContainerRequestContext containerRequest) {          
73
74                 try {
75                         String clientID = null;
76                         //check headers for request id
77                         MultivaluedMap<String, String> headers = containerRequest.getHeaders();
78                         String requestId = (String) headers.getFirst(MsoLogger.HEADER_REQUEST_ID );
79                         if(requestId == null || requestId.isEmpty()){
80                                 if(headers.containsKey(MsoLogger.TRANSACTION_ID)){
81                                         requestId = headers.getFirst(MsoLogger.TRANSACTION_ID);
82                                 }else if(headers.containsKey(MsoLogger.ECOMP_REQUEST_ID)){
83                                         requestId = headers.getFirst(MsoLogger.ECOMP_REQUEST_ID);
84                                 }else{
85                                         requestId = UUID.randomUUID().toString();
86                                         logger.warnSimple(containerRequest.getUriInfo().getPath(),"Generating RequestId for Request");
87                                 }
88                         }
89                         containerRequest.setProperty("requestId", requestId);
90                         if(headers.containsKey(MsoLogger.CLIENT_ID)){
91                                 clientID = headers.getFirst(MsoLogger.CLIENT_ID);
92                         }else{
93                                 clientID = "UNKNOWN";
94                                 headers.add(MsoLogger.CLIENT_ID, clientID);
95                         }
96                         String remoteIpAddress = "";
97                         if (httpServletRequest != null) {                       
98                                 remoteIpAddress = httpServletRequest.getRemoteAddr();
99                         } 
100                         Instant instant = Instant.now();
101                         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX" )
102                                 .withLocale( Locale.US )
103                                 .withZone( ZoneId.systemDefault() );
104
105                         String partnerName =  headers.getFirst(MsoLogger.HEADER_FROM_APP_ID );
106                         if(partnerName == null || partnerName.isEmpty())
107                                 partnerName="UNKNOWN";  
108                         
109                         MDC.put(MsoLogger.FROM_APP_ID,partnerName);      
110                         MDC.put(MsoLogger.SERVICE_NAME, containerRequest.getUriInfo().getPath());
111                         MDC.put(MsoLogger.BEGINTIME, formatter.format(instant));
112                         MDC.put(MsoLogger.REQUEST_ID,requestId);
113                         MDC.put(MsoLogger.PARTNERNAME,partnerName);                     
114                         MDC.put(MsoLogger.REMOTE_HOST, String.valueOf(remoteIpAddress));
115                         MDC.put(MsoLogger.STARTTIME, String.valueOf(System.currentTimeMillis()));
116                         MDC.put(MsoLogger.CLIENT_ID, clientID);
117                 } catch (Exception e) {
118                         logger.warnSimple("Error in incoming JAX-RS Inteceptor", e);
119                 }
120         }       
121
122
123         @Override
124         public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
125                         throws IOException {
126                 try {
127                         Instant instant = Instant.now();
128                         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX" )
129                                 .withLocale( Locale.US )
130                                 .withZone( ZoneId.systemDefault() );
131                         String startTime= MDC.get(MsoLogger.STARTTIME);
132                         long elapsedTime;
133                         try {
134                                 elapsedTime = System.currentTimeMillis() - Long.parseLong(startTime);
135                         }catch(NumberFormatException e){
136                                 elapsedTime = 0;
137                         }
138                         String statusCode;
139                         if(Response.Status.Family.familyOf(responseContext.getStatus()).equals(Response.Status.Family.SUCCESSFUL)){             
140                             statusCode=MsoLogger.COMPLETE;
141                         }else{                                                  
142                                 statusCode= MsoLogger.StatusCode.ERROR.toString();                              
143                         }                       
144                 
145                         MDC.put(MsoLogger.RESPONSEDESC,payloadMessage(responseContext));
146                         MDC.put(MsoLogger.STATUSCODE, statusCode);
147                         MDC.put(MsoLogger.RESPONSECODE,String.valueOf(responseContext.getStatus()));                    
148                         MDC.put(MsoLogger.TIMER, String.valueOf(elapsedTime));
149                         MDC.put(MsoLogger.ENDTIME,formatter.format(instant));                   
150                         logger.recordAuditEvent();
151                 } catch ( Exception e) {
152                         logger.warnSimple("Error in outgoing JAX-RS Inteceptor", e);
153                 } 
154         } 
155         
156          private String payloadMessage(ContainerResponseContext responseContext) throws IOException {
157                 String message = new String();
158                 if (responseContext.hasEntity()) {
159                     ByteArrayOutputStream baos = new ByteArrayOutputStream();           
160                     Class<?> entityClass = responseContext.getEntityClass();
161                     Type entityType = responseContext.getEntityType();
162                     Annotation[] entityAnnotations = responseContext.getEntityAnnotations();
163                     MediaType mediaType = responseContext.getMediaType();
164                     @SuppressWarnings("unchecked")
165                     MessageBodyWriter<Object> bodyWriter = (MessageBodyWriter<Object>) providers.getMessageBodyWriter(entityClass, 
166                             entityType, 
167                             entityAnnotations, 
168                             mediaType);
169                     bodyWriter.writeTo(responseContext.getEntity(), 
170                             entityClass, 
171                             entityType, 
172                             entityAnnotations, 
173                             mediaType, 
174                             responseContext.getHeaders(), 
175                             baos); 
176                     message = message.concat(new String(baos.toByteArray()));
177                 }
178                 return message;
179          }
180 }