Skip to content

Commit 7df37e8

Browse files
committed
Adding TestScope interface and factory method
1 parent 66fdfe0 commit 7df37e8

4 files changed

Lines changed: 128 additions & 2 deletions

File tree

core/src/main/java/com/uber/m3/tally/ScopeImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
/**
3333
* Default {@link Scope} implementation.
3434
*/
35-
class ScopeImpl implements Scope {
35+
class ScopeImpl implements Scope, TestScope {
3636
private StatsReporter reporter;
3737
private String prefix;
3838
private String separator;
@@ -244,6 +244,7 @@ String fullyQualifiedName(String name) {
244244
* Returns a {@link Snapshot} of this {@link Scope}.
245245
* @return a {@link Snapshot} of this {@link Scope}
246246
*/
247+
@Override
247248
public Snapshot snapshot() {
248249
Snapshot snap = new SnapshotImpl();
249250

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Copyright (c) 2020 Uber Technologies, Inc.
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a copy
4+
// of this software and associated documentation files (the "Software"), to deal
5+
// in the Software without restriction, including without limitation the rights
6+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7+
// copies of the Software, and to permit persons to whom the Software is
8+
// furnished to do so, subject to the following conditions:
9+
//
10+
// The above copyright notice and this permission notice shall be included in
11+
// all copies or substantial portions of the Software.
12+
//
13+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19+
// THE SOFTWARE.
20+
21+
package com.uber.m3.tally;
22+
23+
import com.uber.m3.util.Duration;
24+
25+
import java.util.Map;
26+
27+
/**
28+
* TestScope is a metrics collector that has no reporting, ensuring that
29+
* all emitted values have a given prefix or set of tags.
30+
*/
31+
interface TestScope extends Scope {
32+
33+
/**
34+
* Creates a new TestScope that adds the ability to take snapshots of
35+
* metrics emitted to it.
36+
*/
37+
static TestScope create() {
38+
return (TestScope) new RootScopeBuilder()
39+
.reporter(new NullStatsReporter())
40+
.reportEvery(Duration.ZERO);
41+
}
42+
43+
/**
44+
* Creates a new TestScope with given prefix/tags that adds the ability to
45+
* take snapshots of metrics emitted to it.
46+
*/
47+
static TestScope create(String prefix, Map<String, String> tags) {
48+
return (TestScope) new RootScopeBuilder()
49+
.prefix(prefix)
50+
.tags(tags)
51+
.reporter(new NullStatsReporter())
52+
.reportEvery(Duration.ZERO);
53+
}
54+
55+
/**
56+
* Snapshot returns a copy of all values since the last report execution
57+
* This is an expensive operation and should only be used for testing purposes.
58+
*/
59+
Snapshot snapshot();
60+
}

core/src/test/java/com/uber/m3/tally/ScopeImplTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ public void snapshot() {
217217
System.err.println("Interrupted while sleeping! Let's continue anyway...");
218218
}
219219

220-
Snapshot snapshot = ((ScopeImpl) rootScope).snapshot();
220+
Snapshot snapshot = ((TestScope) rootScope).snapshot();
221221

222222
Map<String, CounterSnapshot> counters = snapshot.counters();
223223
assertEquals(1, counters.size());
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright (c) 2020 Uber Technologies, Inc.
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a copy
4+
// of this software and associated documentation files (the "Software"), to deal
5+
// in the Software without restriction, including without limitation the rights
6+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7+
// copies of the Software, and to permit persons to whom the Software is
8+
// furnished to do so, subject to the following conditions:
9+
//
10+
// The above copyright notice and this permission notice shall be included in
11+
// all copies or substantial portions of the Software.
12+
//
13+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19+
// THE SOFTWARE.
20+
21+
package com.uber.m3.tally;
22+
23+
import com.uber.m3.util.ImmutableMap;
24+
import org.junit.Test;
25+
26+
import java.util.Map;
27+
28+
import static org.hamcrest.CoreMatchers.instanceOf;
29+
import static org.junit.Assert.assertEquals;
30+
import static org.junit.Assert.assertFalse;
31+
import static org.junit.Assert.assertNotNull;
32+
import static org.junit.Assert.assertThat;
33+
34+
public class TestScopeTest {
35+
36+
@Test
37+
public void getInstance() {
38+
TestScope testScope = TestScope.create();
39+
assertNotNull(testScope);
40+
assertThat(testScope, instanceOf(Scope.class));
41+
assertThat(testScope, instanceOf(ScopeImpl.class));
42+
43+
assertNotNull(testScope.capabilities());
44+
assertFalse(testScope.capabilities().reporting());
45+
assertFalse(testScope.capabilities().tagging());
46+
}
47+
48+
@Test
49+
public void prefixTags() {
50+
Map<String, String> tags = ImmutableMap.of("key", "value");
51+
TestScope testScope = TestScope.create("prefix", tags);
52+
testScope.counter("counter").inc(1);
53+
54+
Snapshot snapshot = testScope.snapshot();
55+
assertNotNull(snapshot);
56+
57+
Map<String, CounterSnapshot> counters = snapshot.counters();
58+
assertNotNull(counters);
59+
assertEquals(1, counters.size());
60+
assertNotNull(counters.get("prefix.counter+key=value"));
61+
assertEquals("prefix.counter", counters.get("prefix.counter+key=value").name());
62+
assertEquals(tags, counters.get("prefix.counter+key=value").tags());
63+
assertEquals(1, counters.get("prefix.counter+key=value").value());
64+
}
65+
}

0 commit comments

Comments
 (0)