2 * ============LICENSE_START=======================================================
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
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.logging.filter.base;
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;
39 import org.slf4j.Marker;
40 import org.slf4j.MarkerFactory;
43 public class MetricLogClientFilter implements ClientRequestFilter, ClientResponseFilter {
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");
53 public MetricLogClientFilter() {
54 partnerName = getPartnerName();
58 public void filter(ClientRequestContext clientRequest) {
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);
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);
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);
89 MDC.put(ONAPLogConstants.MDCs.TARGET_ENTITY, Constants.DefaultValues.UNKNOWN_TARGET_ENTITY);
91 if (MDC.get(ONAPLogConstants.MDCs.SERVICE_NAME) == null) {
92 MDC.put(ONAPLogConstants.MDCs.SERVICE_NAME, clientRequest.getUri().getPath());
94 mdcSetup.setServerFQDN();
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);
110 public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) {
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);
124 protected String getPartnerName() {
125 PropertyUtil p = new PropertyUtil();
126 return p.getProperty(Constants.Property.PARTNER_NAME);