7a90aff0ee22a7518cfbd7ce70d42b57e0a28ae5
[aai/aai-common.git] /
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
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
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.aai.aailog.filter;
22
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;
28
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;
37 import org.slf4j.*;
38
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;
44
45     public RestControllerClientRequestLoggingInterceptor() {
46         mdcSetup = new MDCSetup();
47         partnerName = getPartnerName();
48     }
49
50     protected String getTargetServiceName(ClientRequestContext requestContext) {
51         return getServiceName(requestContext);
52     }
53
54     protected String getServiceName(ClientRequestContext requestContext) {
55         String path = requestContext.getUri().getRawPath();
56         return ServiceName.extractServiceName(path);
57     }
58
59     protected int getHttpStatusCode(ClientResponse response) {
60         return response.getStatus();
61     }
62
63     protected String getResponseCode(ClientResponse clientResponse) {
64         return String.valueOf(clientResponse.getStatus());
65     }
66
67     protected String getTargetEntity(ClientRequestContext requestContext) {
68         return Constants.DefaultValues.UNKNOWN_TARGET_ENTITY;
69     };
70
71     @Override
72     public void filter(ClientRequestContext requestContext) throws IOException {
73         pre(requestContext);
74     }
75
76     protected void pre(ClientRequestContext requestContext) {
77         try {
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());
84         }
85     }
86
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);
91         if (id != null) {
92             invocationId = (String) id;
93         }
94         requestHeaders.remove(ONAPLogConstants.Headers.INVOCATION_ID);
95         if (invocationId == null) {
96             invocationId = UUID.randomUUID().toString();
97         }
98         MDC.put(ONAPLogConstants.MDCs.INVOCATION_ID, invocationId);
99     }
100
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);
109         }
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);
114         }
115     }
116
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();
123
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);
128             } else {
129                 MDC.put(ONAPLogConstants.MDCs.TARGET_ENTITY, Constants.DefaultValues.UNKNOWN_TARGET_ENTITY);
130             }
131         }
132
133         if (MDC.get(ONAPLogConstants.MDCs.SERVICE_NAME) == null) {
134             MDC.put(ONAPLogConstants.MDCs.SERVICE_NAME, getServiceName(requestContext));
135         }
136         mdcSetup.setServerFQDN();
137     }
138
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;
146             }
147             if (requestId == null || requestId.isEmpty()) {
148                 requestId = UUID.randomUUID().toString();
149             }
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);
155         }
156         return requestId;
157     }
158
159     protected void post(ClientResponse clientResponse) {
160         try {
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());
170         }
171     }
172
173     protected String getPartnerName() {
174         return mdcSetup.getProperty(Constants.Property.PARTNER_NAME);
175     }
176
177     protected void addHeader(MultivaluedMap<String, Object> requestHeaders, String headerName, String headerValue) {
178         requestHeaders.add(headerName, headerValue);
179     }
180 }