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;
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;
46 import org.springframework.beans.factory.annotation.Autowired;
47 import org.springframework.stereotype.Component;
48 import com.fasterxml.jackson.databind.ObjectMapper;
53 public class JaxRsFilterLogging implements ContainerRequestFilter,ContainerResponseFilter {
55 protected static Logger logger = LoggerFactory.getLogger(JaxRsFilterLogging.class);
58 private HttpServletRequest httpServletRequest;
61 private Providers providers;
64 private MDCSetup mdcSetup;
67 public void filter(ContainerRequestContext containerRequest) {
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);
87 public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
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.");
95 } catch ( Exception e) {
97 logger.warn("Error in outgoing JAX-RS Inteceptor", e);
101 private void setResponseStatusCode(ContainerResponseContext responseContext) {
103 if(Response.Status.Family.familyOf(responseContext.getStatus()).equals(Response.Status.Family.SUCCESSFUL)){
104 statusCode=ONAPLogConstants.ResponseStatus.COMPLETED.toString();
106 statusCode= ONAPLogConstants.ResponseStatus.ERROR.toString();
108 MDC.put(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE, statusCode);
111 private String payloadMessage(ContainerResponseContext responseContext) throws IOException {
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,
124 bodyWriter.writeTo(responseContext.getEntity(),
129 responseContext.getHeaders(),
131 message = message.concat(new String(baos.toByteArray()));
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);
144 private void setInvocationId(MultivaluedMap<String, String> headers){
145 MDC.put(ONAPLogConstants.MDCs.INVOCATION_ID, findInvocationId(headers));
148 private void setMDCPartnerName(MultivaluedMap<String, String> headers){
149 String partnerName=headers.getFirst(ONAPLogConstants.Headers.PARTNER_NAME);
150 if(partnerName == null || partnerName.isEmpty())
152 MDC.put(ONAPLogConstants.MDCs.PARTNER_NAME,partnerName);
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();
162 private void setServiceName(ContainerRequestContext containerRequest){
163 MDC.put(ONAPLogConstants.MDCs.SERVICE_NAME, containerRequest.getUriInfo().getPath());
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);