/*
* Copyright 2016 Google, Inc.
*
* 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.
*/
package com.netflix.spectator.controllers;
import com.netflix.spectator.api.ManualClock;
import com.netflix.spectator.controllers.model.TestId;
import com.netflix.spectator.api.BasicTag;
import com.netflix.spectator.api.Clock;
import com.netflix.spectator.api.Counter;
import com.netflix.spectator.api.DefaultRegistry;
import com.netflix.spectator.api.Id;
import com.netflix.spectator.api.Meter;
import com.netflix.spectator.api.Measurement;
import com.netflix.spectator.controllers.model.DataPoint;
import com.netflix.spectator.controllers.model.MetricValues;
import com.netflix.spectator.controllers.model.TaggedDataPoints;
import com.netflix.spectator.controllers.model.TestMeter;
import java.util.function.Predicate;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class MetricsControllerTest {
private Clock clock = new ManualClock(12345L, 0L);
MetricsController controller = new MetricsController();
Id idA = new TestId("idA");
Id idB = new TestId("idB");
Id idAXY = idA.withTag("tagA", "X").withTag("tagB", "Y");
Id idAYX = idA.withTag("tagA", "Y").withTag("tagB", "X");
Id idAXZ = idA.withTag("tagA", "X").withTag("tagZ", "Z");
Id idBXY = idB.withTag("tagA", "X").withTag("tagB", "Y");
Measurement measureAXY = new Measurement(idAXY, 11, 11.11);
Measurement measureAYX = new Measurement(idAYX, 12, 12.12);
Measurement measureAXZ = new Measurement(idAXZ, 13, 13.13);
Measurement measureBXY = new Measurement(idBXY, 50, 50.50);
static final Predicate<Measurement> allowAll
= MetricsController.ALL_MEASUREMENTS_FILTER;
Meter meterA = new TestMeter("ignoreA", Arrays.asList(measureAXY, measureAYX, measureAXZ));
Meter meterB = new TestMeter("ignoreB", measureBXY);
@Test
public void testMeterToKind() {
DefaultRegistry r = new DefaultRegistry(clock);
Assert.assertEquals(
"Counter", MetricsController.meterToKind(r, r.counter(idAXY)));
Assert.assertEquals(
"Timer", MetricsController.meterToKind(r, r.timer(idBXY)));
Assert.assertEquals(
"TestMeter", MetricsController.meterToKind(r, meterA));
}
@Test
public void testEncodeSimpleRegistry() {
DefaultRegistry registry = new DefaultRegistry(clock);
Counter counterA = registry.counter(idAXY);
Counter counterB = registry.counter(idBXY);
counterA.increment(4);
counterB.increment(10);
List<TaggedDataPoints> expectedTaggedDataPointsA
= Arrays.asList(
new TaggedDataPoints(
Arrays.asList(new BasicTag("tagA", "X"),
new BasicTag("tagB", "Y")),
Arrays.asList(new DataPoint(clock.wallTime(), 4))));
List<TaggedDataPoints> expectedTaggedDataPointsB
= Arrays.asList(
new TaggedDataPoints(
Arrays.asList(new BasicTag("tagA", "X"),
new BasicTag("tagB", "Y")),
Arrays.asList(new DataPoint(clock.wallTime(), 10))));
HashMap<String, MetricValues> expect = new HashMap<String, MetricValues>();
expect.put("idA", new MetricValues("Counter", expectedTaggedDataPointsA));
expect.put("idB", new MetricValues("Counter", expectedTaggedDataPointsB));
Assert.assertEquals(expect, controller.encodeRegistry(registry, allowAll));
}
@Test
public void testEncodeCombinedRegistry() {
// Multiple occurances of measurements in the same registry
// (confirm these are handled within the registry itself).
Measurement measureBXY2 = new Measurement(idBXY, 5, 5.5);
Meter meterB2 = new TestMeter("ignoreB", measureBXY2);
DefaultRegistry registry = new DefaultRegistry(clock);
registry.register(meterB);
registry.register(meterB2);
List<TaggedDataPoints> expectedTaggedDataPoints = Arrays.asList(
new TaggedDataPoints(
Arrays.asList(new BasicTag("tagA", "X"),
new BasicTag("tagB", "Y")),
Arrays.asList(new DataPoint(clock.wallTime(), 50.5 + 5.5))));
HashMap<String, MetricValues> expect = new HashMap<>();
expect.put("idB", new MetricValues("Counter", expectedTaggedDataPoints));
Assert.assertEquals(expect, controller.encodeRegistry(registry, allowAll));
}
@Test
public void testEncodeCompositeRegistry() {
// Multiple occurances of measurements in the same registry
// (confirm these are handled within the registry itself).
// Here measurements are duplicated but meters have different sets.
Measurement measureAXY2 = new Measurement(idAXY, 20, 20.20);
Meter meterA2 = new TestMeter("ignoreA", measureAXY2);
DefaultRegistry registry = new DefaultRegistry(clock);
registry.register(meterA);
registry.register(meterA2);
List<TaggedDataPoints> expected_tagged_data_points
= Arrays.asList(
new TaggedDataPoints(Arrays.asList(new BasicTag("tagA", "Y"),
new BasicTag("tagB", "X")),
Arrays.asList(new DataPoint(clock.wallTime(), 12.12))),
new TaggedDataPoints(Arrays.asList(new BasicTag("tagA", "X"),
new BasicTag("tagB", "Y")),
// This should be 20, but AggrMeter keeps first time,
// which happens to be the 11th, not the most recent time.
Arrays.asList(new DataPoint(clock.wallTime(), 11.11 + 20.20))),
new TaggedDataPoints(Arrays.asList(new BasicTag("tagA", "X"),
new BasicTag("tagZ", "Z")),
Arrays.asList(new DataPoint(clock.wallTime(), 13.13))));
HashMap<String, MetricValues> expect = new HashMap<String, MetricValues>();
expect.put("idA", new MetricValues("Counter", expected_tagged_data_points));
Assert.assertEquals(expect,
controller.encodeRegistry(registry, allowAll));
}
};