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

com.ringcentral.platform.metrics.micrometer.MfLongGauge Maven / Gradle / Ivy

There is a newer version: 4.0.0-RELEASE
Show newest version
package com.ringcentral.platform.metrics.micrometer;

import com.ringcentral.platform.metrics.MetricRegistry;
import com.ringcentral.platform.metrics.var.longVar.LongVar;
import io.micrometer.core.instrument.*;
import io.micrometer.core.instrument.util.MeterEquivalence;
import org.slf4j.Logger;

import java.lang.ref.WeakReference;
import java.util.function.*;

import static com.ringcentral.platform.metrics.var.Var.noTotal;
import static com.ringcentral.platform.metrics.var.longVar.configs.builders.LongVarConfigBuilder.withLongVar;
import static org.slf4j.LoggerFactory.getLogger;

public class MfLongGauge extends AbstractMeter implements MfMeter, Gauge {

    private final MfMeterBase base;
    private final Supplier valueSupplier;
    private final LongVar mfLongVar;
    private volatile long lastValue;

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

    public MfLongGauge(
        MetricRegistry mfRegistry,
        Id id,
        ToLongFunction fun,
        A funArg,
        boolean nonDecreasing) {

        super(id);

        this.base = new MfMeterBase(mfRegistry, id);
        WeakReference funArgWeakRef = new WeakReference<>(funArg);

        this.valueSupplier = () -> {
            A funArgRef = funArgWeakRef.get();

            if (funArgRef != null) {
                try {
                    return lastValue = fun.applyAsLong(funArgRef);
                } catch (Exception e) {
                    logger.error(
                        "Failed to apply the function for the gauge '{}'",
                        id.getName(), e);
                }
            }

            return lastValue;
        };

        this.mfLongVar = mfRegistry.longVar(
            this.base.name(),
            this.base.hasLabels() ? noTotal() : this.valueSupplier,
            () ->
                this.base.hasLabels() ?
                withLongVar().labels(this.base.labels()).nonDecreasing(nonDecreasing) :
                withLongVar().nonDecreasing(nonDecreasing));

        if (this.base.hasLabels()) {
            this.mfLongVar.register(this.valueSupplier, this.base.labelValues());
        }
    }

    @Override
    public double value() {
        return valueSupplier.get();
    }

    @Override
    @SuppressWarnings("EqualsWhichDoesntCheckParameterClass")
    public boolean equals(Object other) {
        return MeterEquivalence.equals(this, other);
    }

    @Override
    public int hashCode() {
        return MeterEquivalence.hashCode(this);
    }

    @Override
    public void meterRemoved() {
        if (base.hasLabels()) {
            mfLongVar.deregister(base.labelValues());
        } else {
            base.mfRegistry().remove(base.name());
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy