fix swagger issue 35/48535/3
authorMichael Lando <ml636r@att.com>
Tue, 22 May 2018 17:43:41 +0000 (20:43 +0300)
committerMichael Lando <ml636r@att.com>
Thu, 24 May 2018 12:08:44 +0000 (15:08 +0300)
update the config servlt with mdc logs

Change-Id: I0f0b9b4895ba16895ce5c11539904e1072a53782
Issue-ID: SDC-1321
Signed-off-by: Michael Lando <ml636r@att.com>
catalog-be/pom.xml
catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/PluginStatusBL.java
catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigServlet.java
catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/FeProxyServlet.java
catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/LoggingServlet.java [new file with mode: 0644]
common-app-api/src/main/java/org/openecomp/sdc/common/servlets/BasicServlet.java
common-app-api/src/main/java/org/openecomp/sdc/fe/config/PluginsConfiguration.java

index 0ca00c7..ab982d7 100644 (file)
             <groupId>io.swagger</groupId>
             <artifactId>swagger-jersey2-jaxrs</artifactId>
             <scope>compile</scope>
-            <version>1.5.18</version>
-        </dependency>
-        
-        <!-- <dependency>
-               <groupId>io.swagger.core.v3</groupId>
-               <artifactId>swagger-jaxrs2</artifactId>
-               <version>2.0.0-rc4</version>
-               </dependency> -->
+            <version>1.5.15</version>
+        </dependency>
         <!-- Swagger Dependencies End -->
 
         <dependency>
