blob: a7db0093f52c56ae47081841b53cf70f1a05b43c [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.db.metric;
import org.apache.iotdb.metrics.AbstractMetricService;
import org.apache.iotdb.metrics.DoNothingMetricService;
import org.apache.iotdb.metrics.config.MetricConfig;
import org.apache.iotdb.metrics.config.MetricConfigDescriptor;
import org.apache.iotdb.metrics.impl.DoNothingMetricManager;
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.MetricLevel;
import org.apache.iotdb.metrics.utils.MetricType;
import org.apache.iotdb.metrics.utils.MonitorType;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
public class MetricServiceTest {
private static final MetricConfig metricConfig =
MetricConfigDescriptor.getInstance().getMetricConfig();
private static AbstractMetricService metricService = new DoNothingMetricService();
@Test
public void testMetricService() {
for (MonitorType type : MonitorType.values()) {
// init metric service
metricConfig.setEnableMetric(true);
metricConfig.setMonitorType(type);
metricConfig.setMetricLevel(MetricLevel.IMPORTANT);
metricService = new DoNothingMetricService();
metricService.startService();
// test metric service
assertTrue(metricService.isEnable());
assertTrue(metricService.getMetricManager().isEnableMetric());
assertTrue(metricService.getMetricManager().isEnableMetricInGivenLevel(MetricLevel.CORE));
assertTrue(
metricService.getMetricManager().isEnableMetricInGivenLevel(MetricLevel.IMPORTANT));
assertFalse(metricService.getMetricManager().isEnableMetricInGivenLevel(MetricLevel.NORMAL));
assertFalse(metricService.getMetricManager().isEnableMetricInGivenLevel(MetricLevel.ALL));
testNormalSituation();
testOtherSituation();
// stop metric module
metricService.stopService();
}
}
private void testNormalSituation() {
// test counter
Counter counter1 =
metricService.getOrCreateCounter("counter1", MetricLevel.IMPORTANT, "tag", "value");
assertNotNull(counter1);
metricService.count(10, "counter1", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(10, counter1.count());
metricService.count(20, "counter1", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(30, counter1.count());
Counter counter2 =
metricService.getOrCreateCounter("counter1", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(counter1, counter2);
counter2 = metricService.getOrCreateCounter("counter2", MetricLevel.IMPORTANT);
assertNotEquals(counter1, counter2);
counter2 = metricService.getOrCreateCounter("counter3", MetricLevel.IMPORTANT, "tag", "value");
assertNotEquals(counter1, counter2);
counter2 =
metricService.getOrCreateCounter(
"counter4", MetricLevel.IMPORTANT, "tag", "value", "tag2", "value");
assertNotEquals(counter1, counter2);
counter2 = metricService.getOrCreateCounter("counter5", MetricLevel.NORMAL, "tag", "value");
assertEquals(DoNothingMetricManager.doNothingCounter, counter2);
assertEquals(4, metricService.getAllCounters().size());
metricService.count(10, "counter6", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(5, metricService.getAllCounters().size());
metricService.remove(MetricType.COUNTER, "counter6");
assertEquals(5, metricService.getAllCounters().size());
metricService.remove(MetricType.COUNTER, "counter6", "tag", "value");
assertEquals(4, metricService.getAllCounters().size());
assertEquals(4, metricService.getAllMetricKeys().size());
// test gauge
Gauge gauge1 = metricService.getOrCreateGauge("gauge1", MetricLevel.IMPORTANT, "tag", "value");
assertNotNull(gauge1);
metricService.gauge(10, "gauge1", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(10, gauge1.value());
Gauge gauge2 = metricService.getOrCreateGauge("gauge1", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(gauge1, gauge2);
gauge2 = metricService.getOrCreateGauge("gauge2", MetricLevel.IMPORTANT);
assertNotEquals(gauge1, gauge2);
gauge2 = metricService.getOrCreateGauge("gauge3", MetricLevel.IMPORTANT, "tag", "value");
assertNotEquals(gauge1, gauge2);
gauge2 =
metricService.getOrCreateGauge(
"gauge4", MetricLevel.IMPORTANT, "tag", "value", "tag2", "value");
assertNotEquals(gauge1, gauge2);
gauge2 = metricService.getOrCreateGauge("gauge5", MetricLevel.NORMAL, "tag", "value");
assertEquals(DoNothingMetricManager.doNothingGauge, gauge2);
assertEquals(4, metricService.getAllGauges().size());
metricService.gauge(10, "gauge6", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(5, metricService.getAllGauges().size());
metricService.remove(MetricType.GAUGE, "gauge6");
assertEquals(5, metricService.getAllGauges().size());
metricService.remove(MetricType.GAUGE, "gauge6", "tag", "value");
assertEquals(4, metricService.getAllGauges().size());
assertEquals(8, metricService.getAllMetricKeys().size());
// test auto gauge
List<Integer> list = new ArrayList<>();
Gauge autoGauge =
metricService.getOrCreateAutoGauge(
"autoGauge", MetricLevel.IMPORTANT, list, List::size, "tag", "value");
assertEquals(0L, autoGauge.value());
list.add(1);
assertEquals(1L, autoGauge.value());
list.clear();
assertEquals(0L, autoGauge.value());
list.add(1);
assertEquals(1L, autoGauge.value());
list = null;
System.gc();
assertEquals(0L, autoGauge.value());
assertEquals(5, metricService.getAllGauges().size());
metricService.remove(MetricType.GAUGE, "autoGauge", "tag", "value");
assertEquals(4, metricService.getAllGauges().size());
assertEquals(8, metricService.getAllMetricKeys().size());
// test rate
Rate rate1 = metricService.getOrCreateRate("rate1", MetricLevel.IMPORTANT, "tag", "value");
assertNotNull(rate1);
metricService.rate(10, "rate1", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(10, rate1.getCount());
metricService.rate(20, "rate1", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(30, rate1.getCount());
Rate rate2 = metricService.getOrCreateRate("rate1", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(rate1, rate2);
rate2 = metricService.getOrCreateRate("rate2", MetricLevel.IMPORTANT);
assertNotEquals(rate1, rate2);
rate2 = metricService.getOrCreateRate("rate3", MetricLevel.IMPORTANT, "tag", "value");
assertNotEquals(rate1, rate2);
rate2 =
metricService.getOrCreateRate(
"rate4", MetricLevel.IMPORTANT, "tag", "value", "tag2", "value");
assertNotEquals(rate1, rate2);
rate2 = metricService.getOrCreateRate("rate5", MetricLevel.NORMAL, "tag", "value");
assertEquals(4, metricService.getAllRates().size());
assertEquals(DoNothingMetricManager.doNothingRate, rate2);
metricService.rate(10, "rate6", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(5, metricService.getAllRates().size());
metricService.remove(MetricType.RATE, "rate6");
assertEquals(5, metricService.getAllRates().size());
metricService.remove(MetricType.RATE, "rate6", "tag", "value");
assertEquals(4, metricService.getAllRates().size());
assertEquals(12, metricService.getAllMetricKeys().size());
// test histogram
Histogram histogram1 =
metricService.getOrCreateHistogram("histogram1", MetricLevel.IMPORTANT, "tag", "value");
assertNotNull(histogram1);
metricService.histogram(10, "histogram1", MetricLevel.IMPORTANT, "tag", "value");
metricService.histogram(20, "histogram1", MetricLevel.IMPORTANT, "tag", "value");
metricService.histogram(30, "histogram1", MetricLevel.IMPORTANT, "tag", "value");
metricService.histogram(40, "histogram1", MetricLevel.IMPORTANT, "tag", "value");
metricService.histogram(50, "histogram1", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(5, histogram1.count());
assertEquals(5, histogram1.takeSnapshot().size());
assertEquals(10, histogram1.takeSnapshot().getMin());
assertEquals(50, histogram1.takeSnapshot().getMax());
Histogram histogram2 =
metricService.getOrCreateHistogram("histogram1", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(histogram1, histogram2);
histogram2 = metricService.getOrCreateHistogram("histogram2", MetricLevel.IMPORTANT);
assertNotEquals(histogram1, histogram2);
histogram2 =
metricService.getOrCreateHistogram("histogram3", MetricLevel.IMPORTANT, "tag", "value");
assertNotEquals(histogram1, histogram2);
histogram2 =
metricService.getOrCreateHistogram(
"histogram4", MetricLevel.IMPORTANT, "tag", "value", "tag2", "value");
assertNotEquals(histogram1, histogram2);
histogram2 =
metricService.getOrCreateHistogram("histogram5", MetricLevel.NORMAL, "tag", "value");
assertEquals(DoNothingMetricManager.doNothingHistogram, histogram2);
assertEquals(4, metricService.getAllHistograms().size());
metricService.histogram(10, "histogram6", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(5, metricService.getAllHistograms().size());
metricService.remove(MetricType.HISTOGRAM, "histogram6");
assertEquals(5, metricService.getAllHistograms().size());
metricService.remove(MetricType.HISTOGRAM, "histogram6", "tag", "value");
assertEquals(4, metricService.getAllHistograms().size());
assertEquals(16, metricService.getAllMetricKeys().size());
// test timer
Timer timer1 = metricService.getOrCreateTimer("timer1", MetricLevel.IMPORTANT, "tag", "value");
assertNotNull(timer1);
metricService.timer(2, TimeUnit.MINUTES, "timer1", MetricLevel.IMPORTANT, "tag", "value");
metricService.timer(4, TimeUnit.MINUTES, "timer1", MetricLevel.IMPORTANT, "tag", "value");
metricService.timer(6, TimeUnit.MINUTES, "timer1", MetricLevel.IMPORTANT, "tag", "value");
metricService.timer(8, TimeUnit.MINUTES, "timer1", MetricLevel.IMPORTANT, "tag", "value");
metricService.timer(10, TimeUnit.MINUTES, "timer1", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(5, timer1.getImmutableRate().getCount());
assertEquals(5, timer1.takeSnapshot().size());
Timer timer2 = metricService.getOrCreateTimer("timer1", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(timer1, timer2);
timer2 = metricService.getOrCreateTimer("timer2", MetricLevel.IMPORTANT);
assertNotEquals(timer1, timer2);
timer2 = metricService.getOrCreateTimer("timer3", MetricLevel.IMPORTANT, "tag", "value");
assertNotEquals(timer1, timer2);
timer2 =
metricService.getOrCreateTimer(
"timer4", MetricLevel.IMPORTANT, "tag", "value", "tag2", "value");
assertNotEquals(timer1, timer2);
timer2 = metricService.getOrCreateTimer("timer5", MetricLevel.NORMAL, "tag", "value");
assertNotEquals(timer1, timer2);
assertEquals(4, metricService.getAllTimers().size());
metricService.timer(10, TimeUnit.MILLISECONDS, "timer6", MetricLevel.IMPORTANT, "tag", "value");
assertEquals(5, metricService.getAllTimers().size());
metricService.remove(MetricType.TIMER, "timer6");
assertEquals(5, metricService.getAllTimers().size());
metricService.remove(MetricType.TIMER, "timer6", "tag", "value");
assertEquals(4, metricService.getAllTimers().size());
assertEquals(20, metricService.getAllMetricKeys().size());
}
private void testOtherSituation() {
assertThrows(IllegalArgumentException.class, this::getOrCreateDifferentMetricsWithSameName);
Timer timer =
metricService.getOrCreateTimer("same_name", MetricLevel.IMPORTANT, "tag", "value");
assertNotNull(timer);
assertNotEquals(DoNothingMetricManager.doNothingTimer, timer);
Counter counter = metricService.getOrCreateCounter("same_name", MetricLevel.IMPORTANT);
assertNotNull(counter);
assertEquals(DoNothingMetricManager.doNothingCounter, counter);
}
private void getOrCreateDifferentMetricsWithSameName() {
Timer timer =
metricService.getOrCreateTimer("same_name", MetricLevel.IMPORTANT, "tag", "value");
assertNotNull(timer);
metricService.getOrCreateCounter("same_name", MetricLevel.IMPORTANT, "tag", "value");
}
}