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

ru.taskurotta.service.metrics.handler.MetricsDataHandler Maven / Gradle / Ivy

package ru.taskurotta.service.metrics.handler;

import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.taskurotta.service.console.retriever.metrics.MetricsMethodDataRetriever;
import ru.taskurotta.service.metrics.MetricsDataUtils;
import ru.taskurotta.service.metrics.TimeConstants;
import ru.taskurotta.service.metrics.model.DataPointVO;
import ru.taskurotta.service.metrics.model.DataRowVO;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Holds metrics data collected via backend services methods invocations. Stores and exposes data.
 * Date: 19.09.13 10:30
 */
public class MetricsDataHandler implements DataListener, MetricsMethodDataRetriever, TimeConstants {
    private static MetricsDataHandler singleton;

    private static final Logger logger = LoggerFactory.getLogger(MetricsDataHandler.class);
    private Map lastHourDataHolder = new ConcurrentHashMap<>();
    private Map lastDayDataHolder = new ConcurrentHashMap<>();

    public static MetricsDataHandler getInstance() {
        return singleton;
    }

    @PostConstruct
    public void init() {
        singleton = this;
    }

    @Override
    //triggers approximately once per second
    public void handle(String metricName, String datasetName, long count, double mean, long measurementTime) {
        String holderKey = MetricsDataUtils.getKey(metricName, datasetName);

        DataRowVO dataRow = lastHourDataHolder.get(holderKey);
        if (dataRow == null) {
            synchronized (lastHourDataHolder) {
                dataRow = lastHourDataHolder.get(holderKey);
                if (dataRow == null) {
                    dataRow = new DataRowVO(SECONDS_IN_HOUR, metricName, datasetName);
                    lastHourDataHolder.put(holderKey, dataRow);
                }
            }
        }

        int position = dataRow.populate(count, mean, measurementTime);
        if (position != 0 && position % SECONDS_IN_MINUTE == 0) {//new minute started
            handleMinute(metricName, datasetName, dataRow.getTotalCount(position - SECONDS_IN_MINUTE, position), dataRow.getAverageMean(), measurementTime);
        }
        logger.trace("Handled data for second [{}], metric[{}], dataset[{}], count[{}], mean[{}], measurementTime[{}]", position, metricName, datasetName, count, mean, measurementTime);
    }

    public void handleMinute(String metricName, String datasetName, long count, double mean, long measurementTime) {
        String holderKey = MetricsDataUtils.getKey(metricName, datasetName);

        DataRowVO dataRow = lastDayDataHolder.get(holderKey);
        if (dataRow == null) {
            synchronized (lastDayDataHolder) {
                dataRow = lastDayDataHolder.get(holderKey);
                if (dataRow == null) {
                    dataRow = new DataRowVO(MINUTES_IN_24_HOURS, metricName, datasetName);
                    lastDayDataHolder.put(holderKey, dataRow);
                }
            }
        }

        int position = dataRow.populate(count, mean, measurementTime);
        logger.trace("Handled data for minute [{}], metric[{}], dataset[{}], count[{}], mean[{}], measurementTime[{}]", position, metricName, datasetName, count, mean, measurementTime);
    }

    @Override
    public Collection getMetricNames() {
        Collection result = null;
        Collection uniqueMetrics = Collections2.filter(lastHourDataHolder.values(), new Predicate() {
            @Override
            public boolean apply(DataRowVO input) {
                return input.getMetricsName() != null && input.getMetricsName().equals(input.getDataSetName());
            }
        });
        if (uniqueMetrics != null && !uniqueMetrics.isEmpty()) {
            result = new ArrayList<>();
            for (DataRowVO dr : uniqueMetrics) {
                result.add(dr.getMetricsName());
            }
        }
        return result;
    }

    @Override
    public Collection getDataSetsNames(final String metricName) {
        Collection result = null;
        Collection uniqueMetrics = Collections2.filter(lastHourDataHolder.values(), new Predicate() {
            @Override
            public boolean apply(DataRowVO input) {
                return metricName.equals(input.getMetricsName());
            }
        });
        if (uniqueMetrics != null && !uniqueMetrics.isEmpty()) {
            result = new ArrayList<>();
            for (DataRowVO dr : uniqueMetrics) {
                result.add(dr.getDataSetName());
            }
        }
        return result;
    }

    @Override
    public DataPointVO[] getCountsForLastHour(String metricName, String datasetName) {
        DataPointVO[] result = null;
        DataRowVO row = lastHourDataHolder.get(MetricsDataUtils.getKey(metricName, datasetName));
        if (row != null) {
            int size = row.getDsCounts().length();
            result = new DataPointVO[size];
            for (int i = 0; i < size; i++) {
                result[i] = row.getDsCounts().get(i);
            }
        }
        logger.debug("getCountsForLastHour({}, {}) is [{}]", metricName, datasetName, result);
        return result;
    }

    @Override
    public DataPointVO[] getCountsForLastDay(String metricName, String datasetName) {
        DataPointVO[] result = null;
        DataRowVO row = lastDayDataHolder.get(MetricsDataUtils.getKey(metricName, datasetName));
        if (row != null) {
            int size = row.getDsCounts().length();
            result = new DataPointVO[size];
            for (int i = 0; i < size; i++) {
                result[i] = row.getDsCounts().get(i);
            }
        }
        return result;
    }

    @Override
    public DataPointVO[] getMeansForLastHour(String metricName, String datasetName) {
        DataPointVO[] result = null;
        DataRowVO row = lastHourDataHolder.get(MetricsDataUtils.getKey(metricName, datasetName));
        if (row != null) {
            int size = row.getDsMean().length();
            result = new DataPointVO[size];
            for (int i = 0; i < size; i++) {
                result[i] = row.getDsMean().get(i);
            }
        }
        return result;
    }

    @Override
    public DataPointVO[] getMeansForLastDay(String metricName, String datasetName) {
        DataPointVO[] result = null;
        DataRowVO row = lastDayDataHolder.get(MetricsDataUtils.getKey(metricName, datasetName));
        if (row != null) {
            int size = row.getDsMean().length();
            result = new DataPointVO[size];
            for (int i = 0; i < size; i++) {
                result[i] = row.getDsMean().get(i);
            }
        }
        return result;
    }

    @Override
    public Date getLastActivityTime(String metricName, String datasetName) {
        Date result = null;
        String key = MetricsDataUtils.getKey(metricName, datasetName);
        DataRowVO row = lastHourDataHolder.get(key);

        if (row == null) {
            row = lastDayDataHolder.get(MetricsDataUtils.getKey(metricName, datasetName));
        }

        if (row != null) {
            long latestActivity = row.getLatestActivity();
            if (latestActivity > 0) {
                result = new Date(latestActivity);
            }
        }

        return result;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy