@@ -2,8 +2,14 @@ package com.twitter.finagle.filter
2
2
3
3
import com .twitter .finagle .Service
4
4
import com .twitter .finagle .stats .InMemoryStatsReceiver
5
- import com .twitter .util .{Stopwatch , Time , Future }
5
+ import com .twitter .util .Future
6
+ import com .twitter .util .Stopwatch
7
+ import com .twitter .util .Time
6
8
import com .twitter .conversions .DurationOps ._
9
+ import com .twitter .finagle .context
10
+ import com .twitter .finagle .context .BackupRequest
11
+ import com .twitter .finagle .context .Contexts
12
+ import com .twitter .finagle .context .RetryContext
7
13
import org .scalatest .funsuite .AnyFunSuite
8
14
9
15
class ServerStatsFilterTest extends AnyFunSuite {
@@ -21,4 +27,104 @@ class ServerStatsFilterTest extends AnyFunSuite {
21
27
assert(actual == expected)
22
28
}
23
29
}
30
+
31
+ test(" Record retry stat when request is retry" ) {
32
+ val stats = new InMemoryStatsReceiver
33
+ val svc = Service .mk[Unit , Unit ] { _ =>
34
+ Future .Done
35
+ }
36
+ val filter = new ServerStatsFilter [Unit , Unit ](stats)
37
+ filter.andThen(svc)(())
38
+
39
+ assert(stats.counters(Seq (" request_classification" , " retry" )) == 0 )
40
+ assert(stats.counters(Seq (" request_classification" , " requeue" )) == 0 )
41
+ assert(stats.counters(Seq (" request_classification" , " backup" )) == 0 )
42
+
43
+ RetryContext .withRetry {
44
+ filter.andThen(svc)(())
45
+ }
46
+
47
+ assert(stats.counters(Seq (" request_classification" , " retry" )) == 1 )
48
+ assert(stats.counters(Seq (" request_classification" , " requeue" )) == 0 )
49
+ assert(stats.counters(Seq (" request_classification" , " backup" )) == 0 )
50
+ assert(stats.counters(Seq (" request_classification" , " total" )) == 2 )
51
+ }
52
+
53
+ test(" Record requeue stat when request is requeue" ) {
54
+ val stats = new InMemoryStatsReceiver
55
+ val svc = Service .mk[Unit , Unit ] { _ =>
56
+ Future .Done
57
+ }
58
+ val filter = new ServerStatsFilter [Unit , Unit ](stats)
59
+ filter.andThen(svc)(())
60
+
61
+ assert(stats.counters(Seq (" request_classification" , " retry" )) == 0 )
62
+ assert(stats.counters(Seq (" request_classification" , " requeue" )) == 0 )
63
+ assert(stats.counters(Seq (" request_classification" , " backup" )) == 0 )
64
+
65
+ Contexts .broadcast.let(context.Requeues , context.Requeues (0 )) {
66
+ filter.andThen(svc)(())
67
+ }
68
+
69
+ assert(stats.counters(Seq (" request_classification" , " retry" )) == 0 )
70
+ assert(stats.counters(Seq (" request_classification" , " requeue" )) == 0 )
71
+ assert(stats.counters(Seq (" request_classification" , " backup" )) == 0 )
72
+
73
+ Contexts .broadcast.let(context.Requeues , context.Requeues (2 )) {
74
+ filter.andThen(svc)(())
75
+ }
76
+
77
+ assert(stats.counters(Seq (" request_classification" , " retry" )) == 0 )
78
+ assert(stats.counters(Seq (" request_classification" , " requeue" )) == 1 )
79
+ assert(stats.counters(Seq (" request_classification" , " backup" )) == 0 )
80
+ assert(stats.counters(Seq (" request_classification" , " total" )) == 3 )
81
+ }
82
+
83
+ test(" Record retry stat when request is backup" ) {
84
+ val stats = new InMemoryStatsReceiver
85
+ val svc = Service .mk[Unit , Unit ] { _ =>
86
+ Future .Done
87
+ }
88
+ val filter = new ServerStatsFilter [Unit , Unit ](stats)
89
+ filter.andThen(svc)(())
90
+
91
+ assert(stats.counters(Seq (" request_classification" , " retry" )) == 0 )
92
+ assert(stats.counters(Seq (" request_classification" , " requeue" )) == 0 )
93
+ assert(stats.counters(Seq (" request_classification" , " backup" )) == 0 )
94
+
95
+ BackupRequest .let {
96
+ filter.andThen(svc)(())
97
+ }
98
+
99
+ assert(stats.counters(Seq (" request_classification" , " retry" )) == 0 )
100
+ assert(stats.counters(Seq (" request_classification" , " requeue" )) == 0 )
101
+ assert(stats.counters(Seq (" request_classification" , " backup" )) == 1 )
102
+ assert(stats.counters(Seq (" request_classification" , " total" )) == 2 )
103
+ }
104
+
105
+ test(" Record retry+requeue+backup stat when request is retry+requeue+backup" ) {
106
+ val stats = new InMemoryStatsReceiver
107
+ val svc = Service .mk[Unit , Unit ] { _ =>
108
+ Future .Done
109
+ }
110
+ val filter = new ServerStatsFilter [Unit , Unit ](stats)
111
+ filter.andThen(svc)(())
112
+
113
+ assert(stats.counters(Seq (" request_classification" , " retry" )) == 0 )
114
+ assert(stats.counters(Seq (" request_classification" , " requeue" )) == 0 )
115
+ assert(stats.counters(Seq (" request_classification" , " backup" )) == 0 )
116
+
117
+ Contexts .broadcast.let(context.Requeues , context.Requeues (1 )) {
118
+ BackupRequest .let {
119
+ RetryContext .withRetry {
120
+ filter.andThen(svc)(())
121
+ }
122
+ }
123
+ }
124
+
125
+ assert(stats.counters(Seq (" request_classification" , " retry" )) == 1 )
126
+ assert(stats.counters(Seq (" request_classification" , " requeue" )) == 1 )
127
+ assert(stats.counters(Seq (" request_classification" , " backup" )) == 1 )
128
+ assert(stats.counters(Seq (" request_classification" , " total" )) == 2 )
129
+ }
24
130
}
0 commit comments