/**
* Copyright 2013 Netflix, Inc.
* <p/>
* 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
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* 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 com.netflix.servo.publish;
import com.netflix.servo.Metric;
import com.netflix.servo.annotations.DataSourceType;
import com.netflix.servo.tag.SortedTagList;
import com.netflix.servo.tag.TagList;
import com.netflix.servo.util.UnmodifiableList;
import org.testng.annotations.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
public class CounterToRateMetricTransformTest {
private static final TagList GAUGE = SortedTagList.builder()
.withTag(DataSourceType.GAUGE)
.build();
private static final TagList COUNTER = SortedTagList.builder()
.withTag(DataSourceType.COUNTER)
.build();
private List<Metric> mkList(long ts, int value) {
return UnmodifiableList.of(
new Metric("m1", SortedTagList.EMPTY, ts, value),
new Metric("m2", GAUGE, ts, value),
new Metric("m3", COUNTER, ts, value)
);
}
private Map<String, Double> mkMap(List<List<Metric>> updates) {
Map<String, Double> map = new HashMap<>();
for (Metric m : updates.get(0)) {
map.put(m.getConfig().getName(), m.getNumberValue().doubleValue());
}
return map;
}
private Map<String, String> mkTypeMap(List<List<Metric>> updates) {
Map<String, String> map = new HashMap<>();
for (Metric m : updates.get(0)) {
map.put(m.getConfig().getName(), m.getConfig().getTags().getValue(DataSourceType.KEY));
}
return map;
}
@Test
public void testResultingType() throws Exception {
MemoryMetricObserver mmo = new MemoryMetricObserver("m", 1);
MetricObserver transform = new CounterToRateMetricTransform(mmo, 120, TimeUnit.SECONDS);
Map<String, String> metrics;
// Make time look like the future to avoid expirations
long baseTime = System.currentTimeMillis() + 100000L;
// First sample
transform.update(mkList(baseTime + 0, 0));
metrics = mkTypeMap(mmo.getObservations());
assertEquals(metrics.size(), 2);
assertEquals(metrics.get("m3"), null);
assertEquals(metrics.get("m2"), "GAUGE");
assertEquals(metrics.get("m1"), null);
transform.update(mkList(baseTime + 5000, 5));
metrics = mkTypeMap(mmo.getObservations());
assertEquals(metrics.size(), 3);
assertEquals(metrics.get("m3"), "RATE");
assertEquals(metrics.get("m2"), "GAUGE");
assertEquals(metrics.get("m1"), null);
}
@Test
public void testSimpleRate() throws Exception {
MemoryMetricObserver mmo = new MemoryMetricObserver("m", 1);
MetricObserver transform = new CounterToRateMetricTransform(mmo, 120, TimeUnit.SECONDS);
Map<String, Double> metrics;
// Make time look like the future to avoid expirations
long baseTime = System.currentTimeMillis() + 100000L;
// First sample
transform.update(mkList(baseTime + 0, 0));
metrics = mkMap(mmo.getObservations());
assertEquals(metrics.size(), 2);
assertTrue(metrics.get("m3") == null);
// Delta of 5 in 5 seconds
transform.update(mkList(baseTime + 5000, 5));
metrics = mkMap(mmo.getObservations());
assertEquals(metrics.size(), 3);
assertEquals(metrics.get("m3"), 1.0, 0.00001);
// Delta of 15 in 5 seconds
transform.update(mkList(baseTime + 10000, 20));
metrics = mkMap(mmo.getObservations());
assertEquals(metrics.size(), 3);
assertEquals(metrics.get("m3"), 3.0, 0.00001);
// No change from previous sample
transform.update(mkList(baseTime + 15000, 20));
metrics = mkMap(mmo.getObservations());
assertEquals(metrics.size(), 3);
assertEquals(metrics.get("m3"), 0.0, 0.00001);
// Decrease from previous sample
transform.update(mkList(baseTime + 20000, 19));
metrics = mkMap(mmo.getObservations());
assertEquals(metrics.size(), 3);
assertEquals(metrics.get("m3"), 0.0, 0.00001);
}
@Test
public void testFirstSample() throws Exception {
MemoryMetricObserver mmo = new MemoryMetricObserver("m", 1);
MetricObserver transform = new CounterToRateMetricTransform(mmo, 120, 5, TimeUnit.SECONDS);
Map<String, Double> metrics;
// Make time look like the future to avoid expirations
long baseTime = System.currentTimeMillis() + 100000L;
// First sample
transform.update(mkList(baseTime + 0, 10));
metrics = mkMap(mmo.getObservations());
assertEquals(metrics.size(), 3);
assertEquals(metrics.get("m3"), 2.0, 0.00001);
// Delta of 5 in 5 seconds
transform.update(mkList(baseTime + 5000, 15));
metrics = mkMap(mmo.getObservations());
assertEquals(metrics.size(), 3);
assertEquals(metrics.get("m3"), 1.0, 0.00001);
}
}