1
+ import Scheduler .Schedule
2
+
1
3
import java .util .concurrent .Semaphore
2
4
import org .apache .pekko .actor .{Actor , ActorLogging , ActorRef , ActorSystem , Props }
3
5
import org .apache .pekko .pattern .ask
4
6
import org .apache .pekko .routing .RoundRobinPool
5
7
import org .apache .pekko .util .Timeout
6
8
import datadog .trace .api .Trace
7
- import datadog .trace .bootstrap .instrumentation .api .AgentTracer .{
8
- activateSpan ,
9
- setAsyncPropagationEnabled ,
10
- activeSpan ,
11
- startSpan
12
- }
9
+ import datadog .trace .bootstrap .instrumentation .api .AgentTracer .{activateSpan , activeSpan , setAsyncPropagationEnabled , startSpan }
13
10
14
11
import scala .concurrent .duration ._
15
12
@@ -21,6 +18,9 @@ class PekkoActors extends AutoCloseable {
21
18
system.actorOf(Forwarder .props(receiver), " forwarder" )
22
19
val router : ActorRef =
23
20
system.actorOf(RoundRobinPool (5 ).props(Props [Receiver ]()), " router" )
21
+ val scheduler : ActorRef =
22
+ system.actorOf(Scheduler .props, " scheduler" )
23
+
24
24
val tellGreeter : ActorRef =
25
25
system.actorOf(Greeter .props(" Howdy" , receiver), " tell-greeter" )
26
26
val askGreeter : ActorRef =
@@ -72,6 +72,15 @@ class PekkoActors extends AutoCloseable {
72
72
tellGreeter ! WhoToGreet (who)
73
73
tellGreeter ! Leak (leak)
74
74
}
75
+
76
+ @ Trace
77
+ def schedule (): Semaphore = {
78
+ val barrier = new Semaphore (0 )
79
+ setAsyncPropagationEnabled(true )
80
+ activeSpan().setSpanName(" schedulerSpan" )
81
+ scheduler ! Schedule (barrier)
82
+ barrier
83
+ }
75
84
}
76
85
77
86
object PekkoActors {
@@ -162,3 +171,28 @@ class Forwarder(receiverActor: ActorRef) extends Actor with ActorLogging {
162
171
}
163
172
}
164
173
}
174
+
175
+ object Scheduler {
176
+ def props : Props = Props [Scheduler ]
177
+
178
+ final case class Schedule (barrier : Semaphore )
179
+ final case class Execute (barrier : Semaphore )
180
+ }
181
+
182
+ class Scheduler extends Actor with ActorLogging {
183
+ import Scheduler ._
184
+ import context .dispatcher
185
+
186
+ def receive = {
187
+ case Schedule (barrier) =>
188
+ context.system.scheduler.scheduleOnce(1 .second, self, Execute (barrier))
189
+ case Execute (barrier) =>
190
+ tracedChild(barrier)
191
+ }
192
+
193
+ @ Trace
194
+ def tracedChild (barrier : Semaphore ): Unit = {
195
+ activeSpan().setSpanName(" scheduledOperationSpan" )
196
+ barrier.release(1 )
197
+ }
198
+ }
0 commit comments