Enhancements for the aai-common library
[aai/aai-common.git] / aai-els-onap-logging / src / main / java / org / onap / aai / aailog / filter / RestControllerClientLoggingInterceptor.java
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 package org.onap.aai.aailog.filter;
21
22 import com.sun.jersey.api.client.ClientHandler;
23 import com.sun.jersey.api.client.ClientHandlerException;
24 import com.sun.jersey.api.client.ClientRequest;
25 import com.sun.jersey.api.client.ClientResponse;
26 import com.sun.jersey.api.client.filter.ClientFilter;
27 import org.onap.aai.aailog.logs.ServiceName;
28 import org.onap.logging.filter.base.Constants;
29 import org.onap.logging.filter.base.MDCSetup;
30 import org.onap.logging.ref.slf4j.ONAPLogConstants;
31 import org.slf4j.*;
32
33 import javax.ws.rs.core.MultivaluedMap;
34 import java.time.ZoneOffset;
35 import java.time.ZonedDateTime;
36 import java.time.format.DateTimeFormatter;
37 import java.util.UUID;
38
39 public class RestControllerClientLoggingInterceptor extends ClientFilter {
40     private static final Logger logger = LoggerFactory.getLogger(RestControllerClientLoggingInterceptor.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 RestControllerClientLoggingInterceptor () {
46         mdcSetup = new MDCSetup();
47         partnerName = getPartnerName();
48     }
49
50     @Override
51     public ClientResponse handle(ClientRequest clientRequest) throws ClientHandlerException {
52         ClientResponse clientResponse = null;
53         pre(clientRequest);
54         // Call the next client handler in the filter chain
55         ClientHandler nextHandler = getNext();
56         if (nextHandler != null) {
57             clientResponse = nextHandler.handle(clientRequest);
58         }
59         if (clientResponse != null) {
60             post(clientResponse);
61         }
62         return clientResponse;
63     }
64
65     protected  String getTargetServiceName(ClientRequest clientRequest) {
66         return getServiceName(clientRequest);
67     }
68
69     protected  String getServiceName(ClientRequest clientRequest) {
70         String path = clientRequest.getURI().getRawPath();
71         return ServiceName.extractServiceName(path);
72     }
73
74     protected int getHttpStatusCode(ClientResponse response) {
75         return response.getStatus();
76     }
77
78     protected  String getResponseCode(ClientResponse clientResponse) {
79         return String.valueOf(clientResponse.getStatus());
80     }
81
82
83     protected  String getTargetEntity(ClientRequest ClientRequest) {
84         return Constants.DefaultValues.UNKNOWN_TARGET_ENTITY;
85     };
86
87     protected void pre(ClientRequest clientRequest) {
88         try {
89             setInvocationId(clientRequest);
90             setupMDC(clientRequest);
91             setupHeaders(clientRequest);
92             logger.info(ONAPLogConstants.Markers.INVOKE, "Invoke");
93         } catch (Exception e) {
94             logger.warn("Error in RestControllerClientLoggingInterceptor pre", e.getMessage());
95         }
96     }
97     public void setInvocationId(ClientRequest clientRequest) {
98         String invocationId = null;
99         MultivaluedMap<String, Object> requestHeaders = clientRequest.getHeaders();
100         Object id = requestHeaders.get(ONAPLogConstants.Headers.INVOCATION_ID);
101         if (id != null) {
102             invocationId = (String)id;
103         }
104         requestHeaders.remove(ONAPLogConstants.Headers.INVOCATION_ID);
105         if (invocationId == null) {
106             invocationId = UUID.randomUUID().toString();
107         }
108         MDC.put(ONAPLogConstants.MDCs.INVOCATION_ID, invocationId);
109     }
110     protected void setupHeaders(ClientRequest clientRequest) {
111         String requestId = extractRequestID(clientRequest);
112         MultivaluedMap<String, Object> requestHeaders = clientRequest.getHeaders();
113         addHeader(requestHeaders, ONAPLogConstants.Headers.REQUEST_ID, requestId);
114         addHeader(requestHeaders, Constants.HttpHeaders.HEADER_REQUEST_ID, requestId);
115         Object requestIdObj = requestHeaders.getFirst(Constants.HttpHeaders.TRANSACTION_ID);
116         if (requestIdObj == null) {
117             addHeader(requestHeaders, Constants.HttpHeaders.TRANSACTION_ID, requestId);
118         }
119         addHeader(requestHeaders, Constants.HttpHeaders.ECOMP_REQUEST_ID, requestId);
120         addHeader(requestHeaders, ONAPLogConstants.Headers.INVOCATION_ID, MDC.get(ONAPLogConstants.MDCs.INVOCATION_ID));
121         if (partnerName != null && (!partnerName.isEmpty())){
122             addHeader(requestHeaders, ONAPLogConstants.Headers.PARTNER_NAME, partnerName);
123         }
124     }
125
126     protected void setupMDC(ClientRequest clientRequest) {
127         MDC.put(ONAPLogConstants.MDCs.INVOKE_TIMESTAMP,
128             ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT));
129         MDC.put(ONAPLogConstants.MDCs.TARGET_SERVICE_NAME, getTargetServiceName(clientRequest));
130         MDC.put(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE, ONAPLogConstants.ResponseStatus.INPROGRESS.toString());
131         mdcSetup.setInvocationIdFromMDC();
132
133         if (MDC.get(ONAPLogConstants.MDCs.TARGET_ENTITY) == null) {
134             String targetEntity = getTargetEntity(clientRequest);
135             if (targetEntity != null) {
136                 MDC.put(ONAPLogConstants.MDCs.TARGET_ENTITY, targetEntity);
137             } else {
138                 MDC.put(ONAPLogConstants.MDCs.TARGET_ENTITY, Constants.DefaultValues.UNKNOWN_TARGET_ENTITY);
139             }
140         }
141
142         if (MDC.get(ONAPLogConstants.MDCs.SERVICE_NAME) == null) {
143             MDC.put(ONAPLogConstants.MDCs.SERVICE_NAME, getServiceName(clientRequest));
144         }
145         mdcSetup.setServerFQDN();
146     }
147
148     protected String extractRequestID(ClientRequest clientRequest) {
149         String requestId = MDC.get(ONAPLogConstants.MDCs.REQUEST_ID);
150         if (requestId == null || requestId.isEmpty()) {
151             MultivaluedMap<String, Object> requestHeaders = clientRequest.getHeaders();
152             Object requestIdObj = requestHeaders.getFirst(Constants.HttpHeaders.TRANSACTION_ID);
153             if (requestIdObj != null) {
154                 requestId = (String)requestIdObj;
155             }
156             if ( requestId == null || requestId.isEmpty() ) {
157                 requestId = UUID.randomUUID().toString();
158             }
159             mdcSetup.setLogTimestamp();
160             mdcSetup.setElapsedTimeInvokeTimestamp();
161             logger.warn("No value found in MDC when checking key {} value will be set to {}",
162                 ONAPLogConstants.MDCs.REQUEST_ID, requestId);
163             MDC.put(ONAPLogConstants.MDCs.REQUEST_ID, requestId);
164         }
165         return requestId;
166     }
167
168     protected void post(ClientResponse clientResponse) {
169         try {
170             mdcSetup.setLogTimestamp();
171             mdcSetup.setElapsedTimeInvokeTimestamp();
172             mdcSetup.setResponseStatusCode(getHttpStatusCode(clientResponse));
173             mdcSetup.setResponseDescription(getHttpStatusCode(clientResponse));
174             MDC.put(ONAPLogConstants.MDCs.RESPONSE_CODE, getResponseCode(clientResponse));
175             logger.info(INVOKE_RETURN, "InvokeReturn");
176             mdcSetup.clearClientMDCs();
177         } catch (Exception e) {
178             logger.warn("Error in RestControllerClientLoggingInterceptor post", e.getMessage());
179         }
180     }
181     protected String getPartnerName() {
182         return mdcSetup.getProperty(Constants.Property.PARTNER_NAME);
183     }
184
185     protected void addHeader(MultivaluedMap<String, Object> requestHeaders, String headerName, String headerValue) {
186         requestHeaders.add(headerName, headerValue);
187     }
188 }