diff options
Diffstat (limited to 'src/main/java/com/att/mr')
3 files changed, 368 insertions, 0 deletions
diff --git a/src/main/java/com/att/mr/apiServer/metrics/cambria/DMaaPMetricsSender.java b/src/main/java/com/att/mr/apiServer/metrics/cambria/DMaaPMetricsSender.java new file mode 100644 index 0000000..08380fb --- /dev/null +++ b/src/main/java/com/att/mr/apiServer/metrics/cambria/DMaaPMetricsSender.java @@ -0,0 +1,197 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * org.onap.dmaap + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 +* + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * + *******************************************************************************/ +package com.att.mr.apiServer.metrics.cambria; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import org.json.JSONException; +import org.json.JSONObject; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; + +import com.att.dmf.mr.constants.CambriaConstants; +import com.att.dmf.mr.metrics.publisher.CambriaPublisher; +import com.att.dmf.mr.metrics.publisher.DMaaPCambriaClientFactory; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.att.nsa.apiServer.metrics.cambria.MetricsSender; +import com.att.nsa.metrics.CdmMetricsRegistry; +import com.att.nsa.metrics.impl.CdmConstant; + +/** + * MetricsSender will send the given metrics registry content as an event on the + * Cambria event broker to the given topic. + * + * @author peter + * + */ +public class DMaaPMetricsSender implements Runnable { + public static final String kSetting_CambriaEnabled = "metrics.send.cambria.enabled"; + public static final String kSetting_CambriaBaseUrl = "metrics.send.cambria.baseUrl"; + public static final String kSetting_CambriaTopic = "metrics.send.cambria.topic"; + public static final String kSetting_CambriaSendFreqSecs = "metrics.send.cambria.sendEverySeconds"; + + /** + * Schedule a periodic send of the given metrics registry using the given + * settings container for the Cambria location, topic, and send frequency. + * <br/> + * <br/> + * If the enabled flag is false, this method returns null. + * + * @param scheduler + * @param metrics + * @param settings + * @param defaultTopic + * @return a handle to the scheduled task + */ + public static ScheduledFuture<?> sendPeriodically(ScheduledExecutorService scheduler, CdmMetricsRegistry metrics, + String defaultTopic) { + log.info("Inside : DMaaPMetricsSender : sendPeriodically"); + String cambriaSetting= com.att.ajsc.filemonitor.AJSCPropertiesMap.getProperty(CambriaConstants.msgRtr_prop,kSetting_CambriaEnabled); + boolean setEnable=true; + if (cambriaSetting!=null && cambriaSetting.equals("false") ) + setEnable= false; + + if (setEnable) { + String Setting_CambriaBaseUrl=com.att.ajsc.filemonitor.AJSCPropertiesMap.getProperty(CambriaConstants.msgRtr_prop,kSetting_CambriaEnabled); + + Setting_CambriaBaseUrl=Setting_CambriaBaseUrl==null?"localhost":Setting_CambriaBaseUrl; + + String Setting_CambriaTopic=com.att.ajsc.filemonitor.AJSCPropertiesMap.getProperty(CambriaConstants.msgRtr_prop,kSetting_CambriaTopic); + if(Setting_CambriaTopic==null) Setting_CambriaTopic = "msgrtr.apinode.metrics.dmaap"; + + // Setting_CambriaBaseUrl=Setting_CambriaBaseUrl==null?defaultTopic:Setting_CambriaBaseUrl; + + String Setting_CambriaSendFreqSecs=com.att.ajsc.filemonitor.AJSCPropertiesMap.getProperty(CambriaConstants.msgRtr_prop,kSetting_CambriaSendFreqSecs); + + int _CambriaSendFreqSecs =30; + if(Setting_CambriaSendFreqSecs!=null){ + _CambriaSendFreqSecs = Integer.parseInt(Setting_CambriaSendFreqSecs); + } + + + return DMaaPMetricsSender.sendPeriodically(scheduler, metrics, + Setting_CambriaBaseUrl,Setting_CambriaTopic,_CambriaSendFreqSecs + ); + /*return DMaaPMetricsSender.sendPeriodically(scheduler, metrics, + settings.getString(kSetting_CambriaBaseUrl, "localhost"), + settings.getString(kSetting_CambriaTopic, defaultTopic), + settings.getInt(kSetting_CambriaSendFreqSecs, 30));*/ + } else { + return null; + } + } + + /** + * Schedule a periodic send of the metrics registry to the given Cambria + * broker and topic. + * + * @param scheduler + * @param metrics + * the registry to send + * @param cambriaBaseUrl + * the base URL for Cambria + * @param topic + * the topic to publish on + * @param everySeconds + * how frequently to publish + * @return a handle to the scheduled task + */ + public static ScheduledFuture<?> sendPeriodically(ScheduledExecutorService scheduler, CdmMetricsRegistry metrics, + String cambriaBaseUrl, String topic, int everySeconds) { + return scheduler.scheduleAtFixedRate(new DMaaPMetricsSender(metrics, cambriaBaseUrl, topic), everySeconds, + everySeconds, TimeUnit.SECONDS); + } + + /** + * Create a metrics sender. + * + * @param metrics + * @param cambriaBaseUrl + * @param topic + */ + public DMaaPMetricsSender(CdmMetricsRegistry metrics, String cambriaBaseUrl, String topic) { + try { + fMetrics = metrics; + fHostname = InetAddress.getLocalHost().getHostName(); + + // setup a "simple" publisher that will send metrics immediately + fCambria = DMaaPCambriaClientFactory.createSimplePublisher(cambriaBaseUrl, topic); + } catch (UnknownHostException e) { + log.warn("Unable to get localhost address in MetricsSender constructor.", e); + throw new RuntimeException(e); + } + } + + /** + * Send on demand. + */ + public void send() { + try { + final JSONObject o = fMetrics.toJson(); + o.put("hostname", fHostname); + o.put("now", System.currentTimeMillis()); + o.put("metricsSendTime", addTimeStamp()); + o.put("transactionEnabled", false); + fCambria.send(fHostname, o.toString()); + } catch (JSONException e) { + log.warn("Error posting metrics to Cambria: " + e.getMessage()); + } catch (IOException e) { + log.warn("Error posting metrics to Cambria: " + e.getMessage()); + } + } + + /** + * Run() calls send(). It's meant for use in a background-scheduled task. + */ + @Override + public void run() { + send(); + } + + private final CdmMetricsRegistry fMetrics; + private final CambriaPublisher fCambria; + private final String fHostname; + + //private static final Logger log = LoggerFactory.getLogger(MetricsSender.class); + + private static final EELFLogger log = EELFManager.getInstance().getLogger(MetricsSender.class); + /** + * method creates and returnd CdmConstant object using current timestamp + * + * @return + */ + public CdmConstant addTimeStamp() { + // Add the timestamp with every metrics send + final long metricsSendTime = System.currentTimeMillis(); + final Date d = new Date(metricsSendTime); + final String text = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz").format(d); + return new CdmConstant(metricsSendTime / 1000, "Metrics Send Time (epoch); " + text); + } +} diff --git a/src/main/java/com/att/mr/filter/ContentLengthFilter.java b/src/main/java/com/att/mr/filter/ContentLengthFilter.java new file mode 100644 index 0000000..b99f9e6 --- /dev/null +++ b/src/main/java/com/att/mr/filter/ContentLengthFilter.java @@ -0,0 +1,134 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * org.onap.dmaap + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 +* + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * + *******************************************************************************/ +package com.att.mr.filter; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +import org.apache.http.HttpStatus; +import org.json.JSONObject; +import org.springframework.context.ApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +import com.att.dmf.mr.CambriaApiException; +import com.att.dmf.mr.exception.DMaaPErrorMessages; +import com.att.dmf.mr.exception.DMaaPResponseCode; +import com.att.dmf.mr.exception.ErrorResponse; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + +/** + * Servlet Filter implementation class ContentLengthFilter + */ +public class ContentLengthFilter implements Filter { + + private DefaultLength defaultLength; + + private FilterConfig filterConfig = null; + DMaaPErrorMessages errorMessages = null; + //private Logger log = Logger.getLogger(ContentLengthFilter.class.toString()); + private static final EELFLogger log = EELFManager.getInstance().getLogger(ContentLengthFilter.class); + /** + * Default constructor. + */ + + public ContentLengthFilter() { + // TODO Auto-generated constructor stub + } + + /** + * @see Filter#destroy() + */ + public void destroy() { + // TODO Auto-generated method stub + } + + /** + * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) + */ + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, + ServletException { + // TODO Auto-generated method stub + // place your code here + log.info("inside servlet do filter content length checking before pub/sub"); + HttpServletRequest request = (HttpServletRequest) req; + JSONObject jsonObj = null; + int requestLength = 0; + try { + // retrieving content length from message header + + if (null != request.getHeader("Content-Length")) { + requestLength = Integer.parseInt(request.getHeader("Content-Length")); + } + // retrieving encoding from message header + String transferEncoding = request.getHeader("Transfer-Encoding"); + // checking for no encoding, chunked and requestLength greater then + // default length + if (null != transferEncoding && !(transferEncoding.contains("chunked")) + && (requestLength > Integer.parseInt(defaultLength.getDefaultLength()))) { + jsonObj = new JSONObject().append("defaultlength", defaultLength) + .append("requestlength", requestLength); + log.error("message length is greater than default"); + throw new CambriaApiException(jsonObj); + } else if (null == transferEncoding && (requestLength > Integer.parseInt(defaultLength.getDefaultLength()))) { + jsonObj = new JSONObject().append("defaultlength", defaultLength.getDefaultLength()).append( + "requestlength", requestLength); + log.error("Request message is not chunked or request length is greater than default length"); + throw new CambriaApiException(jsonObj); + } else { + chain.doFilter(req, res); + } + } catch (CambriaApiException | NumberFormatException e) { + log.error("message size is greater then default"); + ErrorResponse errRes = new ErrorResponse(HttpStatus.SC_EXPECTATION_FAILED, + DMaaPResponseCode.MSG_SIZE_EXCEEDS_MSG_LIMIT.getResponseCode(), errorMessages.getMsgSizeExceeds() + + jsonObj.toString()); + log.info(errRes.toString()); + // throw new CambriaApiException(errRes); + } + + } + + /** + * @see Filter#init(FilterConfig) + */ + public void init(FilterConfig fConfig) throws ServletException { + // TODO Auto-generated method stub + this.filterConfig = fConfig; + log.info("Filter Content Length Initialize"); + ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(fConfig + .getServletContext()); + DefaultLength defLength = (DefaultLength) ctx.getBean("defLength"); + DMaaPErrorMessages errorMessages = (DMaaPErrorMessages) ctx.getBean("DMaaPErrorMessages"); + this.errorMessages = errorMessages; + this.defaultLength = defLength; + + } + +} diff --git a/src/main/java/com/att/mr/filter/DefaultLength.java b/src/main/java/com/att/mr/filter/DefaultLength.java new file mode 100644 index 0000000..43169e5 --- /dev/null +++ b/src/main/java/com/att/mr/filter/DefaultLength.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * ============LICENSE_START======================================================= + * org.onap.dmaap + * ================================================================================ + * Copyright © 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 +* + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + * ECOMP is a trademark and service mark of AT&T Intellectual Property. + * + *******************************************************************************/ +package com.att.mr.filter; + + +public class DefaultLength { + + String defaultLength; + + public String getDefaultLength() { + return defaultLength; + } + + public void setDefaultLength(String defaultLength) { + this.defaultLength = defaultLength; + } + +} |