blob: 95c0f526733abab617efb8ba429b246fe4784b82 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.internal.statistics.meters;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tag;
import org.apache.geode.Statistics;
/**
* Wraps a {@code Counter} to increment and read an associated stat as well as incrementing the
* counter.
*/
public class LegacyStatCounter implements Counter {
private final Counter underlyingCounter;
private final StatisticBinding statisticBinding;
/**
* Creates a {@code LegacyStatCounter} that wraps the given counter to add the ability
* to increment and read an associated stat.
*
* @param underlyingCounter the counter to wrap
* @param statisticBinding associates the {@code LegacyStatCounter} with a stat
*/
private LegacyStatCounter(Counter underlyingCounter,
StatisticBinding statisticBinding) {
this.underlyingCounter = underlyingCounter;
this.statisticBinding = statisticBinding;
}
/**
* Increments both the underlying counter and the associated stat by the given amount.
*/
@Override
public void increment(double amount) {
underlyingCounter.increment(amount);
statisticBinding.add(amount);
}
/**
* Returns the value of the associated stat.
*/
@Override
public double count() {
return statisticBinding.doubleValue();
}
/**
* Returns the ID of the underlying counter.
*/
@Override
public Id getId() {
return underlyingCounter.getId();
}
/**
* Returns a builder that can associate a stat with the eventual {@code LegacyStatCounter}. To
* associate the counter with a stat, call one of
* {@link Builder#doubleStatistic(Statistics, int)} or
* {@link Builder#longStatistic(Statistics, int)}.
*/
public static Builder builder(String name) {
return new Builder(name);
}
public static class Builder {
private final Counter.Builder builder;
private StatisticBinding statisticBinding = StatisticBinding.noOp();
private Builder(String name) {
builder = Counter.builder(name);
}
/**
* Prepares to associate the eventual {@code LegacyStatCounter} with the specified {@code
* double} stat. The given {@code Statistics} and {@code statId} must identify a {@code
* double} stat.
*/
public Builder doubleStatistic(Statistics statistics, int statId) {
statisticBinding = new DoubleStatisticBinding(statistics, statId);
return this;
}
/**
* Prepares to associate the eventual {@code LegacyStatCounter} with the specified {@code
* long} stat. The given {@code Statistics} and {@code statId} must identify a {@code long}
* stat.
*/
public Builder longStatistic(Statistics statistics, int statId) {
statisticBinding = new LongStatisticBinding(statistics, statId);
return this;
}
public Builder baseUnit(String unit) {
builder.baseUnit(unit);
return this;
}
public Builder description(String description) {
builder.description(description);
return this;
}
public Builder tag(String name, String value) {
builder.tag(name, value);
return this;
}
public Builder tags(String... tags) {
builder.tags(tags);
return this;
}
public Builder tags(Iterable<Tag> tags) {
builder.tags(tags);
return this;
}
/**
* Registers a {@code Counter} with the given registry, and returns a {@code LegacyStatCounter}
* that wraps the counter to increment and read the associated stat. Note that the returned
* {@code LegacyStatCounter} is not registered with the registry, but it has the same ID, so
* it can be used to remove the registered counter from the registry.
*/
public LegacyStatCounter register(MeterRegistry registry) {
Counter underlyingCounter = builder.register(registry);
return new LegacyStatCounter(underlyingCounter, statisticBinding);
}
}
}