2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.onap.so.logging.jaxrs.filter.jersey;
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;
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;
48 import org.onap.so.logger.MsoLogger;
50 import org.springframework.beans.factory.annotation.Autowired;
51 import org.springframework.stereotype.Component;
53 import com.fasterxml.jackson.databind.ObjectMapper;
58 public class JaxRsFilterLogging implements ContainerRequestFilter,ContainerResponseFilter {
60 private static MsoLogger logger = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA,JaxRsFilterLogging.class);
63 private HttpServletRequest httpServletRequest;
66 private Providers providers;
69 ObjectMapper objectMapper;
72 public void filter(ContainerRequestContext containerRequest) {
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);
85 requestId = UUID.randomUUID().toString();
86 logger.warnSimple(containerRequest.getUriInfo().getPath(),"Generating RequestId for Request");
89 containerRequest.setProperty("requestId", requestId);
90 if(headers.containsKey(MsoLogger.CLIENT_ID)){
91 clientID = headers.getFirst(MsoLogger.CLIENT_ID);
94 headers.add(MsoLogger.CLIENT_ID, clientID);
96 String remoteIpAddress = "";
97 if (httpServletRequest != null) {
98 remoteIpAddress = httpServletRequest.getRemoteAddr();
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() );
105 String partnerName = headers.getFirst(MsoLogger.HEADER_FROM_APP_ID );
106 if(partnerName == null || partnerName.isEmpty())
107 partnerName="UNKNOWN";
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);
124 public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
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);
134 elapsedTime = System.currentTimeMillis() - Long.parseLong(startTime);
135 }catch(NumberFormatException e){
139 if(Response.Status.Family.familyOf(responseContext.getStatus()).equals(Response.Status.Family.SUCCESSFUL)){
140 statusCode=MsoLogger.COMPLETE;
142 statusCode= MsoLogger.StatusCode.ERROR.toString();
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);
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,
169 bodyWriter.writeTo(responseContext.getEntity(),
174 responseContext.getHeaders(),
176 message = message.concat(new String(baos.toByteArray()));