index 5ed4585..cdf965d 100644 (file)
@@ -20,18 +20,24 @@ import com.google.gson.GsonBuilder;
 
 public class PluginStatusBL {
 
-       private static Logger log = LoggerFactory.getLogger(PluginStatusBL.class.getName());
-       private static  Gson gson = new GsonBuilder().setPrettyPrinting().create();
-       private CloseableHttpClient client = null;
-       private PluginsConfiguration pluginsConfiguration = ConfigurationManager.getConfigurationManager().getPluginsConfiguration();
+       private static final Logger log = LoggerFactory.getLogger(PluginStatusBL.class.getName());
+       private final Gson gson;
+       private final CloseableHttpClient client;
+       private final PluginsConfiguration pluginsConfiguration;
        private Integer connectionTimeout;
+       private RequestConfig requestConfig;
 
        public PluginStatusBL() {
+               this.pluginsConfiguration = ConfigurationManager.getConfigurationManager().getPluginsConfiguration();
                this.client = HttpClients.createDefault();
+               this.gson = new GsonBuilder().setPrettyPrinting().create();
        }
 
        public PluginStatusBL(CloseableHttpClient client) {
+               this.pluginsConfiguration = ConfigurationManager.getConfigurationManager().getPluginsConfiguration();
                this.client = client;
+
+               this.gson = new GsonBuilder().setPrettyPrinting().create();
                                
        }
 
@@ -43,6 +49,10 @@ public class PluginStatusBL {
                } else {
                        log.debug("The value returned from getConfig is {}", pluginsConfiguration);
                        connectionTimeout = pluginsConfiguration.getConnectionTimeout();
+                       this.requestConfig = RequestConfig.custom()
+                                       .setSocketTimeout(connectionTimeout)
+                                       .setConnectTimeout(connectionTimeout)
+                                       .setConnectionRequestTimeout(connectionTimeout).build();
 
                        List<Plugin> availablePluginsList = new ArrayList<>();
 
@@ -58,17 +68,14 @@ public class PluginStatusBL {
 
        private boolean checkPluginAvailability(Plugin plugin) {
                boolean result = false;
-
+               log.debug("sending head request to id:{} url:{}",plugin.getPluginId(),plugin.getPluginDiscoveryUrl());
                HttpHead head = new HttpHead(plugin.getPluginDiscoveryUrl());
-               RequestConfig requestConfig = RequestConfig.custom()
-                               .setSocketTimeout(connectionTimeout)
-                               .setConnectTimeout(connectionTimeout)
-                               .setConnectionRequestTimeout(connectionTimeout).build();
 
-               head.setConfig(requestConfig);
+               head.setConfig(this.requestConfig);
 
                try (CloseableHttpResponse response = this.client.execute(head)) {
                        result = response != null && response.getStatusLine().getStatusCode() == 200;
+                       log.debug("The plugin {} is online", plugin.getPluginId());
                } catch (IOException e) {
                        log.debug("The plugin {} is offline", plugin.getPluginId());
                }
index cbe5c43..4371236 100644 (file)
 
 package org.openecomp.sdc.fe.servlets;
 
-import java.util.concurrent.TimeUnit;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.fe.config.FeEcompErrorManager;
+import org.openecomp.sdc.fe.impl.PluginStatusBL;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
-import javax.ws.rs.container.AsyncResponse;
-import javax.ws.rs.container.Suspended;
-import javax.ws.rs.container.TimeoutHandler;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
-import org.openecomp.sdc.common.api.ConfigurationSource;
-import org.openecomp.sdc.common.api.Constants;
-import org.openecomp.sdc.common.servlets.BasicServlet;
-import org.openecomp.sdc.fe.config.Configuration;
-import org.openecomp.sdc.fe.impl.PluginStatusBL;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 /**
  * Root resource (exposed at "/" path)
  */
 @Path("/config")
-public class ConfigServlet extends BasicServlet {
-
-       private static final long serialVersionUID = 1L;
-       private static Logger log = LoggerFactory.getLogger(ConfigServlet.class.getName());
-
-       //@GET
-       //@Path("/get")
-       //@Produces(MediaType.APPLICATION_JSON)
-       public String getConfig(@Context final HttpServletRequest request) {
-
-               String result = null;
+public class ConfigServlet extends LoggingServlet {
 
-               ServletContext context = request.getSession().getServletContext();
+       private static final Logger log = LoggerFactory.getLogger(ConfigServlet.class.getName());
 
-               ConfigurationSource configurationSource = (ConfigurationSource) context
-                               .getAttribute(Constants.CONFIGURATION_SOURCE_ATTR);
-               if (configurationSource != null) {
-                       Configuration configuration = configurationSource.getAndWatchConfiguration(Configuration.class, null);
-
-                       if (configuration == null) {
-                               log.warn("Configuration of type {} was not found", Configuration.class);
-                       }
-                       log.debug("{}", configuration);
-                       if (log.isInfoEnabled()) {
-                               log.info("Info level ENABLED...");
-                       }
-                       log.info("The value returned from getConfig is {}", configuration);
-
-                       result = gson.toJson(configuration);
-
-               } else {
-                       log.warn("Source Configuration object was not initialized in the context.");
-               }
 
-               return result;
+       @GET
+       @Path("/ui/plugins")
+       @Produces(MediaType.APPLICATION_JSON)
+       public Response getPluginsConfiguration(@Context final HttpServletRequest request) {
 
-       }
+               try {
+                       logFeRequest(request);
 
-       //@GET
-       //@Path("/asyncget")
-       public void asyncGet(@Suspended final AsyncResponse asyncResponse) {
+                       ServletContext context = request.getSession().getServletContext();
 
-               asyncResponse.setTimeoutHandler(new TimeoutHandler() {
+                       PluginStatusBL pluginStatusBL = (PluginStatusBL) context.getAttribute(Constants.PLUGIN_BL_COMPONENT);
 
-                       @Override
-                       public void handleTimeout(AsyncResponse asyncResponse) {
-                               asyncResponse.resume(
-                                               Response.status(Response.Status.SERVICE_UNAVAILABLE).entity("Operation time out.").build());
-                       }
-               });
-               asyncResponse.setTimeout(3, TimeUnit.SECONDS);
+            String result = pluginStatusBL.checkPluginsListAvailability();
 
-               new Thread(new Runnable() {
-                       @Override
-                       public void run() {
-                               String result = veryExpensiveOperation();
-                               asyncResponse.resume(result);
-                       }
+                       Response response = Response.status(Status.OK).entity(result).build();
 
-                       private String veryExpensiveOperation() {
+                       logFeResponse(request, response);
 
-                               return "veryExpensiveOperation SUCCESS";
+                       return response;
+               } catch (Exception e) {
+                       FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Response");
+                       log.error("Unexpected FE response logging error :", e);
+                       return Response.status(Status.OK).entity(null).build();
+               }
 
-                       }
-               }).start();
        }
 
-       @GET
-       @Path("/ui/plugins")
-       @Produces(MediaType.APPLICATION_JSON)
-       public Response getPluginsConfiguration(@Context final HttpServletRequest request) {
-               String result = null;
-
-               ServletContext context = request.getSession().getServletContext();
-
-               PluginStatusBL pluginStatusBL = (PluginStatusBL) context.getAttribute(Constants.PLUGIN_BL_COMPONENT);
-
-               result = pluginStatusBL.checkPluginsListAvailability();
-
-               return Response.status(Status.OK).entity(result).build();
-
-       }       
+    protected  void inHttpRequest(HttpServletRequest httpRequest) {
+        log.info("{} {} {}", httpRequest.getMethod(), httpRequest.getRequestURI(), httpRequest.getProtocol());
+    }
+
+    /**
+     * Extracted for purpose of clear method name, for logback %M parameter
+     * @param response http response
+     */
+    protected void outHttpResponse(Response response) {
+        log.info("SC=\"{}\"", response.getStatus());
+    }
 }
index 511592a..a8aa206 100644 (file)
@@ -47,21 +47,6 @@ public class FeProxyServlet extends SSLProxyServlet {
        private static final Logger log = LoggerFactory.getLogger(FeProxyServlet.class.getName());
        private static Cache<String, MdcData> mdcDataCache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build();
 
-//     @Override
-//     public URI rewriteURI(HttpServletRequest request) {
-//             try {
-//                     logFeRequest(request);
-//             } catch (Exception e) {
-//                     FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Request");
-//                     log.error("Unexpected FE request logging error :", e);
-//             }
-//             String originalUrl = request.getRequestURL().toString();
-//             String redirectedUrl = getModifiedUrl(request);
-//
-//             log.debug("FeProxyServlet Redirecting request from: {} , to: {}", originalUrl, redirectedUrl);
-//
-//             return URI.create(redirectedUrl);
-//     }
 
        @Override
        protected String rewriteTarget(HttpServletRequest request) {
@@ -79,17 +64,6 @@ public class FeProxyServlet extends SSLProxyServlet {
                return redirectedUrl;
        }
 
-//     @Override
-//     protected void onResponseSuccess(HttpServletRequest request, HttpServletResponse response, Response proxyResponse) {
-//             try {
-//                     logFeResponse(request, proxyResponse);
-//             } catch (Exception e) {
-//                     FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Response");
-//                     log.error("Unexpected FE response logging error :", e);
-//             }
-//             super.onResponseSuccess(request, response, proxyResponse);
-//     }
-//protected void onProxyResponseSuccess(HttpServletRequest clientRequest, HttpServletResponse proxyResponse, Response serverResponse) {
        @Override
        protected void onProxyResponseSuccess(HttpServletRequest request, HttpServletResponse proxyResponse, Response response) {
                try {
@@ -209,31 +183,6 @@ public class FeProxyServlet extends SSLProxyServlet {
 
 
 
-//             String scheme = config.getBeProtocol();
-//             String uri = request.getRequestURI().toString();
-//             StringBuilder url = new StringBuilder();
-//             url.append(scheme).append("://").append(config.getBeHost());
-//             url.append(":");
-//             if (config.getBeProtocol().equals(BeProtocol.HTTP.getProtocolName())) {
-//                     url.append(config.getBeHttpPort());
-//             } else {
-//                     url.append(config.getBeSslPort());
-//             }
-//             url.append(uri);
-//             String queryString = request.getQueryString(); // d=789
-//             if (queryString != null) {
-//                     url.append("?").append(queryString);
-//             }
-//
-//             String redirectedUrl = url.toString();
-//             String onboardingForwardContext = config.getOnboardingForwardContext();
-//             if (onboardingForwardContext == null || onboardingForwardContext.isEmpty()) {
-//                     onboardingForwardContext = "/onboarding-api";
-//             }
-//             redirectedUrl = redirectedUrl.replace("/sdc1/feProxy/dcae-api", "/dcae");
-//             redirectedUrl = redirectedUrl.replace("/sdc1/feProxy/onboarding-api", onboardingForwardContext);
-//             redirectedUrl = redirectedUrl.replace("/sdc1/feProxy", "/sdc2");
-//             return redirectedUrl;
 
        }
 
diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/LoggingServlet.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/LoggingServlet.java
new file mode 100644 (file)
index 0000000..af07810
--- /dev/null
@@ -0,0 +1,102 @@
+package org.openecomp.sdc.fe.servlets;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.servlets.BasicServlet;
+import org.openecomp.sdc.fe.mdc.MdcData;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Response;
+import java.util.concurrent.TimeUnit;
+
+public abstract class LoggingServlet extends BasicServlet {
+
+    private static final Logger log = LoggerFactory.getLogger(BasicServlet.class.getName());
+    private static final Cache<String, MdcData> mdcDataCache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build();
+
+    /**
+     * log incoming requests
+     * @param httpRequest the http request
+     */
+    protected void logFeRequest(HttpServletRequest httpRequest) {
+
+        MDC.clear();
+
+        Long transactionStartTime = System.currentTimeMillis();
+        String uuid = httpRequest.getHeader(Constants.X_ECOMP_REQUEST_ID_HEADER);
+        String serviceInstanceID = httpRequest.getHeader(Constants.X_ECOMP_SERVICE_ID_HEADER);
+
+        if (uuid != null && uuid.length() > 0) {
+            String userId = httpRequest.getHeader(Constants.USER_ID_HEADER);
+
+            String remoteAddr = httpRequest.getRemoteAddr();
+            String localAddr = httpRequest.getLocalAddr();
+
+            mdcDataCache.put(uuid, new MdcData(serviceInstanceID, userId, remoteAddr, localAddr, transactionStartTime));
+
+            updateMdc(uuid, serviceInstanceID, userId, remoteAddr, localAddr, null);
+        }
+        inHttpRequest(httpRequest);
+    }
+
+    /**
+     * log response
+     * @param request orig request
+     * @param response returned response
+     */
+    protected void logFeResponse(HttpServletRequest request, Response response) {
+        String uuid = request.getHeader(Constants.X_ECOMP_REQUEST_ID_HEADER);
+        String transactionRoundTime = null;
+
+        if (uuid != null) {
+            MdcData mdcData = mdcDataCache.getIfPresent(uuid);
+            if (mdcData != null) {
+                Long transactionStartTime = mdcData.getTransactionStartTime();
+                if (transactionStartTime != null) {// should'n ever be null, but
+                    // just to be defensive
+                    transactionRoundTime = Long.toString(System.currentTimeMillis() - transactionStartTime);
+                }
+                updateMdc(uuid, mdcData.getServiceInstanceID(), mdcData.getUserId(), mdcData.getRemoteAddr(), mdcData.getLocalAddr(), transactionRoundTime);
+            }
+        }
+        outHttpResponse(response);
+
+        MDC.clear();
+    }
+
+    /**
+     * Extracted for purpose of clear method name, for logback %M parameter
+     * @param httpRequest http request
+     */
+    protected abstract void inHttpRequest(HttpServletRequest httpRequest) ;
+
+
+    /**
+     * Extracted for purpose of clear method name, for logback %M parameter
+     * @param response http response
+     */
+    protected abstract void outHttpResponse(Response response);
+
+    /**
+     * update mdc with values from the request
+     * @param uuid service uuid
+     * @param serviceInstanceID serviceInstanceID
+     * @param userId userId
+     * @param remoteAddr remoteAddr
+     * @param localAddr localAddr
+     * @param transactionStartTime transactionStartTime
+     */
+    private void updateMdc(String uuid, String serviceInstanceID, String userId, String remoteAddr, String localAddr, String transactionStartTime) {
+        MDC.put("uuid", uuid);
+        MDC.put("serviceInstanceID", serviceInstanceID);
+        MDC.put("userId", userId);
+        MDC.put("remoteAddr", remoteAddr);
+        MDC.put("localAddr", localAddr);
+        MDC.put("timer", transactionStartTime);
+    }
+}
index 816ebe3..48661a0 100644 (file)
 
 package org.openecomp.sdc.common.servlets;
 
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
+import org.openecomp.sdc.common.api.Constants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.concurrent.TimeUnit;
 
 public abstract class BasicServlet {
 
        protected Gson gson = new GsonBuilder().setPrettyPrinting().create();
 
+
+
 }
index 3dbf31b..fbf5621 100644 (file)
@@ -120,10 +120,20 @@ public class PluginsConfiguration extends BasicConfiguration {
             this.displayRoles = displayRoles;
         }
 
-
-
+        @Override
+        public String toString() {
+            return "PluginDisplayOptions[" +
+                    "displayName='" + displayName +
+                    ", displayContext=" + displayContext +
+                    ", displayRoles=" + displayRoles +
+                    ']';
+        }
     }
 
+    @Override
+    public String toString() {
+        return "PluginsConfiguration[" + "pluginsList=" + pluginsList + ", connectionTimeout=" + connectionTimeout +']';
+    }
 }