diff options
Diffstat (limited to 'app-c/appc/appc-metric/appc-metric-bundle/src/main/java/org/openecomp/appc/metricservice/policy/impl/ScheduledPublishingPolicyImpl.java')
-rw-r--r-- | app-c/appc/appc-metric/appc-metric-bundle/src/main/java/org/openecomp/appc/metricservice/policy/impl/ScheduledPublishingPolicyImpl.java | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/app-c/appc/appc-metric/appc-metric-bundle/src/main/java/org/openecomp/appc/metricservice/policy/impl/ScheduledPublishingPolicyImpl.java b/app-c/appc/appc-metric/appc-metric-bundle/src/main/java/org/openecomp/appc/metricservice/policy/impl/ScheduledPublishingPolicyImpl.java new file mode 100644 index 000000000..8c3dd49c3 --- /dev/null +++ b/app-c/appc/appc-metric/appc-metric-bundle/src/main/java/org/openecomp/appc/metricservice/policy/impl/ScheduledPublishingPolicyImpl.java @@ -0,0 +1,221 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : APP-C + * ================================================================================ + * Copyright (C) 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========================================================= + */ + +package org.openecomp.appc.metricservice.policy.impl; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Properties; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; + +import org.openecomp.appc.configuration.Configuration; +import org.openecomp.appc.configuration.ConfigurationFactory; +import org.openecomp.appc.exceptions.APPCException; +import org.openecomp.appc.metricservice.MetricRegistry; +import org.openecomp.appc.metricservice.MetricService; +import org.openecomp.appc.metricservice.Publisher; +import org.openecomp.appc.metricservice.metric.Metric; +import org.openecomp.appc.metricservice.policy.ScheduledPublishingPolicy; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + + +public class ScheduledPublishingPolicyImpl implements ScheduledPublishingPolicy { + private long startTime; + private long period; + private Publisher[] publishers; + private Metric[] metrics; + private MetricRegistry metricRegistry; + private static final EELFLogger logger = EELFManager.getInstance().getLogger(ScheduledPublishingPolicyImpl.class); + private ScheduledExecutorService scheduleExecutor; + private Configuration configuration; + + public ScheduledPublishingPolicyImpl(long startTime, long period, Publisher[] publishers, Metric[] metrics) { + this.startTime = startTime; + this.period = period; + this.publishers = publishers; + this.metrics = metrics; + this.scheduleExecutor= Executors.newSingleThreadScheduledExecutor(getThreadFactory(true)); + } + + public ScheduledPublishingPolicyImpl( Publisher[] publishers, Metric[] metrics) { + configuration = ConfigurationFactory.getConfiguration(); + Properties properties=configuration.getProperties(); + if(properties!=null){ + if(properties.getProperty("schedule.policy.metric.period")!=null && properties.getProperty("schedule.policy.metric.start.time")!=null){ + this.startTime = getConfigStartTime(properties); + this.period = getConfigPeriod(properties); + logger.info("Metric Properties read from configuration Start Time :"+this.startTime+", Period :"+this.period); + }else if(properties.getProperty("schedule.policy.metric.period")!=null){ + this.startTime=1; + this.period=getConfigPeriod(properties); + logger.info("Metric Properties read from configuration Start Time :"+this.startTime+", Period :"+this.period); + + }else if(properties.getProperty("schedule.policy.metric.period")==null && properties.getProperty("schedule.policy.metric.start.time")!=null){ + this.startTime=getConfigStartTime("00:00:00",properties); + this.period=(24*60*60*1000)-1; + logger.info("Metric Properties read from configuration Start Time :"+this.startTime+", Period :"+this.period); + + }else{ + logger.info("Metric Properties coming as null,setting to default Start Time :1 ms,Period : 100000 ms"); + this.startTime = 1; + this.period = 100000; + logger.info("Metric Properties read from configuration Start Time :"+this.startTime+", Period :"+this.period); + + } + } else { + logger.info("Metric Properties coming as null,setting to default Start Time :1 ms,Period : 100000 ms"); + this.startTime = 1; + this.period = 100000; + logger.info("Metric Properties read from configuration Start Time :"+this.startTime+", Period :"+this.period); + } + this.publishers = publishers; + this.metrics = metrics; + this.scheduleExecutor= Executors.newSingleThreadScheduledExecutor(getThreadFactory(true)); + } + + private long getConfigPeriod(Properties properties) { + String period=properties.getProperty("schedule.policy.metric.period"); + logger.info("Metric period : " +period); + long periodInMs=Integer.parseInt(period)*1000; + logger.info("Metric period in long : " +periodInMs); + return periodInMs; + } + + private long getTimeInMs(String time) { + String[] strings=time.split(":"); + if(strings.length==3) { + long hour = Integer.parseInt(strings[0]) * 60 * 60 * 1000; + long min = Integer.parseInt(strings[1]) * 60 * 1000; + long sec = Integer.parseInt(strings[2]) * 1000; + return hour+min+sec; + }else{ + return 0; + } + + } + + + + private long getConfigStartTime(Properties properties) { + String startTime=properties.getProperty("schedule.policy.metric.start.time"); + if(startTime!=null){ + long timeDiff=(getTimeInMs(startTime))-(getTimeInMs((new SimpleDateFormat("HH:mm:ss")).format(new Date()))); + long period=getConfigPeriod(properties); + if(timeDiff>=0){ + return timeDiff; + }else{ + return period-((timeDiff*-1)%period); + } + } + return 0; + } + + private long getConfigStartTime(String startTime,Properties properties) { + if(startTime!=null){ + long timeDiff=(getTimeInMs(startTime))-(getTimeInMs((new SimpleDateFormat("HH:mm:ss")).format(new Date()))); + long period=getConfigPeriod(properties); + if(timeDiff>=0){ + return timeDiff%period; + }else{ + return period-((timeDiff*-1)%period); + } + } + return 0; + } + @Override + public void onMetricChange(Metric metric) throws APPCException { + //TODO + } + + @Override + public Metric[] metrics() { + return metrics; + } + + @Override + public void init() { + Properties properties=configuration.getProperties(); + boolean isMetricEnabled=false; + if(properties!=null){ + String metricProperty=properties.getProperty("metric.enabled"); + if(metricProperty!=null){ + isMetricEnabled=Boolean.valueOf(metricProperty); + } + } + if(isMetricEnabled){ + logger.info("Metric Service is enabled, hence policies getting scheduled"); + for(final Publisher publisher:this.getPublishers()){ + scheduleExecutor.scheduleWithFixedDelay(new Runnable() + { + public void run() { + try { + publisher.publish(metricRegistry, metrics); + reset(); + } catch (RuntimeException ex) { + logger.error("RuntimeException thrown from {}#report. Exception was suppressed.", publisher.getClass().getSimpleName(), ex); + } + } + } + , startTime, period, TimeUnit.MILLISECONDS); + } + }else{ + logger.info("Metric Service is not enabled, hence policies not getting scheduled"); + + } + } + + @Override + public long getStartTime() { + return this.startTime; + } + + @Override + public long getPeriod() { + return this.period; + } + + @Override + public Publisher[] getPublishers() { + return this.publishers; + } + + @Override + public void reset() { + for(Metric metric:this.metrics){ + metric.reset();} + } + + + private ThreadFactory getThreadFactory(final boolean isDaemon){ + return new ThreadFactory() { + public Thread newThread(Runnable r) { + Thread t = Executors.defaultThreadFactory().newThread(r); + t.setDaemon(isDaemon); + return t; + } + }; + } + +} |