1313//===----------------------------------------------------------------------===//
1414
1515import ClusterMembership
16+ import struct Dispatch. DispatchTime
1617import enum Dispatch. DispatchTimeInterval
1718import Logging
1819import SWIM
@@ -30,6 +31,10 @@ internal struct SWIMActorShell {
3031 self . swim. settings
3132 }
3233
34+ var metrics : SWIM . Metrics {
35+ self . swim. metrics
36+ }
37+
3338 internal init ( _ swim: SWIM . Instance , clusterRef: ClusterShell . Ref ) {
3439 self . swim = swim
3540 self . clusterRef = clusterRef
@@ -41,14 +46,8 @@ internal struct SWIMActorShell {
4146 /// Initial behavior, kicks off timers and becomes `ready`.
4247 static func behavior( settings: SWIM . Settings , clusterRef: ClusterShell . Ref ) -> Behavior < SWIM . Message > {
4348 . setup { context in
44- // A bit weird dance, but this way we make the instance use the actor's logger;
45- // This is always what we want inside an actor system anyway;
46- // And at the same time we do use the configured log level for the entire actor: instance and shell
47- var settings = settings
48- context. log. logLevel = settings. logger. logLevel
49- settings. logger = context. log
5049 let swim = SWIM . Instance (
51- settings: settings,
50+ settings: Self . customizeSWIMSettings ( settings: settings , context : context ) ,
5251 myself: context. myself
5352 )
5453 let shell = SWIMActorShell ( swim, clusterRef: clusterRef)
@@ -58,6 +57,18 @@ internal struct SWIMActorShell {
5857 }
5958 }
6059
60+ /// Applies some default changes to the SWIM settings.
61+ private static func customizeSWIMSettings( settings: SWIM . Settings , context: ActorContext < SWIM . Message > ) -> SWIM . Settings {
62+ // A bit weird dance, but this way we make the instance use the actor's logger;
63+ // This is always what we want inside an actor system anyway;
64+ // And at the same time we do use the configured log level for the entire actor: instance and shell
65+ var settings = settings
66+ context. log. logLevel = settings. logger. logLevel
67+ settings. logger = context. log
68+ settings. metrics. systemName = context. system. settings. metrics. systemName
69+ return settings
70+ }
71+
6172 static func ready( shell: SWIMActorShell ) -> Behavior < SWIM . Message > {
6273 . receive { context, wrappedMessage in
6374 switch wrappedMessage {
@@ -115,6 +126,8 @@ internal struct SWIMActorShell {
115126 // MARK: Receiving messages
116127
117128 func receiveRemoteMessage( message: SWIM . RemoteMessage , context: MyselfContext ) {
129+ self . metrics. shell. messageInboundCount. increment ( )
130+
118131 switch message {
119132 case . ping( let replyTo, let payload, let sequenceNumber) :
120133 self . handlePing ( context: context, replyTo: replyTo, payload: payload, sequenceNumber: sequenceNumber)
@@ -221,9 +234,12 @@ internal struct SWIMActorShell {
221234 " swim/timeout " : " \( timeout) " ,
222235 ] ) )
223236
237+ let pingSentAt = DispatchTime . now ( )
238+ self . metrics. shell. messageOutboundCount. increment ( )
224239 target. ping ( payload: payload, timeout: timeout, sequenceNumber: sequenceNumber, context: context) { result in
225240 switch result {
226241 case . success( let pingResponse) :
242+ self . metrics. shell. pingResponseTime. recordInterval ( since: pingSentAt)
227243 self . handlePingResponse (
228244 response: pingResponse,
229245 pingRequestOrigin: pingRequestOrigin,
@@ -259,21 +275,34 @@ internal struct SWIMActorShell {
259275 let firstSuccessful = eventLoop. makePromise ( of: SWIM . PingResponse. self)
260276 let pingTimeout = directive. timeout
261277 let peerToPing = directive. target
278+
279+ let startedSendingPingRequestsSentAt : DispatchTime = . now( )
280+ let pingRequestResponseTimeFirstTimer = self . swim. metrics. shell. pingRequestResponseTimeFirst
281+ firstSuccessful. futureResult. whenComplete { result in
282+ switch result {
283+ case . success: pingRequestResponseTimeFirstTimer. recordInterval ( since: startedSendingPingRequestsSentAt)
284+ case . failure: ( )
285+ }
286+ }
287+
262288 for pingRequest in directive. requestDetails {
263289 let peerToPingRequestThrough = pingRequest. peerToPingRequestThrough
264290 let payload = pingRequest. payload
265291 let sequenceNumber = pingRequest. sequenceNumber
266292
267293 context. log. trace ( " Sending ping request for [ \( peerToPing) ] to [ \( peerToPingRequestThrough) ] with payload: \( payload) " )
268294
269- // self.tracelog(.send(to: peerToPingRequestThrough), message: "pingRequest(target: \(nodeToPing), replyTo: \(self.peer), payload: \(payload), sequenceNumber: \(sequenceNumber))" )
295+ let pingRequestSentAt : DispatchTime = . now ( )
270296 let eachReplyPromise = eventLoop. makePromise ( of: SWIM . PingResponse. self)
271- peerToPingRequestThrough. pingRequest ( target: peerToPing, payload: payload, from: context. myself, timeout: pingTimeout, sequenceNumber: sequenceNumber) { result in
297+
298+ self . metrics. shell. messageOutboundCount. increment ( )
299+ peerToPingRequestThrough. pingRequest ( target: peerToPing, payload: payload, timeout: pingTimeout, sequenceNumber: sequenceNumber, context: context) { result in
272300 eachReplyPromise. completeWith ( result)
273301 }
274302 context. onResultAsync ( of: eachReplyPromise. futureResult, timeout: . effectivelyInfinite) { result in
275303 switch result {
276304 case . success( let response) :
305+ self . metrics. shell. pingRequestResponseTimeAll. recordInterval ( since: pingRequestSentAt)
277306 self . handleEveryPingRequestResponse ( response: response, pinged: peerToPing, context: context)
278307 if case . ack = response {
279308 // We only cascade successful ping responses (i.e. `ack`s);
@@ -517,6 +546,12 @@ extension SWIMActorShell {
517546 static let name : String = " swim "
518547 static let naming : ActorNaming = . unique( SWIMActorShell . name)
519548
549+ static var props : Props {
550+ Props
551+ . _wellKnown
552+ . metrics ( group: " swim.shell " , measure: [ . serialization, . deserialization] )
553+ }
554+
520555 static let protocolPeriodTimerKey = TimerKey ( " \( SWIMActorShell . name) /periodic-ping " )
521556}
522557
0 commit comments