| /* |
| * 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.hadoop.metrics2.util; |
| |
| import java.util.Arrays; |
| import java.util.Collection; |
| |
| import org.junit.Test; |
| import static org.junit.Assert.*; |
| import static org.mockito.Mockito.*; |
| |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| import org.apache.hadoop.metrics2.AbstractMetric; |
| import org.apache.hadoop.metrics2.MetricsRecord; |
| import org.apache.hadoop.metrics2.MetricsTag; |
| import static org.apache.hadoop.metrics2.lib.Interns.*; |
| |
| public class TestMetricsCache { |
| private static final Log LOG = LogFactory.getLog(TestMetricsCache.class); |
| |
| @SuppressWarnings("deprecation") |
| @Test public void testUpdate() { |
| MetricsCache cache = new MetricsCache(); |
| MetricsRecord mr = makeRecord("r", |
| Arrays.asList(makeTag("t", "tv")), |
| Arrays.asList(makeMetric("m", 0), makeMetric("m1", 1))); |
| |
| MetricsCache.Record cr = cache.update(mr); |
| verify(mr).name(); |
| verify(mr).tags(); |
| verify(mr).metrics(); |
| assertEquals("same record size", cr.metrics().size(), |
| ((Collection<AbstractMetric>)mr.metrics()).size()); |
| assertEquals("same metric value", 0, cr.getMetric("m")); |
| |
| MetricsRecord mr2 = makeRecord("r", |
| Arrays.asList(makeTag("t", "tv")), |
| Arrays.asList(makeMetric("m", 2), makeMetric("m2", 42))); |
| cr = cache.update(mr2); |
| assertEquals("contains 3 metric", 3, cr.metrics().size()); |
| checkMetricValue("updated metric value", cr, "m", 2); |
| checkMetricValue("old metric value", cr, "m1", 1); |
| checkMetricValue("new metric value", cr, "m2", 42); |
| |
| MetricsRecord mr3 = makeRecord("r", |
| Arrays.asList(makeTag("t", "tv3")), // different tag value |
| Arrays.asList(makeMetric("m3", 3))); |
| cr = cache.update(mr3); // should get a new record |
| assertEquals("contains 1 metric", 1, cr.metrics().size()); |
| checkMetricValue("updated metric value", cr, "m3", 3); |
| // tags cache should be empty so far |
| assertEquals("no tags", 0, cr.tags().size()); |
| // until now |
| cr = cache.update(mr3, true); |
| assertEquals("Got 1 tag", 1, cr.tags().size()); |
| assertEquals("Tag value", "tv3", cr.getTag("t")); |
| checkMetricValue("Metric value", cr, "m3", 3); |
| } |
| |
| @SuppressWarnings("deprecation") |
| @Test public void testGet() { |
| MetricsCache cache = new MetricsCache(); |
| assertNull("empty", cache.get("r", Arrays.asList(makeTag("t", "t")))); |
| MetricsRecord mr = makeRecord("r", |
| Arrays.asList(makeTag("t", "t")), |
| Arrays.asList(makeMetric("m", 1))); |
| cache.update(mr); |
| MetricsCache.Record cr = cache.get("r", mr.tags()); |
| LOG.debug("tags="+ mr.tags() +" cr="+ cr); |
| |
| assertNotNull("Got record", cr); |
| assertEquals("contains 1 metric", 1, cr.metrics().size()); |
| checkMetricValue("new metric value", cr, "m", 1); |
| } |
| |
| /** |
| * Make sure metrics tag has a sane hashCode impl |
| */ |
| @Test public void testNullTag() { |
| MetricsCache cache = new MetricsCache(); |
| MetricsRecord mr = makeRecord("r", |
| Arrays.asList(makeTag("t", null)), |
| Arrays.asList(makeMetric("m", 0), makeMetric("m1", 1))); |
| |
| MetricsCache.Record cr = cache.update(mr); |
| assertTrue("t value should be null", null == cr.getTag("t")); |
| } |
| |
| @Test public void testOverflow() { |
| MetricsCache cache = new MetricsCache(); |
| MetricsCache.Record cr; |
| Collection<MetricsTag> t0 = Arrays.asList(makeTag("t0", "0")); |
| for (int i = 0; i < MetricsCache.MAX_RECS_PER_NAME_DEFAULT + 1; ++i) { |
| cr = cache.update(makeRecord("r", |
| Arrays.asList(makeTag("t"+ i, ""+ i)), |
| Arrays.asList(makeMetric("m", i)))); |
| checkMetricValue("new metric value", cr, "m", i); |
| if (i < MetricsCache.MAX_RECS_PER_NAME_DEFAULT) { |
| assertNotNull("t0 is still there", cache.get("r", t0)); |
| } |
| } |
| assertNull("t0 is gone", cache.get("r", t0)); |
| } |
| |
| private void checkMetricValue(String description, MetricsCache.Record cr, |
| String key, Number val) { |
| assertEquals(description, val, cr.getMetric(key)); |
| assertNotNull("metric not null", cr.getMetricInstance(key)); |
| assertEquals(description, val, cr.getMetricInstance(key).value()); |
| } |
| |
| private MetricsRecord makeRecord(String name, Collection<MetricsTag> tags, |
| Collection<AbstractMetric> metrics) { |
| MetricsRecord mr = mock(MetricsRecord.class); |
| when(mr.name()).thenReturn(name); |
| when(mr.tags()).thenReturn(tags); |
| when(mr.metrics()).thenReturn(metrics); |
| return mr; |
| } |
| |
| private MetricsTag makeTag(String name, String value) { |
| return new MetricsTag(info(name, ""), value); |
| } |
| |
| private AbstractMetric makeMetric(String name, Number value) { |
| AbstractMetric metric = mock(AbstractMetric.class); |
| when(metric.name()).thenReturn(name); |
| when(metric.value()).thenReturn(value); |
| return metric; |
| } |
| } |