2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2017-2018 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.aai.aailog.filter;
23 import java.io.IOException;
24 import java.time.ZoneOffset;
25 import java.time.ZonedDateTime;
26 import java.time.format.DateTimeFormatter;
27 import java.util.UUID;
29 import javax.ws.rs.core.MultivaluedMap;
30 import javax.ws.rs.client.ClientRequestContext;
31 import javax.ws.rs.client.ClientRequestFilter;
32 import org.glassfish.jersey.client.ClientResponse;
33 import org.onap.aai.aailog.logs.ServiceName;
34 import org.onap.logging.filter.base.Constants;
35 import org.onap.logging.filter.base.MDCSetup;
36 import org.onap.logging.ref.slf4j.ONAPLogConstants;
39 public class RestControllerClientRequestLoggingInterceptor implements ClientRequestFilter {
40 private static final Logger logger = LoggerFactory.getLogger(RestControllerClientRequestLoggingInterceptor.class);
41 private static final Marker INVOKE_RETURN = MarkerFactory.getMarker("INVOKE-RETURN");
42 private final MDCSetup mdcSetup;
43 private final String partnerName;
45 public RestControllerClientRequestLoggingInterceptor() {
46 mdcSetup = new MDCSetup();
47 partnerName = getPartnerName();
50 protected String getTargetServiceName(ClientRequestContext requestContext) {
51 return getServiceName(requestContext);
54 protected String getServiceName(ClientRequestContext requestContext) {
55 String path = requestContext.getUri().getRawPath();
56 return ServiceName.extractServiceName(path);
59 protected int getHttpStatusCode(ClientResponse response) {
60 return response.getStatus();
63 protected String getResponseCode(ClientResponse clientResponse) {
64 return String.valueOf(clientResponse.getStatus());
67 protected String getTargetEntity(ClientRequestContext requestContext) {
68 return Constants.DefaultValues.UNKNOWN_TARGET_ENTITY;
72 public void filter(ClientRequestContext requestContext) throws IOException {
76 protected void pre(ClientRequestContext requestContext) {
78 setInvocationId(requestContext);
79 setupMDC(requestContext);
80 setupHeaders(requestContext);
81 logger.info(ONAPLogConstants.Markers.INVOKE, "Invoke");
82 } catch (Exception e) {
83 logger.warn("Error in RestControllerClientLoggingInterceptor pre", e.getMessage());
87 public void setInvocationId(ClientRequestContext requestContext) {
88 String invocationId = null;
89 MultivaluedMap<String, Object> requestHeaders = requestContext.getHeaders();
90 Object id = requestHeaders.get(ONAPLogConstants.Headers.INVOCATION_ID);
92 invocationId = (String) id;
94 requestHeaders.remove(ONAPLogConstants.Headers.INVOCATION_ID);
95 if (invocationId == null) {
96 invocationId = UUID.randomUUID().toString();
98 MDC.put(ONAPLogConstants.MDCs.INVOCATION_ID, invocationId);
101 protected void setupHeaders(ClientRequestContext requestContext) {
102 String requestId = extractRequestID(requestContext);
103 MultivaluedMap<String, Object> requestHeaders = requestContext.getHeaders();
104 addHeader(requestHeaders, ONAPLogConstants.Headers.REQUEST_ID, requestId);
105 addHeader(requestHeaders, Constants.HttpHeaders.HEADER_REQUEST_ID, requestId);
106 Object requestIdObj = requestHeaders.getFirst(Constants.HttpHeaders.TRANSACTION_ID);
107 if (requestIdObj == null) {
108 addHeader(requestHeaders, Constants.HttpHeaders.TRANSACTION_ID, requestId);
110 addHeader(requestHeaders, Constants.HttpHeaders.ECOMP_REQUEST_ID, requestId);
111 addHeader(requestHeaders, ONAPLogConstants.Headers.INVOCATION_ID, MDC.get(ONAPLogConstants.MDCs.INVOCATION_ID));
112 if (partnerName != null && (!partnerName.isEmpty())) {
113 addHeader(requestHeaders, ONAPLogConstants.Headers.PARTNER_NAME, partnerName);
117 protected void setupMDC(ClientRequestContext requestContext) {
118 MDC.put(ONAPLogConstants.MDCs.INVOKE_TIMESTAMP,
119 ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT));
120 MDC.put(ONAPLogConstants.MDCs.TARGET_SERVICE_NAME, getTargetServiceName(requestContext));
121 MDC.put(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE, ONAPLogConstants.ResponseStatus.INPROGRESS.toString());
122 mdcSetup.setInvocationIdFromMDC();
124 if (MDC.get(ONAPLogConstants.MDCs.TARGET_ENTITY) == null) {
125 String targetEntity = getTargetEntity(requestContext);
126 if (targetEntity != null) {
127 MDC.put(ONAPLogConstants.MDCs.TARGET_ENTITY, targetEntity);
129 MDC.put(ONAPLogConstants.MDCs.TARGET_ENTITY, Constants.DefaultValues.UNKNOWN_TARGET_ENTITY);
133 if (MDC.get(ONAPLogConstants.MDCs.SERVICE_NAME) == null) {
134 MDC.put(ONAPLogConstants.MDCs.SERVICE_NAME, getServiceName(requestContext));
136 mdcSetup.setServerFQDN();
139 protected String extractRequestID(ClientRequestContext requestContext) {
140 String requestId = MDC.get(ONAPLogConstants.MDCs.REQUEST_ID);
141 if (requestId == null || requestId.isEmpty()) {
142 MultivaluedMap<String, Object> requestHeaders = requestContext.getHeaders();
143 Object requestIdObj = requestHeaders.getFirst(Constants.HttpHeaders.TRANSACTION_ID);
144 if (requestIdObj != null) {
145 requestId = (String) requestIdObj;
147 if (requestId == null || requestId.isEmpty()) {
148 requestId = UUID.randomUUID().toString();
150 mdcSetup.setLogTimestamp();
151 mdcSetup.setElapsedTimeInvokeTimestamp();
152 logger.warn("No value found in MDC when checking key {} value will be set to {}",
153 ONAPLogConstants.MDCs.REQUEST_ID, requestId);
154 MDC.put(ONAPLogConstants.MDCs.REQUEST_ID, requestId);
159 protected void post(ClientResponse clientResponse) {
161 mdcSetup.setLogTimestamp();
162 mdcSetup.setElapsedTimeInvokeTimestamp();
163 mdcSetup.setResponseStatusCode(getHttpStatusCode(clientResponse));
164 mdcSetup.setResponseDescription(getHttpStatusCode(clientResponse));
165 MDC.put(ONAPLogConstants.MDCs.RESPONSE_CODE, getResponseCode(clientResponse));
166 logger.info(INVOKE_RETURN, "InvokeReturn");
167 mdcSetup.clearClientMDCs();
168 } catch (Exception e) {
169 logger.warn("Error in RestControllerClientLoggingInterceptor post", e.getMessage());
173 protected String getPartnerName() {
174 return mdcSetup.getProperty(Constants.Property.PARTNER_NAME);
177 protected void addHeader(MultivaluedMap<String, Object> requestHeaders, String headerName, String headerValue) {
178 requestHeaders.add(headerName, headerValue);