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.onap.so.logger.LogConstants;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
47 import org.springframework.beans.factory.annotation.Autowired;
48 import org.springframework.stereotype.Component;
49 import com.fasterxml.jackson.databind.ObjectMapper;
54 public class JaxRsFilterLogging implements ContainerRequestFilter, ContainerResponseFilter {
56 protected static Logger logger = LoggerFactory.getLogger(JaxRsFilterLogging.class);
59 private HttpServletRequest httpServletRequest;
62 private Providers providers;
65 private MDCSetup mdcSetup;
68 public void filter(ContainerRequestContext containerRequest) {
70 MultivaluedMap<String, String> headers = containerRequest.getHeaders();
71 setRequestId(headers);
72 containerRequest.setProperty("requestId", MDC.get(ONAPLogConstants.MDCs.REQUEST_ID));
73 setInvocationId(headers);
74 setServiceName(containerRequest);
75 setMDCPartnerName(headers);
76 mdcSetup.setServerFQDN();
77 mdcSetup.setClientIPAddress(httpServletRequest);
78 mdcSetup.setInstanceUUID();
79 mdcSetup.setEntryTimeStamp();
80 MDC.put(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE, ONAPLogConstants.ResponseStatus.INPROGRESS.toString());
81 MDC.put(LogConstants.URI_BASE, containerRequest.getUriInfo().getBaseUri().toString());
82 logger.info(ONAPLogConstants.Markers.ENTRY, "Entering");
83 } catch (Exception e) {
84 logger.warn("Error in incoming JAX-RS Inteceptor", e);
89 public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
92 setResponseStatusCode(responseContext);
93 MDC.put(ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION, payloadMessage(responseContext));
94 MDC.put(ONAPLogConstants.MDCs.RESPONSE_CODE, String.valueOf(responseContext.getStatus()));
95 logger.info(ONAPLogConstants.Markers.EXIT, "Exiting.");
97 } catch (Exception e) {
99 logger.warn("Error in outgoing JAX-RS Inteceptor", e);
103 private void setResponseStatusCode(ContainerResponseContext responseContext) {
105 if (Response.Status.Family.familyOf(responseContext.getStatus()).equals(Response.Status.Family.SUCCESSFUL)) {
106 statusCode = ONAPLogConstants.ResponseStatus.COMPLETED.toString();
108 statusCode = ONAPLogConstants.ResponseStatus.ERROR.toString();
110 MDC.put(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE, statusCode);
113 private String payloadMessage(ContainerResponseContext responseContext) throws IOException {
115 if (responseContext.hasEntity()) {
116 ByteArrayOutputStream baos = new ByteArrayOutputStream();
117 Class<?> entityClass = responseContext.getEntityClass();
118 Type entityType = responseContext.getEntityType();
119 Annotation[] entityAnnotations = responseContext.getEntityAnnotations();
120 MediaType mediaType = responseContext.getMediaType();
121 @SuppressWarnings("unchecked")
122 MessageBodyWriter<Object> bodyWriter = (MessageBodyWriter<Object>) providers
123 .getMessageBodyWriter(entityClass, entityType, entityAnnotations, mediaType);
124 bodyWriter.writeTo(responseContext.getEntity(), entityClass, entityType, entityAnnotations, mediaType,
125 responseContext.getHeaders(), baos);
126 message = message.concat(new String(baos.toByteArray()));
132 private void setRequestId(MultivaluedMap<String, String> headers) {
133 String requestId = headers.getFirst(ONAPLogConstants.Headers.REQUEST_ID);
134 if (requestId == null || requestId.isEmpty())
135 requestId = UUID.randomUUID().toString();
136 MDC.put(ONAPLogConstants.MDCs.REQUEST_ID, requestId);
139 private void setInvocationId(MultivaluedMap<String, String> headers) {
140 MDC.put(ONAPLogConstants.MDCs.INVOCATION_ID, findInvocationId(headers));
143 private void setMDCPartnerName(MultivaluedMap<String, String> headers) {
144 String partnerName = headers.getFirst(ONAPLogConstants.Headers.PARTNER_NAME);
145 if (partnerName == null || partnerName.isEmpty())
147 MDC.put(ONAPLogConstants.MDCs.PARTNER_NAME, partnerName);
150 private String findInvocationId(MultivaluedMap<String, String> headers) {
151 String invocationId = headers.getFirst(ONAPLogConstants.Headers.INVOCATION_ID);
152 if (invocationId == null || invocationId.isEmpty())
153 invocationId = UUID.randomUUID().toString();
157 private void setServiceName(ContainerRequestContext containerRequest) {
158 MDC.put(ONAPLogConstants.MDCs.SERVICE_NAME, containerRequest.getUriInfo().getPath());
161 private void clearClientMDCs() {
162 MDC.remove(ONAPLogConstants.MDCs.INVOCATION_ID);
163 MDC.remove(ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION);
164 MDC.remove(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE);
165 MDC.remove(ONAPLogConstants.MDCs.RESPONSE_DESCRIPTION);
166 MDC.remove(ONAPLogConstants.MDCs.RESPONSE_CODE);
167 MDC.remove(ONAPLogConstants.MDCs.TARGET_ENTITY);
168 MDC.remove(ONAPLogConstants.MDCs.PARTNER_NAME);
169 MDC.remove(ONAPLogConstants.MDCs.TARGET_SERVICE_NAME);