package com.eucalyptus.cloudwatch; /************************************************************************* * Copyright 2009-2013 Eucalyptus Systems, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * Please contact Eucalyptus Systems, Inc., 6755 Hollister Ave., Goleta * CA 93117, USA or visit http://www.eucalyptus.com/licenses/ if you need * additional information or have any questions. ************************************************************************/ import com.eucalyptus.cloudwatch.common.internal.domain.metricdata.MetricEntity; import com.eucalyptus.cloudwatch.common.internal.domain.metricdata.MetricEntity.MetricType; import com.eucalyptus.cloudwatch.common.internal.domain.metricdata.MetricUtils; import com.eucalyptus.cloudwatch.common.internal.domain.metricdata.SimpleMetricEntity; import com.eucalyptus.cloudwatch.common.internal.domain.metricdata.Units; import com.eucalyptus.cloudwatch.service.queue.metricdata.MetricDataQueue; import org.junit.Test; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import static org.junit.Assert.assertEquals; public class TestAggregationQueue { private static final double TOLERANCE = 0.000000001; @Test public void testDistinctAccounts() { final Date now = MetricUtils.stripSeconds(new Date()); // throw some different dimension order in there... final Map<String,String> hashMap = new HashMap<String, String>(); hashMap.put("dim1", "val1"); hashMap.put("dim2", "val2"); final Map<String,String> treeMap = new TreeMap<String, String>(); treeMap.put("dim2", "val2"); treeMap.put("dim1", "val1"); ArrayList<SimpleMetricEntity> list = new ArrayList<SimpleMetricEntity>(); for (int i=0;i<10;i++) { SimpleMetricEntity mqi = new SimpleMetricEntity(); mqi.setAccountId("account"+(i % 2)); mqi.setDimensionMap((i % 3 == 0) ? hashMap: treeMap); // just a random dimension order mqi.setMetricName("metric1"); mqi.setMetricType(MetricType.Custom); mqi.setNamespace("namespace1"); mqi.setSampleMax((double) i); mqi.setSampleMin((double) i); mqi.setSampleSize((double) 1); mqi.setSampleSum((double) i); mqi.setTimestamp(now); mqi.setUnits(Units.None); list.add(mqi); } List<SimpleMetricEntity> aggregateList = MetricDataQueue.aggregate(list); // should be two items... assertEquals(2, aggregateList.size()); // since we are not sure which order, one should have accountId account1 // and one should have accountId0 SimpleMetricEntity odd, even; if (aggregateList.get(0).getAccountId().equals("account0")) { even = aggregateList.get(0); odd = aggregateList.get(1); } else { even = aggregateList.get(1); odd = aggregateList.get(0); } // even totals are 0,2,4,6,8 so total = 20, max = 8, min = 0, count = 5 assertEquals(even.getSampleMax().doubleValue(), 8.0, TOLERANCE); assertEquals(even.getSampleMin().doubleValue(), 0.0, TOLERANCE); assertEquals(even.getSampleSize().doubleValue(), 5.0, TOLERANCE); assertEquals(even.getSampleSum().doubleValue(), 20.0, TOLERANCE); assertEquals(even.getAccountId(), "account0"); assertEquals(even.getDimensionMap(), hashMap); // really either should be ok assertEquals(even.getMetricName(), "metric1"); assertEquals(even.getMetricType(), MetricType.Custom); assertEquals(even.getNamespace(), "namespace1"); assertEquals(even.getTimestamp(), now); assertEquals(even.getUnits(), Units.None); // odd totals are 1,3,5,7,9 so total = 25, max = 9, min = 1, count = 5 assertEquals(odd.getSampleMax().doubleValue(), 9.0, TOLERANCE); assertEquals(odd.getSampleMin().doubleValue(), 1.0, TOLERANCE); assertEquals(odd.getSampleSize().doubleValue(), 5.0, TOLERANCE); assertEquals(odd.getSampleSum().doubleValue(), 25.0, TOLERANCE); assertEquals(odd.getAccountId(), "account1"); assertEquals(odd.getDimensionMap(), treeMap); // really either should be ok assertEquals(odd.getMetricName(), "metric1"); assertEquals(odd.getMetricType(), MetricType.Custom); assertEquals(odd.getNamespace(), "namespace1"); assertEquals(odd.getTimestamp(), now); assertEquals(odd.getUnits(), Units.None); } @Test public void testDistinctMetricNames() { final Date now = MetricUtils.stripSeconds(new Date()); // throw some different dimension order in there... final Map<String,String> hashMap = new HashMap<String, String>(); hashMap.put("dim1", "val1"); hashMap.put("dim2", "val2"); final Map<String,String> treeMap = new TreeMap<String, String>(); treeMap.put("dim2", "val2"); treeMap.put("dim1", "val1"); ArrayList<SimpleMetricEntity> list = new ArrayList<SimpleMetricEntity>(); for (int i=0;i<10;i++) { SimpleMetricEntity mqi = new SimpleMetricEntity(); mqi.setAccountId("account1"); mqi.setDimensionMap((i % 3 == 0) ? hashMap: treeMap); // just a random dimension order mqi.setMetricName("metric"+(i % 2)); mqi.setMetricType(MetricType.Custom); mqi.setNamespace("namespace1"); mqi.setSampleMax((double) i); mqi.setSampleMin((double) i); mqi.setSampleSize((double) 1); mqi.setSampleSum((double) i); mqi.setTimestamp(now); mqi.setUnits(Units.None); list.add(mqi); } List<SimpleMetricEntity> aggregateList = MetricDataQueue.aggregate(list); // should be two items... assertEquals(2, aggregateList.size()); // since we are not sure which order, one should have metricName metric1 // and one should have metric0 SimpleMetricEntity odd, even; if (aggregateList.get(0).getMetricName().equals("metric0")) { even = aggregateList.get(0); odd = aggregateList.get(1); } else { even = aggregateList.get(1); odd = aggregateList.get(0); } // even totals are 0,2,4,6,8 so total = 20, max = 8, min = 0, count = 5 assertEquals(even.getSampleMax().doubleValue(), 8.0, TOLERANCE); assertEquals(even.getSampleMin().doubleValue(), 0.0, TOLERANCE); assertEquals(even.getSampleSize().doubleValue(), 5.0, TOLERANCE); assertEquals(even.getSampleSum().doubleValue(), 20.0, TOLERANCE); assertEquals(even.getAccountId(), "account1"); assertEquals(even.getDimensionMap(), hashMap); // really either should be ok assertEquals(even.getMetricName(), "metric0"); assertEquals(even.getMetricType(), MetricType.Custom); assertEquals(even.getNamespace(), "namespace1"); assertEquals(even.getTimestamp(), now); assertEquals(even.getUnits(), Units.None); // odd totals are 1,3,5,7,9 so total = 25, max = 9, min = 1, count = 5 assertEquals(odd.getSampleMax().doubleValue(), 9.0, TOLERANCE); assertEquals(odd.getSampleMin().doubleValue(), 1.0, TOLERANCE); assertEquals(odd.getSampleSize().doubleValue(), 5.0, TOLERANCE); assertEquals(odd.getSampleSum().doubleValue(), 25.0, TOLERANCE); assertEquals(odd.getAccountId(), "account1"); assertEquals(odd.getDimensionMap(), treeMap); // really either should be ok assertEquals(odd.getMetricName(), "metric1"); assertEquals(odd.getMetricType(), MetricType.Custom); assertEquals(odd.getNamespace(), "namespace1"); assertEquals(odd.getTimestamp(), now); assertEquals(odd.getUnits(), Units.None); } @Test public void testDistinctMetricTypes() { final Date now = MetricUtils.stripSeconds(new Date()); // throw some different dimension order in there... final Map<String,String> hashMap = new HashMap<String, String>(); hashMap.put("dim1", "val1"); hashMap.put("dim2", "val2"); final Map<String,String> treeMap = new TreeMap<String, String>(); treeMap.put("dim2", "val2"); treeMap.put("dim1", "val1"); ArrayList<SimpleMetricEntity> list = new ArrayList<SimpleMetricEntity>(); for (int i=0;i<10;i++) { SimpleMetricEntity mqi = new SimpleMetricEntity(); mqi.setAccountId("account1"); mqi.setDimensionMap((i % 3 == 0) ? hashMap: treeMap); // just a random dimension order mqi.setMetricName("metric1"); mqi.setMetricType((i % 2) == 0 ? MetricType.Custom: MetricType.System); mqi.setNamespace("namespace1"); mqi.setSampleMax((double) i); mqi.setSampleMin((double) i); mqi.setSampleSize((double) 1); mqi.setSampleSum((double) i); mqi.setTimestamp(now); mqi.setUnits(Units.None); list.add(mqi); } List<SimpleMetricEntity> aggregateList = MetricDataQueue.aggregate(list); // should be two items... assertEquals(2, aggregateList.size()); // since we are not sure which order, one should have metricType Custom // and one should have System SimpleMetricEntity odd, even; if (aggregateList.get(0).getMetricType().equals(MetricType.Custom)) { even = aggregateList.get(0); odd = aggregateList.get(1); } else { even = aggregateList.get(1); odd = aggregateList.get(0); } // even totals are 0,2,4,6,8 so total = 20, max = 8, min = 0, count = 5 assertEquals(even.getSampleMax().doubleValue(), 8.0, TOLERANCE); assertEquals(even.getSampleMin().doubleValue(), 0.0, TOLERANCE); assertEquals(even.getSampleSize().doubleValue(), 5.0, TOLERANCE); assertEquals(even.getSampleSum().doubleValue(), 20.0, TOLERANCE); assertEquals(even.getAccountId(), "account1"); assertEquals(even.getDimensionMap(), hashMap); // really either should be ok assertEquals(even.getMetricName(), "metric1"); assertEquals(even.getMetricType(), MetricType.Custom); assertEquals(even.getNamespace(), "namespace1"); assertEquals(even.getTimestamp(), now); assertEquals(even.getUnits(), Units.None); // odd totals are 1,3,5,7,9 so total = 25, max = 9, min = 1, count = 5 assertEquals(odd.getSampleMax().doubleValue(), 9.0, TOLERANCE); assertEquals(odd.getSampleMin().doubleValue(), 1.0, TOLERANCE); assertEquals(odd.getSampleSize().doubleValue(), 5.0, TOLERANCE); assertEquals(odd.getSampleSum().doubleValue(), 25.0, TOLERANCE); assertEquals(odd.getAccountId(), "account1"); assertEquals(odd.getDimensionMap(), treeMap); // really either should be ok assertEquals(odd.getMetricName(), "metric1"); assertEquals(odd.getMetricType(), MetricType.System); assertEquals(odd.getNamespace(), "namespace1"); assertEquals(odd.getTimestamp(), now); assertEquals(odd.getUnits(), Units.None); } @Test public void testDistinctNamespaces() { final Date now = MetricUtils.stripSeconds(new Date()); // throw some different dimension order in there... final Map<String,String> hashMap = new HashMap<String, String>(); hashMap.put("dim1", "val1"); hashMap.put("dim2", "val2"); final Map<String,String> treeMap = new TreeMap<String, String>(); treeMap.put("dim2", "val2"); treeMap.put("dim1", "val1"); ArrayList<SimpleMetricEntity> list = new ArrayList<SimpleMetricEntity>(); for (int i=0;i<10;i++) { SimpleMetricEntity mqi = new SimpleMetricEntity(); mqi.setAccountId("account1"); mqi.setDimensionMap((i % 3 == 0) ? hashMap: treeMap); // just a random dimension order mqi.setMetricName("metric1"); mqi.setMetricType(MetricType.Custom); mqi.setNamespace("namespace"+(i%2)); mqi.setSampleMax((double) i); mqi.setSampleMin((double) i); mqi.setSampleSize((double) 1); mqi.setSampleSum((double) i); mqi.setTimestamp(now); mqi.setUnits(Units.None); list.add(mqi); } List<SimpleMetricEntity> aggregateList = MetricDataQueue.aggregate(list); // should be two items... assertEquals(2, aggregateList.size()); // since we are not sure which order, one should have namespace namespace0 // and one should have namespace0 SimpleMetricEntity odd, even; if (aggregateList.get(0).getNamespace().equals("namespace0")) { even = aggregateList.get(0); odd = aggregateList.get(1); } else { even = aggregateList.get(1); odd = aggregateList.get(0); } // even totals are 0,2,4,6,8 so total = 20, max = 8, min = 0, count = 5 assertEquals(even.getSampleMax().doubleValue(), 8.0, TOLERANCE); assertEquals(even.getSampleMin().doubleValue(), 0.0, TOLERANCE); assertEquals(even.getSampleSize().doubleValue(), 5.0, TOLERANCE); assertEquals(even.getSampleSum().doubleValue(), 20.0, TOLERANCE); assertEquals(even.getAccountId(), "account1"); assertEquals(even.getDimensionMap(), hashMap); // really either should be ok assertEquals(even.getMetricName(), "metric1"); assertEquals(even.getMetricType(), MetricType.Custom); assertEquals(even.getNamespace(), "namespace0"); assertEquals(even.getTimestamp(), now); assertEquals(even.getUnits(), Units.None); // odd totals are 1,3,5,7,9 so total = 25, max = 9, min = 1, count = 5 assertEquals(odd.getSampleMax().doubleValue(), 9.0, TOLERANCE); assertEquals(odd.getSampleMin().doubleValue(), 1.0, TOLERANCE); assertEquals(odd.getSampleSize().doubleValue(), 5.0, TOLERANCE); assertEquals(odd.getSampleSum().doubleValue(), 25.0, TOLERANCE); assertEquals(odd.getAccountId(), "account1"); assertEquals(odd.getDimensionMap(), treeMap); // really either should be ok assertEquals(odd.getMetricName(), "metric1"); assertEquals(odd.getMetricType(), MetricType.Custom); assertEquals(odd.getNamespace(), "namespace1"); assertEquals(odd.getTimestamp(), now); assertEquals(odd.getUnits(), Units.None); } @Test public void testDistinctTimestamps() { final Date now = MetricUtils.stripSeconds(new Date()); final Date later = MetricUtils.stripSeconds(new Date(now.getTime() + 120000L)); // two minutes // throw some different dimension order in there... final Map<String,String> hashMap = new HashMap<String, String>(); hashMap.put("dim1", "val1"); hashMap.put("dim2", "val2"); final Map<String,String> treeMap = new TreeMap<String, String>(); treeMap.put("dim2", "val2"); treeMap.put("dim1", "val1"); ArrayList<SimpleMetricEntity> list = new ArrayList<SimpleMetricEntity>(); for (int i=0;i<10;i++) { SimpleMetricEntity mqi = new SimpleMetricEntity(); mqi.setAccountId("account1"); mqi.setDimensionMap((i % 3 == 0) ? hashMap: treeMap); // just a random dimension order mqi.setMetricName("metric1"); mqi.setMetricType(MetricType.Custom); mqi.setNamespace("namespace1"); mqi.setSampleMax((double) i); mqi.setSampleMin((double) i); mqi.setSampleSize((double) 1); mqi.setSampleSum((double) i); mqi.setTimestamp((i % 2 == 0) ? now : later); mqi.setUnits(Units.None); list.add(mqi); } List<SimpleMetricEntity> aggregateList = MetricDataQueue.aggregate(list); // should be two items... assertEquals(2, aggregateList.size()); // since we are not sure which order, one should have timestamp now // and one should have later SimpleMetricEntity odd, even; if (aggregateList.get(0).getTimestamp().equals(now)) { even = aggregateList.get(0); odd = aggregateList.get(1); } else { even = aggregateList.get(1); odd = aggregateList.get(0); } // even totals are 0,2,4,6,8 so total = 20, max = 8, min = 0, count = 5 assertEquals(even.getSampleMax().doubleValue(), 8.0, TOLERANCE); assertEquals(even.getSampleMin().doubleValue(), 0.0, TOLERANCE); assertEquals(even.getSampleSize().doubleValue(), 5.0, TOLERANCE); assertEquals(even.getSampleSum().doubleValue(), 20.0, TOLERANCE); assertEquals(even.getAccountId(), "account1"); assertEquals(even.getDimensionMap(), hashMap); // really either should be ok assertEquals(even.getMetricName(), "metric1"); assertEquals(even.getMetricType(), MetricType.Custom); assertEquals(even.getNamespace(), "namespace1"); assertEquals(even.getTimestamp(), now); assertEquals(even.getUnits(), Units.None); // odd totals are 1,3,5,7,9 so total = 25, max = 9, min = 1, count = 5 assertEquals(odd.getSampleMax().doubleValue(), 9.0, TOLERANCE); assertEquals(odd.getSampleMin().doubleValue(), 1.0, TOLERANCE); assertEquals(odd.getSampleSize().doubleValue(), 5.0, TOLERANCE); assertEquals(odd.getSampleSum().doubleValue(), 25.0, TOLERANCE); assertEquals(odd.getAccountId(), "account1"); assertEquals(odd.getDimensionMap(), treeMap); // really either should be ok assertEquals(odd.getMetricName(), "metric1"); assertEquals(odd.getMetricType(), MetricType.Custom); assertEquals(odd.getNamespace(), "namespace1"); assertEquals(odd.getTimestamp(), later); assertEquals(odd.getUnits(), Units.None); } @Test public void testDistinctUnits() { final Date now = MetricUtils.stripSeconds(new Date()); // throw some different dimension order in there... final Map<String,String> hashMap = new HashMap<String, String>(); hashMap.put("dim1", "val1"); hashMap.put("dim2", "val2"); final Map<String,String> treeMap = new TreeMap<String, String>(); treeMap.put("dim2", "val2"); treeMap.put("dim1", "val1"); ArrayList<SimpleMetricEntity> list = new ArrayList<SimpleMetricEntity>(); for (int i=0;i<10;i++) { SimpleMetricEntity mqi = new SimpleMetricEntity(); mqi.setAccountId("account1"); mqi.setDimensionMap((i % 3 == 0) ? hashMap: treeMap); // just a random dimension order mqi.setMetricName("metric1"); mqi.setMetricType(MetricType.Custom); mqi.setNamespace("namespace1"); mqi.setSampleMax((double) i); mqi.setSampleMin((double) i); mqi.setSampleSize((double) 1); mqi.setSampleSum((double) i); mqi.setTimestamp(now); mqi.setUnits((i % 2 == 0) ? Units.None : Units.Count); list.add(mqi); } List<SimpleMetricEntity> aggregateList = MetricDataQueue.aggregate(list); // should be two items... assertEquals(2, aggregateList.size()); // since we are not sure which order, one should have units none // and one should have count SimpleMetricEntity odd, even; if (aggregateList.get(0).getUnits().equals(Units.None)) { even = aggregateList.get(0); odd = aggregateList.get(1); } else { even = aggregateList.get(1); odd = aggregateList.get(0); } // even totals are 0,2,4,6,8 so total = 20, max = 8, min = 0, count = 5 assertEquals(even.getSampleMax().doubleValue(), 8.0, TOLERANCE); assertEquals(even.getSampleMin().doubleValue(), 0.0, TOLERANCE); assertEquals(even.getSampleSize().doubleValue(), 5.0, TOLERANCE); assertEquals(even.getSampleSum().doubleValue(), 20.0, TOLERANCE); assertEquals(even.getAccountId(), "account1"); assertEquals(even.getDimensionMap(), hashMap); // really either should be ok assertEquals(even.getMetricName(), "metric1"); assertEquals(even.getMetricType(), MetricType.Custom); assertEquals(even.getNamespace(), "namespace1"); assertEquals(even.getTimestamp(), now); assertEquals(even.getUnits(), Units.None); // odd totals are 1,3,5,7,9 so total = 25, max = 9, min = 1, count = 5 assertEquals(odd.getSampleMax().doubleValue(), 9.0, TOLERANCE); assertEquals(odd.getSampleMin().doubleValue(), 1.0, TOLERANCE); assertEquals(odd.getSampleSize().doubleValue(), 5.0, TOLERANCE); assertEquals(odd.getSampleSum().doubleValue(), 25.0, TOLERANCE); assertEquals(odd.getAccountId(), "account1"); assertEquals(odd.getDimensionMap(), treeMap); // really either should be ok assertEquals(odd.getMetricName(), "metric1"); assertEquals(odd.getMetricType(), MetricType.Custom); assertEquals(odd.getNamespace(), "namespace1"); assertEquals(odd.getTimestamp(), now); assertEquals(odd.getUnits(), Units.Count); } @Test public void testDistinctDimensionMaps() { final Date now = MetricUtils.stripSeconds(new Date()); // throw some different dimension order in there... final Map<String,String> hashMap = new HashMap<String, String>(); hashMap.put("dim1", "val1"); hashMap.put("dim2", "val2"); final Map<String,String> treeMap = new TreeMap<String, String>(); treeMap.put("dim2", "val2"); treeMap.put("dim1", "val1"); ArrayList<SimpleMetricEntity> list = new ArrayList<SimpleMetricEntity>(); for (int i=0;i<10;i++) { SimpleMetricEntity mqi = new SimpleMetricEntity(); mqi.setAccountId("account1"); mqi.setDimensionMap((i % 2 == 0) ? null: hashMap); mqi.setMetricName("metric1"); mqi.setMetricType(MetricType.Custom); mqi.setNamespace("namespace1"); mqi.setSampleMax((double) i); mqi.setSampleMin((double) i); mqi.setSampleSize((double) 1); mqi.setSampleSum((double) i); mqi.setTimestamp(now); mqi.setUnits(Units.None); list.add(mqi); } List<SimpleMetricEntity> aggregateList = MetricDataQueue.aggregate(list); // should be two items... assertEquals(2, aggregateList.size()); // since we are not sure which order, one should have dimensionMap null // and one should have hashMap SimpleMetricEntity odd, even; if (aggregateList.get(0).getDimensionMap() == null) { even = aggregateList.get(0); odd = aggregateList.get(1); } else { even = aggregateList.get(1); odd = aggregateList.get(0); } // even totals are 0,2,4,6,8 so total = 20, max = 8, min = 0, count = 5 assertEquals(even.getSampleMax().doubleValue(), 8.0, TOLERANCE); assertEquals(even.getSampleMin().doubleValue(), 0.0, TOLERANCE); assertEquals(even.getSampleSize().doubleValue(), 5.0, TOLERANCE); assertEquals(even.getSampleSum().doubleValue(), 20.0, TOLERANCE); assertEquals(even.getAccountId(), "account1"); assertEquals(even.getDimensionMap(), null); assertEquals(even.getMetricName(), "metric1"); assertEquals(even.getMetricType(), MetricType.Custom); assertEquals(even.getNamespace(), "namespace1"); assertEquals(even.getTimestamp(), now); assertEquals(even.getUnits(), Units.None); // odd totals are 1,3,5,7,9 so total = 25, max = 9, min = 1, count = 5 assertEquals(odd.getSampleMax().doubleValue(), 9.0, TOLERANCE); assertEquals(odd.getSampleMin().doubleValue(), 1.0, TOLERANCE); assertEquals(odd.getSampleSize().doubleValue(), 5.0, TOLERANCE); assertEquals(odd.getSampleSum().doubleValue(), 25.0, TOLERANCE); assertEquals(odd.getAccountId(), "account1"); assertEquals(odd.getDimensionMap(), treeMap); // really either should be ok assertEquals(odd.getMetricName(), "metric1"); assertEquals(odd.getMetricType(), MetricType.Custom); assertEquals(odd.getNamespace(), "namespace1"); assertEquals(odd.getTimestamp(), now); assertEquals(odd.getUnits(), Units.None); } /* public static void main(String[] args) { ArrayList<SimpleMetricEntity> list6 = new ArrayList<SimpleMetricEntity>(); for (int i=0;i<10;i++) { SimpleMetricEntity mqi = new SimpleMetricEntity(); mqi.setAccountId("account1"); mqi.setDimensionMap((i % 3 == 0) ? hashMap: treeMap); mqi.setMetricName("metric1"); mqi.setMetricType(MetricType.Custom); mqi.setNamespace("namespace1"); mqi.setSampleMax((double) i); mqi.setSampleMin((double) i); mqi.setSampleSize((double) 1); mqi.setSampleSum((double) i); mqi.setTimestamp(now); mqi.setUnits((i % 2 == 0) ? Units.None : Units.Count); mqi.setUserId("user1"); list6.add(mqi); } */ }