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

com.yahoo.container.jdisc.state.MetricSet Maven / Gradle / Ivy

// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.container.jdisc.state;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.function.Function;
import java.util.logging.Logger;
import java.util.stream.Collectors;

/**
 * A set of metrics.
 *
 * @author Simon Thoresen Hult
 */
public final class MetricSet implements Iterable> {

    private final static Logger log = Logger.getLogger(MetricSet.class.getName());

    private final Map data;

    MetricSet() {
        data = new HashMap<>();
    }

    public MetricSet(Map data) {
        this.data = data;
    }

    /** Returns all metrics in this */
    @Override
    public Iterator> iterator() {
        return data.entrySet().iterator();
    }

    /** Returns a metric value */
    public MetricValue get(String key) {
        return data.get(key);
    }

    void add(String key, Number val) {
        add(key, CountMetric.newSingleValue(val));
    }

    void set(String key, Number val) {
        add(key, GaugeMetric.newSingleValue(val));
    }

    void add(MetricSet metricSet) {
        for (Map.Entry entry : metricSet) {
            add(entry.getKey(), entry.getValue());
        }
    }

    private void add(String key, MetricValue value) {
        MetricValue existingValue = data.get(key);

        if (existingValue == null) {
            data.put(key, value);
            return;
        }

        if ( ! existingValue.getClass().isAssignableFrom(value.getClass())) {
            log.info("Resetting metric '" + key + "' as it changed type. " +
                     "If you see this outside of deployment changes it means you incorrectly call both set() and add() " +
                     "on the same metric");
            data.put(key, value);
            return;
        }

        existingValue.add(value);
    }

    boolean isEmpty() { return data.isEmpty(); }

    /**
     * Create and return a MetricSet which carries over the last values
     * set for gauges in the this MetricSet. Aggregate metrics are currently
     * not carried over and will not be present in the returned set.
     */
    public MetricSet partialClone() {
        return new MetricSet(
                data.entrySet().stream()
                .filter(kv -> kv.getValue() instanceof GaugeMetric)
                .collect(Collectors.toMap(
                        kv -> kv.getKey(),
                        kv -> ((GaugeMetric)kv.getValue()).newWithPreservedLastValue())));
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy