package com.linkedin.databus2.core.monitoring; /* * * Copyright 2013 LinkedIn Corp. All rights reserved * * Licensed 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. * */ import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import com.linkedin.databus.core.monitoring.HistogramBasedIntStats; public class TestHistogramBaseIntStats { @BeforeClass public void beforeClass() { } @AfterClass public void afterClass() { } @Test public void testStatsSimple() throws Exception { HistogramBasedIntStats.StaticConfigBuilder configBuilder = new HistogramBasedIntStats.StaticConfigBuilder(); configBuilder.setCapacity(20); configBuilder.setBucketsNum(11); configBuilder.setBucketsMin(0); configBuilder.setBucketsMax(11); configBuilder.setDropNum(1); HistogramBasedIntStats.StaticConfig config = configBuilder.build(); HistogramBasedIntStats stats = new HistogramBasedIntStats(config); HistogramBasedIntStats.Stats s = new HistogramBasedIntStats.Stats(); //just add some data points less than the capacity and very statistics for (int i = 1; i <= 10; ++i) { stats.add(1); Assert.assertEquals(stats.size(), i, "correct size"); } stats.calcStats(s); Assert.assertEquals(s.getMax(), 1, "correct max"); Assert.assertEquals(s.getMin(), 1, "correct min"); Assert.assertEquals(s.getNum(), 10, "correct num"); Assert.assertEquals(s.getSum(), 10, "correct sum"); Assert.assertEquals(s.getMean(), 1.0, "correct mean"); Assert.assertEquals(s.getMedian(), 1, "correct median"); Assert.assertEquals(s.getStdDev(), 0.0, "correct stdDev"); //add more data points so that we push the previous ones out completely for (int i = 1; i <= 20; ++i) { stats.add(5); Assert.assertEquals(stats.size(), i <= 10 ? 10 + i : 20, "correct size" ); } stats.calcStats(s); Assert.assertEquals(s.getMax(), 5, "correct max"); Assert.assertEquals(s.getMin(), 5, "correct min"); Assert.assertEquals(s.getNum(), 20, "correct num"); Assert.assertEquals(s.getSum(), 100, "correct sum"); Assert.assertEquals(s.getMean(), 5.0, "correct mean"); Assert.assertEquals(s.getMedian(), 5, "correct median"); Assert.assertEquals(s.getStdDev(), 0.0, "correct stdDev"); //add a few more data points to test a mixture of different values for (int i = 1; i <= 8; ++i) { stats.add(3); Assert.assertEquals(stats.size(), 20, "correct size"); } stats.calcStats(s); Assert.assertEquals(s.getMax(), 5, "correct max"); Assert.assertEquals(s.getMin(), 3, "correct min"); Assert.assertEquals(s.getNum(), 20, "correct num"); Assert.assertEquals(s.getSum(), 84, "correct sum"); Assert.assertEquals(s.getMean(), 84.0/20, "correct mean"); Assert.assertEquals(s.getMedian(), 5, "correct median"); Assert.assertEquals(s.getPerc75(), 5, "correct 75 percentile"); Assert.assertEquals(s.getPerc99(), 5, "correct 99 percentile"); Assert.assertTrue(s.getStdDev() > 0.0, "correct stdDev"); //add a few more data points to test a mixture of different values for (int i = 1; i <= 4; ++i) { stats.add(3); Assert.assertEquals(stats.size(), 20, "correct size"); } stats.calcStats(s); Assert.assertEquals(s.getMax(), 5, "correct max"); Assert.assertEquals(s.getMin(), 3, "correct min"); Assert.assertEquals(s.getNum(), 20, "correct num"); Assert.assertEquals(s.getSum(), 76, "correct sum"); Assert.assertEquals(s.getMean(), 76.0/20, "correct mean"); Assert.assertEquals(s.getMedian(), 3, "correct median"); Assert.assertEquals(s.getPerc75(), 5, "correct 75 percentile"); Assert.assertEquals(s.getPerc95(), 5, "correct 95 percentile"); Assert.assertTrue(s.getStdDev() > 0.0, "correct stdDev"); //add a few more data points to test a mixture of different values for (int i = 1; i <= 4; ++i) { stats.add(3); Assert.assertEquals(stats.size(), 20, "correct size"); } stats.calcStats(s); Assert.assertEquals(s.getMax(), 5, "correct max"); Assert.assertEquals(s.getMin(), 3, "correct min"); Assert.assertEquals(s.getNum(), 20, "correct num"); Assert.assertEquals(s.getSum(), 68, "correct sum"); Assert.assertEquals(s.getMean(), 68.0/20, "correct mean"); Assert.assertEquals(s.getMedian(), 3, "correct median"); Assert.assertEquals(s.getPerc75(), 3, "correct 75 percentile"); Assert.assertEquals(s.getPerc90(), 5, "correct 90 percentile"); Assert.assertTrue(s.getStdDev() > 0.0, "correct stdDev"); //add a few more data points to test a mixture of different values for (int i = 1; i <= 4; ++i) { stats.add(1); Assert.assertEquals(stats.size(), 20, "correct size"); } stats.calcStats(s); Assert.assertEquals(s.getMax(), 3, "correct max"); Assert.assertEquals(s.getMin(), 1, "correct min"); Assert.assertEquals(s.getNum(), 20, "correct num"); Assert.assertEquals(s.getSum(), 4*1 + 16*3, "correct sum"); Assert.assertEquals(s.getMean(), s.getSum()/20.0, "correct mean"); Assert.assertEquals(s.getMedian(), 3, "correct median"); Assert.assertEquals(s.getPerc75(), 3, "correct 75 percentile"); Assert.assertEquals(s.getPerc90(), 3, "correct 90 percentile"); Assert.assertEquals(s.getPerc95(), 3, "correct 95 percentile"); Assert.assertEquals(s.getPerc99(), 3, "correct 99 percentile"); Assert.assertTrue(s.getStdDev() > 0.0, "correct stdDev"); } @Test public void testBigDrop() throws Exception { HistogramBasedIntStats.StaticConfigBuilder configBuilder = new HistogramBasedIntStats.StaticConfigBuilder(); configBuilder.setCapacity(200); configBuilder.setBucketsNum(11); configBuilder.setBucketsMin(0); configBuilder.setBucketsMax(11); configBuilder.setDropNum(10); HistogramBasedIntStats.StaticConfig config = configBuilder.build(); HistogramBasedIntStats stats = new HistogramBasedIntStats(config); for (int i = 1; i <= 500; ++i) { stats.add(i); int expectedSize = (i <= 200) ? i : 191 + (i - 1) % 10; Assert.assertEquals(stats.size(), expectedSize, "correct # of data points for i=" + i); } } @Test public void testPercentilesWidth1() throws Exception { HistogramBasedIntStats.StaticConfigBuilder configBuilder = new HistogramBasedIntStats.StaticConfigBuilder(); configBuilder.setCapacity(200); configBuilder.setBucketsNum(50); configBuilder.setBucketsMin(1); configBuilder.setBucketsMax(51); configBuilder.setDropNum(1); HistogramBasedIntStats.StaticConfig config = configBuilder.build(); HistogramBasedIntStats stats = new HistogramBasedIntStats(config); HistogramBasedIntStats.Stats s = new HistogramBasedIntStats.Stats(); for (int j = 1; j <= 6; ++j) { for (int i = 1; i <= 50; ++i) { stats.add(i); } } int[] histo = stats.getHistogram(); Assert.assertEquals(histo.length, 52, "correct histogram size"); Assert.assertEquals(histo[0], 0, "correct size for bucket 0"); Assert.assertEquals(histo[51], 0, "correct size for bucket 51"); for (int i = 1; i <= 50; ++i) Assert.assertEquals(histo[i], 4, "correct size for bucket " + i); int[] bvalues = stats.getBucketValues(); Assert.assertEquals(bvalues.length, 52, "correct bucket values size"); Assert.assertEquals(bvalues[0], 0, "correct bucket value 0"); Assert.assertEquals(bvalues[51], 51, "correct bucket value 51"); for (int i = 1; i <= 50; ++i) Assert.assertEquals(bvalues[i], i, "correct bucket value " + i); stats.calcStats(s); Assert.assertEquals(s.getSum(), 5100, "correct sum"); Assert.assertEquals(s.getNum(), 200, "correct num"); Assert.assertEquals(s.getMean(), 25.5, "correct mean"); Assert.assertEquals(s.getMin(), 1, "correct min"); Assert.assertEquals(s.getMax(), 50, "correct max"); Assert.assertEquals(s.getMedian(), 25, "correct median"); Assert.assertEquals(s.getPerc75(), 38, "correct 75th percentile"); Assert.assertEquals(s.getPerc90(), 45, "correct 90th percentile"); Assert.assertEquals(s.getPerc95(), 48, "correct 95th percentile"); Assert.assertEquals(s.getPerc99(), 50, "correct 99th percentile"); } @Test public void testPercentilesWidth10() throws Exception { HistogramBasedIntStats.StaticConfigBuilder configBuilder = new HistogramBasedIntStats.StaticConfigBuilder(); configBuilder.setCapacity(200); configBuilder.setBucketsNum(5); configBuilder.setBucketsMin(1); configBuilder.setBucketsMax(51); configBuilder.setDropNum(1); HistogramBasedIntStats.StaticConfig config = configBuilder.build(); HistogramBasedIntStats stats = new HistogramBasedIntStats(config); HistogramBasedIntStats.Stats s = new HistogramBasedIntStats.Stats(); for (int j = 1; j <= 6; ++j) { for (int i = 1; i <= 50; ++i) { stats.add(i); } } int[] histo = stats.getHistogram(); Assert.assertEquals(histo.length, 7, "correct histogram size"); Assert.assertEquals(histo[0], 0, "correct size for bucket 0"); Assert.assertEquals(histo[6], 0, "correct size for bucket 51"); for (int i = 1; i <= 5; ++i) Assert.assertEquals(histo[i], 40, "correct size for bucket " + i); int[] bvalues = stats.getBucketValues(); Assert.assertEquals(bvalues.length, 7, "correct bucket values size"); Assert.assertEquals(bvalues[0], -4, "correct bucket value 0"); Assert.assertEquals(bvalues[6], 56, "correct bucket value 51"); for (int i = 1; i <= 5; ++i) Assert.assertEquals(bvalues[i], (i - 1) * 10 + 6, "correct bucket value " + i); stats.calcStats(s); Assert.assertEquals(s.getSum(), 40 * (6 + 16 + 26 + 36 + 46), "correct sum"); Assert.assertEquals(s.getNum(), 200, "correct num"); Assert.assertEquals(s.getMean(), 1.0 * s.getSum() / s.getNum(), "correct mean"); Assert.assertEquals(s.getMin(), 6, "correct min"); Assert.assertEquals(s.getMax(), 46, "correct max"); Assert.assertEquals(s.getMedian(), 26, "correct median"); Assert.assertEquals(s.getPerc75(), 36, "correct 75th percentile"); Assert.assertEquals(s.getPerc90(), 46, "correct 90th percentile"); Assert.assertEquals(s.getPerc95(), 46, "correct 95th percentile"); Assert.assertEquals(s.getPerc99(), 46, "correct 99th percentile"); } }