blob: f5197dce1cea7b4fbfc687418e432ab030282a52 [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.iotdb.metrics.core;
import org.apache.iotdb.metrics.AbstractMetricManager;
import org.apache.iotdb.metrics.core.type.IoTDBAutoGauge;
import org.apache.iotdb.metrics.core.type.IoTDBCounter;
import org.apache.iotdb.metrics.core.type.IoTDBGauge;
import org.apache.iotdb.metrics.core.type.IoTDBHistogram;
import org.apache.iotdb.metrics.core.type.IoTDBRate;
import org.apache.iotdb.metrics.core.type.IoTDBTimer;
import org.apache.iotdb.metrics.type.AutoGauge;
import org.apache.iotdb.metrics.type.Counter;
import org.apache.iotdb.metrics.type.Gauge;
import org.apache.iotdb.metrics.type.Histogram;
import org.apache.iotdb.metrics.type.Rate;
import org.apache.iotdb.metrics.type.Timer;
import org.apache.iotdb.metrics.utils.MetricInfo;
import org.apache.iotdb.metrics.utils.MetricType;
import io.micrometer.core.instrument.Clock;
import io.micrometer.core.instrument.cumulative.CumulativeDistributionSummary;
import io.micrometer.core.instrument.cumulative.CumulativeTimer;
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
import io.micrometer.core.instrument.distribution.pause.NoPauseDetector;
import io.micrometer.core.instrument.distribution.pause.PauseDetector;
import io.micrometer.core.instrument.simple.SimpleConfig;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.function.ToDoubleFunction;
public class IoTDBMetricManager extends AbstractMetricManager {
/** The clock which is used in Metric system */
private final Clock clock = Clock.SYSTEM;
/** The histogram config which is used to create IoTDBTimer and IoTDBHistogram */
private final DistributionStatisticConfig IoTDBDistributionStatisticConfig;
private IoTDBMetricManager() {
SimpleConfig config = SimpleConfig.DEFAULT;
// set default distribution config
DistributionStatisticConfig defaultHistogramConfig =
DistributionStatisticConfig.builder()
.expiry(config.step())
.build()
.merge(DistributionStatisticConfig.DEFAULT);
// merge default config with IoTDB's config
DistributionStatisticConfig distributionStatisticConfig =
DistributionStatisticConfig.builder()
.percentiles(0.5, 0.99)
.bufferLength(2)
.build()
.merge(defaultHistogramConfig);
// set expiry and get final IoTDB's histogram config
this.IoTDBDistributionStatisticConfig =
distributionStatisticConfig.merge(
DistributionStatisticConfig.builder().expiry(config.step()).build());
}
@Override
public Counter createCounter() {
return new IoTDBCounter();
}
public <T> AutoGauge createAutoGauge(T obj, ToDoubleFunction<T> mapper) {
return new IoTDBAutoGauge<>(obj, mapper);
}
@Override
public Gauge createGauge() {
return new IoTDBGauge();
}
@Override
public Histogram createHistogram(MetricInfo metricInfo) {
// create distributionSummary
io.micrometer.core.instrument.DistributionSummary distributionSummary =
new CumulativeDistributionSummary(
null, clock, IoTDBDistributionStatisticConfig, 1.0, false);
return new IoTDBHistogram(distributionSummary);
}
@Override
public Rate createRate() {
return new IoTDBRate();
}
@Override
public Timer createTimer() {
// set pauseDetector
PauseDetector pauseDetector = new NoPauseDetector();
io.micrometer.core.instrument.Timer timer =
new CumulativeTimer(
null, clock, IoTDBDistributionStatisticConfig, pauseDetector, TimeUnit.SECONDS, false);
return new IoTDBTimer(timer);
}
@Override
protected void removeMetric(MetricType type, MetricInfo metricInfo) {
// empty body
}
@Override
public boolean stopFramework() {
return true;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
return super.equals(o);
}
@Override
public int hashCode() {
return Objects.hash(super.hashCode());
}
private static class IoTDBMetricManagerHolder {
private static final IoTDBMetricManager INSTANCE = new IoTDBMetricManager();
private IoTDBMetricManagerHolder() {
// empty constructor
}
}
public static IoTDBMetricManager getInstance() {
return IoTDBMetricManagerHolder.INSTANCE;
}
}