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

com.sleepycat.je.utilint.LatencyPercentileStat Maven / Gradle / Ivy

The newest version!
/*-
 * Copyright (C) 2002, 2017, Oracle and/or its affiliates. All rights reserved.
 *
 * This file was distributed by Oracle as part of a version of Oracle Berkeley
 * DB Java Edition made available at:
 *
 * http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
 *
 * Please see the LICENSE file included in the top-level directory of the
 * appropriate version of Oracle Berkeley DB Java Edition for a copy of the
 * license and additional information.
 */

package com.sleepycat.je.utilint;

import com.sleepycat.je.utilint.StatDefinition.StatType;

/**
 * An long JE stat that computes a percentile latency by tracking latency
 * values in milliseconds.  The percentile value represents the smallest
 * latency value for which no more than the specified percentage of the
 * observed values were strictly less than the value and at least the specified
 * percentage of the values were less than or equal to that value.  To save
 * space, specific values are recorded only below a specified value, so all
 * larger values are lumped together and reported as the maximum value.
 * Returns zero if no values are observed.
 */
public class LatencyPercentileStat extends StatWithValueType {

    /**
     * The default maximum value for tracking latency values.
     */
    public static final int DEFAULT_MAX_TRACKED_LATENCY_MILLIS = 1000;

    private static final long serialVersionUID = 1;

    private final LatencyPercentile latency;

    /**
     * Creates an instance of this class using the default maximum for tracking
     * latency values of {@value #DEFAULT_MAX_TRACKED_LATENCY_MILLIS}.  The
     * definition type must be INCREMENTAL.
     *
     * @param percentile the percentile latency to report as a ratio between
     * 0.0 and 1.0
     * @throws IllegalArgumentException if the stat definition type is not
     * INCREMENTAL, the percentile is less than 0.0 or greater than 1.0, or
     * maxTrackedLatencyMillis is less than 0
     */
    public LatencyPercentileStat(StatGroup group,
                                 StatDefinition definition,
                                 float percentile) {
        this(group, definition, percentile,
             DEFAULT_MAX_TRACKED_LATENCY_MILLIS);
    }

    /**
     * Creates an instance of this class.  The definition type must be
     * INCREMENTAL.
     *
     * @param percentile the percentile latency to report as a ratio between
     * 0.0 and 1.0
     * @param maxTrackedLatencyMillis the maximum for tracking latency values
     * @throws IllegalArgumentException if the stat definition type is not
     * INCREMENTAL, the percentile is less than 0.0 or greater than 1.0, or
     * maxTrackedLatencyMillis is less than 0
     */
    public LatencyPercentileStat(StatGroup group,
                                 StatDefinition definition,
                                 float percentile,
                                 int maxTrackedLatencyMillis) {
        super(group, definition);
        if (definition.getType() != StatType.INCREMENTAL) {
            throw new IllegalArgumentException(
                "The stat type must be INCREMENTAL, found: " +
                definition.getType());
        }
        latency = new LatencyPercentile(
            definition.getName(), percentile, maxTrackedLatencyMillis);
    }

    /** Constructor used for copying. */
    private LatencyPercentileStat(StatDefinition definition,
                                  LatencyPercentile latency) {
        super(definition);
        this.latency = latency.copy();
    }

    /**
     * Record a single operation that the specified amount of time in
     * milliseconds.
     */
    public void add(long latencyMillis) {
        latency.add(latencyMillis);
    }

    /* StatWithValueType methods */

    @Override
    public Class getValueType() {
        return Long.class;
    }

    /* Stat methods */

    /**
     * {@inheritDoc}
     *
     * @throws UnsupportedOperationException always
     */
    @Override
    public void set(Long newValue) {
        throw new UnsupportedOperationException();
    }

    /**
     * {@inheritDoc}
     *
     * @throws IllegalArgumentException if argument is not a
     * LatencyPercentileStat or if it has a different maximum latency
     */
    @Override
    public void add(Stat other) {
        if (!(other instanceof LatencyPercentileStat)) {
            throw new IllegalArgumentException(
                "Other stat must be a LatencyPercentileStat, found: " + other);
        }
        final LatencyPercentileStat otherPercentile =
            (LatencyPercentileStat) other;
        latency.add(otherPercentile.latency);
    }

    /**
     * {@inheritDoc}
     *
     * @throws IllegalArgumentException if argument is not a
     * LatencyPercentileStat or if it has a different maximum latency
     */
    @Override
    public LatencyPercentileStat computeInterval(Stat base) {
        if (!(base instanceof LatencyPercentileStat)) {
            throw new IllegalArgumentException(
                "Base stat must be a LatencyPercentileStat, found: " + base);
        }
        final LatencyPercentileStat baseStat = (LatencyPercentileStat) base;
        final LatencyPercentileStat result = copy();
        result.latency.updateInterval(baseStat.latency);
        return result;
    }

    @Override
    public void negate() {
        latency.negate();
    }

    /* BaseStat methods */

    @Override
    public Long get() {
        return latency.get();
    }

    @Override
    public void clear() {
        latency.clear();
    }

    @Override
    public LatencyPercentileStat copy() {
        return new LatencyPercentileStat(definition, latency);
    }

    @Override
    public String getFormattedValue() {
        return latency.getFormattedValue();
    }

    @Override
    public boolean isNotSet() {
        return latency.isNotSet();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy