Skip to content

Commit 633cf5b

Browse files
Bryce Andersonjenkins
Bryce Anderson
authored and
jenkins
committed
finagle-core: Move SourceRole subtypes into its object
Problem We have about a million things named `Client` or `Server` and that now includes the subtypes of `SourceRole`. This can make things really difficult to navigate. Solution Move the subtypes to the object of `SourceRole` to make the relationship more clear. Differential Revision: https://phabricator.twitter.biz/D909744
1 parent d96155a commit 633cf5b

File tree

5 files changed

+47
-26
lines changed

5 files changed

+47
-26
lines changed

CHANGELOG.rst

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ Note that ``PHAB_ID=#`` and ``RB_ID=#`` correspond to associated messages in com
77
Unreleased
88
----------
99

10+
Breaking API Changes
11+
~~~~~~~~~~~~~~~~~~~~
12+
13+
* util-stats: SourceRole subtypes have been moved into the SourceRole object to make their
14+
relationship to the parent type more clear. ``PHAB_ID=D909744``
15+
1016
Runtime Behavior Changes
1117
~~~~~~~~~~~~~~~~~~~~~~~~
1218

util-stats/src/main/scala/com/twitter/finagle/stats/MetricBuilder.scala

+17-6
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,28 @@ import scala.annotation.varargs
1616
* request to another service). In many cases, there is no relevant role for a metric, in which
1717
* case NoRole should be used.
1818
*/
19-
sealed trait SourceRole {
19+
sealed abstract class SourceRole private () {
2020

2121
/**
2222
* Java-friendly helper for accessing the object itself.
2323
*/
2424
def getInstance(): SourceRole = this
2525
}
26-
case object NoRoleSpecified extends SourceRole
27-
case object Client extends SourceRole
28-
case object Server extends SourceRole
26+
27+
object SourceRole {
28+
case object NoRoleSpecified extends SourceRole
29+
case object Client extends SourceRole
30+
case object Server extends SourceRole
31+
32+
/**
33+
* Java-friendly accessors
34+
*/
35+
def noRoleSpecified(): SourceRole = NoRoleSpecified
36+
37+
def client(): SourceRole = Client
38+
39+
def server(): SourceRole = Server
40+
}
2941

3042
/**
3143
* finagle-stats has configurable scope separators. As this package is wrapped by finagle-stats, we
@@ -66,7 +78,7 @@ object MetricBuilder {
6678
keyIndicator: Boolean = false,
6779
description: String = "No description provided",
6880
units: MetricUnit = Unspecified,
69-
role: SourceRole = NoRoleSpecified,
81+
role: SourceRole = SourceRole.NoRoleSpecified,
7082
verbosity: Verbosity = Verbosity.Default,
7183
sourceClass: Option[String] = None,
7284
name: Seq[String] = Seq.empty,
@@ -102,7 +114,6 @@ object MetricBuilder {
102114
* than being forced to use the mega apply method.
103115
*
104116
* @param metricType the type of the metric being constructed.
105-
* @param statsReceiver used for the actual metric creation, set by the StatsReceiver when creating a MetricBuilder.
106117
*/
107118
def newBuilder(metricType: MetricType): MetricBuilder =
108119
apply(metricType = metricType)

util-stats/src/test/java/com/twitter/compiletest/MetricBuilderCompilationTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import com.twitter.finagle.stats.MetricBuilder;
99
import com.twitter.finagle.stats.MetricTypes;
1010
import com.twitter.finagle.stats.Microseconds;
11-
import com.twitter.finagle.stats.NoRoleSpecified;
11+
import com.twitter.finagle.stats.SourceRole;
1212
import com.twitter.finagle.stats.StatsReceiver;
1313
import com.twitter.finagle.stats.Verbosity;
1414

@@ -37,7 +37,7 @@ public void testWithMethods() {
3737
.withSourceClass(new Some<>("com.twitter.finagle.AwesomeClass"))
3838
.withIdentifier(new Some<>("/p/foo/bar"))
3939
.withUnits(Microseconds.getInstance())
40-
.withRole(NoRoleSpecified.getInstance())
40+
.withRole(SourceRole.noRoleSpecified())
4141
.withName("my", "very", "cool", "name")
4242
.withRelativeName("cool", "name")
4343
.withPercentiles(0.99, 0.88, 0.77);

util-stats/src/test/scala/com/twitter/finagle/stats/RoleConfiguredStatsReceiverTest.scala

+12-12
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,30 @@ import org.scalatest.funsuite.AnyFunSuite
55
class RoleConfiguredStatsReceiverTest extends AnyFunSuite {
66
test("RoleConfiguredSR configures metadata role correctly") {
77
val mem = new InMemoryStatsReceiver
8-
val clientSR = new RoleConfiguredStatsReceiver(mem, Client)
9-
val serverSR = new RoleConfiguredStatsReceiver(mem, Server)
8+
val clientSR = new RoleConfiguredStatsReceiver(mem, SourceRole.Client)
9+
val serverSR = new RoleConfiguredStatsReceiver(mem, SourceRole.Server)
1010

1111
clientSR.counter("foo")
12-
assert(mem.schemas.get(Seq("foo")).get.role == Client)
12+
assert(mem.schemas.get(Seq("foo")).get.role == SourceRole.Client)
1313
clientSR.addGauge("bar")(3)
14-
assert(mem.schemas.get(Seq("bar")).get.role == Client)
14+
assert(mem.schemas.get(Seq("bar")).get.role == SourceRole.Client)
1515
clientSR.stat("baz")
16-
assert(mem.schemas.get(Seq("baz")).get.role == Client)
16+
assert(mem.schemas.get(Seq("baz")).get.role == SourceRole.Client)
1717

1818
serverSR.counter("fee")
19-
assert(mem.schemas.get(Seq("fee")).get.role == Server)
19+
assert(mem.schemas.get(Seq("fee")).get.role == SourceRole.Server)
2020
serverSR.addGauge("fi")(3)
21-
assert(mem.schemas.get(Seq("fi")).get.role == Server)
21+
assert(mem.schemas.get(Seq("fi")).get.role == SourceRole.Server)
2222
serverSR.stat("foe")
23-
assert(mem.schemas.get(Seq("foe")).get.role == Server)
23+
assert(mem.schemas.get(Seq("foe")).get.role == SourceRole.Server)
2424
}
2525

2626
test("RoleConfiguredSR equality") {
2727
val mem = new InMemoryStatsReceiver
28-
val clientA = RoleConfiguredStatsReceiver(mem, Client)
29-
val clientB = RoleConfiguredStatsReceiver(mem, Client)
30-
val serverA = RoleConfiguredStatsReceiver(mem, Server)
31-
val serverB = RoleConfiguredStatsReceiver(mem, Server)
28+
val clientA = RoleConfiguredStatsReceiver(mem, SourceRole.Client)
29+
val clientB = RoleConfiguredStatsReceiver(mem, SourceRole.Client)
30+
val serverA = RoleConfiguredStatsReceiver(mem, SourceRole.Server)
31+
val serverB = RoleConfiguredStatsReceiver(mem, SourceRole.Server)
3232

3333
assert(clientA == clientB)
3434
assert(clientA != serverA)

util-stats/src/test/scala/com/twitter/finagle/stats/exp/ExpressionSchemaTest.scala

+10-6
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import org.scalatest.funsuite.AnyFunSuite
1414
class ExpressionSchemaTest extends AnyFunSuite {
1515
trait Ctx {
1616
val sr = new InMemoryStatsReceiver
17-
val clientSR = RoleConfiguredStatsReceiver(sr, Client, Some("downstream"))
17+
val clientSR = RoleConfiguredStatsReceiver(sr, SourceRole.Client, Some("downstream"))
1818

1919
val successMb =
2020
MetricBuilder(name = Seq("success"), metricType = CounterType)
@@ -32,7 +32,9 @@ class ExpressionSchemaTest extends AnyFunSuite {
3232
}
3333

3434
val downstreamLabel =
35-
Map(ExpressionSchema.Role -> Client.toString, ExpressionSchema.ServiceName -> "downstream")
35+
Map(
36+
ExpressionSchema.Role -> SourceRole.Client.toString,
37+
ExpressionSchema.ServiceName -> "downstream")
3638

3739
protected[this] def nameToKey(
3840
name: String,
@@ -88,7 +90,8 @@ class ExpressionSchemaTest extends AnyFunSuite {
8890
assert(sr.stats(Seq("latency")) == Seq(50, 50))
8991

9092
assert(
91-
sr.expressions(nameToKey("success_rate")).labels(ExpressionSchema.Role) == Client.toString)
93+
sr.expressions(nameToKey("success_rate")).labels(
94+
ExpressionSchema.Role) == SourceRole.Client.toString)
9295
}
9396
}
9497

@@ -179,7 +182,7 @@ class ExpressionSchemaTest extends AnyFunSuite {
179182
Expression(Seq("clnt", "aclient", "success"), isCounter = true).divide(
180183
Expression(Seq("clnt", "aclient", "success"), isCounter = true).plus(
181184
Expression(Seq("clnt", "aclient", "failures"), isCounter = true))))
182-
).withRole(Client).withServiceName("aclient"))
185+
).withRole(SourceRole.Client).withServiceName("aclient"))
183186

184187
assert(sr.expressions.values.size == 1)
185188
assert(
@@ -203,7 +206,7 @@ class ExpressionSchemaTest extends AnyFunSuite {
203206
.counter(sr, Seq("clnt", "aclient", "success")).get.divide(Expression
204207
.counter(sr, Seq("clnt", "aclient", "success")).get.plus(
205208
Expression.counter(sr, Seq("clnt", "aclient", "failures"), showRollup = true).get)))
206-
).withRole(Client).withServiceName("aclient"))
209+
).withRole(SourceRole.Client).withServiceName("aclient"))
207210

208211
assert(sr.expressions.values.size == 1)
209212
assert(
@@ -222,7 +225,8 @@ class ExpressionSchemaTest extends AnyFunSuite {
222225
Expression.stats(sr, Seq("clnt", "aclient", "latencies"))
223226
expressions.map { expression =>
224227
sr.registerExpression(
225-
ExpressionSchema("latencies", expression).withRole(Client).withServiceName("aclient"))
228+
ExpressionSchema("latencies", expression)
229+
.withRole(SourceRole.Client).withServiceName("aclient"))
226230
}
227231

228232
assert(sr.expressions.values.size == expressions.size)

0 commit comments

Comments
 (0)