diff options
author | Stone, Avi (as206k) <as206k@att.com> | 2018-04-12 16:36:39 +0300 |
---|---|---|
committer | Stone, Avi (as206k) <as206k@att.com> | 2018-04-12 16:36:39 +0300 |
commit | 9b2ceb347a3371819fcad6bbe2268203afecaf4e (patch) | |
tree | fbb5ea2c147d71dfeeec0882b215423e7b7206b4 /src/main/java/org/onap/sdc/dcae/controller | |
parent | 72dc8e3298d3e4315cdd9717b778671cb0b625bc (diff) |
DCAE-D fe initial commit
DCAE-D fe initial commit
Change-Id: Ica8ccb7c7ef769c969664d1e168d205eb9fc67f2
Issue-ID: SDC-1218
Signed-off-by: Stone, Avi (as206k) <as206k@att.com>
Diffstat (limited to 'src/main/java/org/onap/sdc/dcae/controller')
-rw-r--r-- | src/main/java/org/onap/sdc/dcae/controller/health/HealthController.java | 72 | ||||
-rw-r--r-- | src/main/java/org/onap/sdc/dcae/controller/proxy/DcaeProxy.java | 152 |
2 files changed, 224 insertions, 0 deletions
diff --git a/src/main/java/org/onap/sdc/dcae/controller/health/HealthController.java b/src/main/java/org/onap/sdc/dcae/controller/health/HealthController.java new file mode 100644 index 0000000..1ddec2d --- /dev/null +++ b/src/main/java/org/onap/sdc/dcae/controller/health/HealthController.java @@ -0,0 +1,72 @@ +package org.onap.sdc.dcae.controller.health; + +import java.util.ArrayList; +import java.util.List; + +import org.onap.sdc.dcae.FeApp; +import org.onap.sdc.dcae.composition.restmodels.health.ComponentsInfo; +import org.onap.sdc.dcae.composition.restmodels.health.HealthResponse; +import org.onap.sdc.dcae.composition.util.DcaeFeConstants; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import com.google.gson.Gson; + + +/** + * + * @author lezer + * Example: + * { + "healthCheckComponent": "DCAE Designer", + "healthCheckStatus": "UP", + "description": "OK", + "componentsInfo": [{ + "healthCheckComponent": "FE", + "healthCheckStatus": "UP", + "description": "OK" + }] +} + * + */ +@RestController +@EnableAutoConfiguration +@CrossOrigin +public class HealthController { + Gson gson = new Gson(); + + @RequestMapping(value = "/healthCheck", method = RequestMethod.GET) + public ResponseEntity<String> healthCheck() { + try{ + HealthResponse healthResponse = new HealthResponse(); + healthResponse.setHealthCheckComponent(DcaeFeConstants.Health.APP_NAME); + healthResponse.setHealthCheckStatus(DcaeFeConstants.Health.UP); + healthResponse.setSdcVersion(FeApp.getDcaeVersion()); + healthResponse.setDescription(DcaeFeConstants.Health.OK); + + List<ComponentsInfo> componentsInfoList = new ArrayList<ComponentsInfo>(); + ComponentsInfo componentsInfo = new ComponentsInfo(); + componentsInfo.setHealthCheckComponent(DcaeFeConstants.Health.FE); + componentsInfo.setHealthCheckStatus(DcaeFeConstants.Health.UP); + componentsInfo.setVersion(FeApp.getDcaeVersion()); + componentsInfo.setDescription(DcaeFeConstants.Health.OK); + componentsInfoList.add(componentsInfo); + + healthResponse.setComponentsInfo(componentsInfoList); + String json = gson.toJson(healthResponse, HealthResponse.class); + System.out.println("Health Check response: "+json); + + return new ResponseEntity<String>(json, HttpStatus.OK); + } + catch(Exception e){ + System.err.println("Error occured while performing HealthCheck: "+e.getLocalizedMessage()); + return new ResponseEntity<String>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR); + } + } + +} diff --git a/src/main/java/org/onap/sdc/dcae/controller/proxy/DcaeProxy.java b/src/main/java/org/onap/sdc/dcae/controller/proxy/DcaeProxy.java new file mode 100644 index 0000000..94279f2 --- /dev/null +++ b/src/main/java/org/onap/sdc/dcae/controller/proxy/DcaeProxy.java @@ -0,0 +1,152 @@ +package org.onap.sdc.dcae.controller.proxy; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import org.eclipse.jetty.client.HttpClient; +import org.eclipse.jetty.client.api.Response; +import org.eclipse.jetty.proxy.ProxyServlet; +import org.eclipse.jetty.util.ssl.SslContextFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.util.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.concurrent.TimeUnit; + + +public class DcaeProxy extends ProxyServlet { + + private static Logger log = LoggerFactory.getLogger(DcaeProxy.class); + private static Cache<String, MdcData> mdcDataCache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build(); + + + //TODO proper configuration class + private String beHostUrl; + + public DcaeProxy(String beHostUrl){ + this.beHostUrl = beHostUrl; + } + + @Override + protected HttpClient newHttpClient() { + SslContextFactory factory = new SslContextFactory(true); + return new HttpClient(factory); + } + + @Override + protected String rewriteTarget(HttpServletRequest request) { + try{ + logRequest(request); + }catch (Exception e){ + log.error("Unexpected FE request logging error :", e); + } + String uri = request.getRequestURI(); + uri = uri.replace("/dcaeProxy", ""); + String query = request.getQueryString(); + StringBuilder url = new StringBuilder(); + url.append(beHostUrl).append(uri); + if(null != query) + url.append("?").append(query); + String urlString = url.toString(); + log.info("Proxy outgoing request={}", urlString); + return urlString; + } + + @Override + protected void onProxyResponseSuccess(HttpServletRequest clientRequest, HttpServletResponse proxyResponse, Response serverResponse) { + try{ + logResponse(clientRequest, serverResponse); + }catch (Exception e){ + log.error("Unexpected FE response logging error :", e); + } + super.onProxyResponseSuccess(clientRequest, proxyResponse, serverResponse); + } + + + private void logRequest(HttpServletRequest httpRequest) { + MDC.clear(); + Long transactionStartTime = System.currentTimeMillis(); + String requestId = httpRequest.getHeader("X-ECOMP-RequestID"); + String serviceInstanceID = httpRequest.getHeader("X-ECOMP-ServiceID"); + if (!StringUtils.isEmpty(requestId)) { + String userId = httpRequest.getHeader("USER_ID"); + String remoteAddr = httpRequest.getRemoteAddr(); + String localAddr = httpRequest.getLocalAddr(); + mdcDataCache.put(requestId, new MdcData(serviceInstanceID, userId, remoteAddr, localAddr, transactionStartTime)); + updateMdc(requestId, serviceInstanceID, userId, remoteAddr, localAddr, null); + } + inHttpRequest(httpRequest); + } + + private void logResponse(HttpServletRequest request, Response proxyResponse) { + String requestId = request.getHeader("X-ECOMP-RequestID"); + if (requestId != null) { + MdcData mdcData = mdcDataCache.getIfPresent(requestId); + if (mdcData != null) { + Long transactionStartTime = mdcData.getTransactionStartTime(); + String transactionRoundTime = Long.toString(System.currentTimeMillis() - transactionStartTime); + updateMdc(requestId, mdcData.getServiceInstanceID(), mdcData.getUserId(), mdcData.getRemoteAddr(), mdcData.getLocalAddr(), transactionRoundTime); + } + } + outHttpResponse(proxyResponse); + MDC.clear(); + } + + private class MdcData { + private String serviceInstanceID; + private String userId; + private String remoteAddr; + private String localAddr; + private Long transactionStartTime; + + MdcData(String serviceInstanceID, String userId, String remoteAddr, String localAddr, Long transactionStartTime) { + this.serviceInstanceID = serviceInstanceID; + this.userId = userId; + this.remoteAddr = remoteAddr; + this.localAddr = localAddr; + this.transactionStartTime = transactionStartTime; + } + + Long getTransactionStartTime() { + return transactionStartTime; + } + + public String getUserId() { + return userId; + } + + String getRemoteAddr() { + return remoteAddr; + } + + String getLocalAddr() { + return localAddr; + } + + String getServiceInstanceID() { + return serviceInstanceID; + } + } + + 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); + } + + // Extracted for purpose of clear method name, for logback %M parameter + private void inHttpRequest(HttpServletRequest httpRequest) { + log.info("{} {} {}", httpRequest.getMethod(), httpRequest.getRequestURI(), httpRequest.getProtocol()); + } + + // Extracted for purpose of clear method name, for logback %M parameter + private void outHttpResponse(Response proxyResponse) { + log.info("SC=\"{}\"", proxyResponse.getStatus()); + } + +} |