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

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

package ru.taskurotta.service.metrics;

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

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * Metric for handling periodic data
 * Date: 26.12.13 16:23
 */
public class PeriodicMetric {

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

    private ScheduledExecutorService scheduledExecutorService;
    private int periodSeconds;
    private String metricName;
    private NumberDataListener numberDataListener;
    private int dataSize;

    public PeriodicMetric(String metricName, ScheduledExecutorService scheduledExecutorService, NumberDataListener numberDataListener, int periodSeconds, int dataSize) {
        this.metricName = metricName;
        this.scheduledExecutorService = scheduledExecutorService;
        this.numberDataListener = numberDataListener;
        this.periodSeconds = periodSeconds;
        this.dataSize = dataSize;
    }

    public static interface DatasetValueExtractor {

        /**
         * @return list of all datasets for this metric
         */
        public List getDatasets();

        /**
         * @return value of this metrics's dataset
         */
        public Number getDatasetValue(String dataset);

        /**
         * General value (for all datasets). Could be average value, sum, most possible, or whatever depending on metric
         */
        public Number getGeneralValue(Map datasetsValues);
    }

    public void periodicMark(final DatasetValueExtractor valueExtractor) {

        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                try {
                    List datasets = valueExtractor.getDatasets();
                    Map datasetsValues = null;
                    if (datasets!=null && !datasets.isEmpty()) {
                        datasetsValues = new HashMap<>();
                        for (String dataset : datasets) {
                            Number datasetValue = valueExtractor.getDatasetValue(dataset);
                            datasetsValues.put(dataset, datasetValue);
                            numberDataListener.handleNumberData(metricName, dataset, datasetValue,
                                    System.currentTimeMillis(), dataSize);
                        }
                    }
                    Number generalValue = valueExtractor.getGeneralValue(datasetsValues);
                    if (generalValue!=null) {
                        numberDataListener.handleNumberData(metricName, metricName, generalValue,
                                System.currentTimeMillis(), dataSize);
                    }
                    logger.debug("Flushed metrics data for datasets [{}]", datasets);

                } catch (Throwable e) {
                    logger.error("Periodic metric iteration failed", e);
                }
            }
        }, 0, periodSeconds, TimeUnit.SECONDS);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy