All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.taskurotta.service.metrics.MetricsFactory Maven / Gradle / Ivy

package ru.taskurotta.service.metrics;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.taskurotta.service.metrics.handler.DataListener;
import ru.taskurotta.service.metrics.handler.NumberDataListener;
import ru.taskurotta.util.Shutdown;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;

/**
 * Factory for producing Metric objects
 * User: dimadin
 * Date: 12.09.13 17:21
 */
public class MetricsFactory {

    private static final Logger logger = LoggerFactory.getLogger(MetricsFactory.class);

    private Map metricsCache = new ConcurrentHashMap<>();//stores created Metric instances

    private ScheduledExecutorService executorService;

    /**
     * Defines time resolution for metrics dataset in seonds
     */
    private int dumpPeriod;

    /**
     * Handler for dataset time resolution point (storing/aggregating)
     */
    private DataListener dataListener;

    private NumberDataListener numberDataListener;

    public MetricsFactory(int dumpPeriod, int dumpingThreads, DataListener dataListener, NumberDataListener numberDataListener) {
        this.executorService = Executors.newScheduledThreadPool(dumpingThreads, new ThreadFactory() {
            private int counter = 0;

            @Override
            public Thread newThread(Runnable r) {
                Thread thread = new Thread(r);
                thread.setDaemon(true);
                thread.setName("Metrics-job-" + counter++);
                return thread;
            }
        });

        Shutdown.addHook(executorService);

        this.dumpPeriod = dumpPeriod;
        this.dataListener = dataListener;
        this.numberDataListener = numberDataListener;
    }

    public Metric getInstance(String name, int dumpPeriodMs, DataListener dataListener) {

        Metric metric = metricsCache.get(name);
        if (metric == null) {
            synchronized (metricsCache) {
                metric = metricsCache.get(name);
                if (metric == null) {
                    metric = instantiate(name, dumpPeriodMs, dataListener);
                    metricsCache.put(name, metric);
                }
            }
        }

        return metric;
    }

    public Metric getInstance(String name) {
        return getInstance(name, dumpPeriod, dataListener);
    }

    public PeriodicMetric getPeriodicInstance(String name, int periodSeconds) {

        //number of points to cover 24 hours period.
        int dataPointsCount = TimeConstants.SECONDS_IN_24_HOURS / periodSeconds;

        return new PeriodicMetric(name, executorService, numberDataListener, periodSeconds, dataPointsCount);
    }

    private Metric instantiate(String name, int periodDelay, final DataListener dataListener) {
        final Metric result = new Metric(name);

        this.executorService.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                try {
                    result.dump(dataListener);
                } catch (Throwable e) {//must catch all of the exceptions : scheduled pool shuts quietly on exception
                    logger.error("Cannot dump metrics result", e);
                }
            }
        }, 0, periodDelay, TimeUnit.SECONDS);

        return result;
    }

    public void shutdown() {
        executorService.shutdown();
    }

    public DataListener getDataListener() {
        return dataListener;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy