85334568bab8e402ffdf50bfc012c03cba2876bb
[logging-analytics.git] / reference / logging-filter / logging-filter-base / src / main / java / org / onap / logging / filter / base / MetricLogClientFilter.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - Logging
4  * ================================================================================
5  * Copyright (C) 2019 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.logging.filter.base;
22
23 import java.time.ZoneOffset;
24 import java.time.ZonedDateTime;
25 import java.time.format.DateTimeFormatter;
26 import java.util.UUID;
27 import javax.annotation.Priority;
28 import javax.ws.rs.client.ClientRequestContext;
29 import javax.ws.rs.client.ClientRequestFilter;
30 import javax.ws.rs.client.ClientResponseContext;
31 import javax.ws.rs.client.ClientResponseFilter;
32 import javax.ws.rs.core.Context;
33 import javax.ws.rs.core.MultivaluedMap;
34 import javax.ws.rs.ext.Providers;
35 import org.onap.logging.ref.slf4j.ONAPLogConstants;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38 import org.slf4j.MDC;
39 import org.slf4j.Marker;
40 import org.slf4j.MarkerFactory;
41
42 @Priority(0)
43 public class MetricLogClientFilter implements ClientRequestFilter, ClientResponseFilter {
44
45     @Context
46     private Providers providers;
47     private MDCSetup mdcSetup = new MDCSetup();
48     private static final String TRACE = "trace-#";
49     private static Logger logger = LoggerFactory.getLogger(MetricLogClientFilter.class);
50     private final String partnerName;
51     private static final Marker INVOKE_RETURN = MarkerFactory.getMarker("INVOKE-RETURN");
52
53     public MetricLogClientFilter() {
54         partnerName = getPartnerName();
55     }
56
57     @Override
58     public void filter(ClientRequestContext clientRequest) {
59         try {
60             setupMDC(clientRequest);
61             setupHeaders(clientRequest);
62             logger.info(ONAPLogConstants.Markers.INVOKE, "Invoke");
63         } catch (Exception e) {
64             logger.warn("Error in JAX-RS client request filter", e);
65         }
66     }
67
68     protected void setupHeaders(ClientRequestContext clientRequest) {
69         MultivaluedMap<String, Object> headers = clientRequest.getHeaders();
70         String requestId = extractRequestID(clientRequest);
71         headers.add(ONAPLogConstants.Headers.REQUEST_ID, requestId);
72         headers.add(Constants.HttpHeaders.HEADER_REQUEST_ID, requestId);
73         headers.add(Constants.HttpHeaders.TRANSACTION_ID, requestId);
74         headers.add(Constants.HttpHeaders.ECOMP_REQUEST_ID, requestId);
75         headers.add(ONAPLogConstants.Headers.INVOCATION_ID, MDC.get(ONAPLogConstants.MDCs.INVOCATION_ID));
76         headers.add(ONAPLogConstants.Headers.PARTNER_NAME, partnerName);
77     }
78
79     protected void setupMDC(ClientRequestContext clientRequest) {
80         MDC.put(ONAPLogConstants.MDCs.INVOKE_TIMESTAMP,
81                 ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT));
82         MDC.put(ONAPLogConstants.MDCs.TARGET_SERVICE_NAME, clientRequest.getUri().toString());
83         MDC.put(ONAPLogConstants.MDCs.RESPONSE_STATUS_CODE, ONAPLogConstants.ResponseStatus.INPROGRESS.toString());
84         mdcSetup.setInvocationIdFromMDC();
85         String targetEntity = MDC.get(ONAPLogConstants.MDCs.TARGET_ENTITY);
86         if (targetEntity != null) {
87             MDC.put(ONAPLogConstants.MDCs.TARGET_ENTITY, targetEntity);
88         } else {
89             MDC.put(ONAPLogConstants.MDCs.TARGET_ENTITY, Constants.DefaultValues.UNKNOWN_TARGET_ENTITY);
90         }
91         if (MDC.get(ONAPLogConstants.MDCs.SERVICE_NAME) == null) {
92             MDC.put(ONAPLogConstants.MDCs.SERVICE_NAME, clientRequest.getUri().getPath());
93         }
94         mdcSetup.setServerFQDN();
95     }
96
97     protected String extractRequestID(ClientRequestContext clientRequest) {
98         String requestId = MDC.get(ONAPLogConstants.MDCs.REQUEST_ID);
99         if (requestId == null || requestId.isEmpty() || requestId.equals(TRACE)) {
100             requestId = UUID.randomUUID().toString();
101             mdcSetup.setLogTimestamp();
102             mdcSetup.setElapsedTimeInvokeTimestamp();
103             logger.warn("Could not Find Request ID Generating New One: {}", clientRequest.getUri().getPath());
104             MDC.put(ONAPLogConstants.MDCs.REQUEST_ID, requestId);
105         }
106         return requestId;
107     }
108
109     @Override
110     public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) {
111         try {
112             mdcSetup.setLogTimestamp();
113             mdcSetup.setElapsedTimeInvokeTimestamp();
114             mdcSetup.setResponseStatusCode(responseContext.getStatus());
115             mdcSetup.setResponseDescription(responseContext.getStatus());
116             MDC.put(ONAPLogConstants.MDCs.RESPONSE_CODE, String.valueOf(responseContext.getStatus()));
117             logger.info(INVOKE_RETURN, "InvokeReturn");
118             mdcSetup.clearClientMDCs();
119         } catch (Exception e) {
120             logger.warn("Error in JAX-RS request,response client filter", e);
121         }
122     }
123
124     protected String getPartnerName() {
125         PropertyUtil p = new PropertyUtil();
126         return p.getProperty(Constants.Property.PARTNER_NAME);
127     }
128 }