Skip to content

Commit b07771a

Browse files
authored
log send time in verbose heartbeat messages #6496. (#6548)
1 parent 0f701e9 commit b07771a

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

src/core/Akka.Cluster.Tests/ClusterHeartbeatReceiverSpec.cs

+22-1
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@ public ClusterHeartbeatReceiverLegacySpec(ITestOutputHelper output) : base(outpu
3232
public abstract class ClusterHeartbeatReceiverBase : AkkaSpec
3333
{
3434
private static Config Config(bool useLegacyHeartbeat) => $@"
35+
akka.loglevel=DEBUG
36+
akka.cluster.debug.verbose-heartbeat-logging = on
3537
akka.actor.provider = cluster
3638
akka.cluster.use-legacy-heartbeat-message = {(useLegacyHeartbeat ? "true" : "false")}
3739
";
38-
40+
3941
protected ClusterHeartbeatReceiverBase(ITestOutputHelper output, bool useLegacyHeartbeat)
4042
: base(Config(useLegacyHeartbeat), output)
4143
{
@@ -49,5 +51,24 @@ public async Task ClusterHeartbeatReceiver_should_respond_to_heartbeats_with_sam
4951
heartbeater.Tell(new Heartbeat(Cluster.Get(Sys).SelfAddress, 1, 2));
5052
await ExpectMsgAsync<HeartbeatRsp>(new HeartbeatRsp(Cluster.Get(Sys).SelfUniqueAddress, 1, 2));
5153
}
54+
55+
[Fact]
56+
public async Task ClusterHeartbeatReceiver_should_write_correct_debug_messages_on_heartbeat()
57+
{
58+
var heartbeater = Sys.ActorOf(ClusterHeartbeatReceiver.Props(Cluster.Get(Sys)));
59+
60+
EventFilter.Debug(contains: "- Sequence number [2]")
61+
.ExpectOne(() => heartbeater.Tell(new Heartbeat(Cluster.Get(Sys).SelfAddress, 2, 3)));
62+
}
63+
64+
[Fact]
65+
public async Task ClusterHeartbeatSender_should_write_correct_debug_messages_on_heartbeat_rsp()
66+
{
67+
var heartbeater = Sys.ActorOf(Props.Create(() => new ClusterHeartbeatSender(Cluster.Get(Sys))));
68+
heartbeater.Tell(new ClusterEvent.CurrentClusterState());
69+
70+
EventFilter.Debug(contains: "- Sequence number [2] - Creation time [3]")
71+
.ExpectOne(() => heartbeater.Tell(new HeartbeatRsp(Cluster.Get(Sys).SelfUniqueAddress, 2, 3)));
72+
}
5273
}
5374
}

src/core/Akka.Cluster/ClusterHeartbeat.cs

+7-8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System;
99
using System.Collections.Generic;
1010
using System.Collections.Immutable;
11+
using System.Globalization;
1112
using System.Linq;
1213
using Akka.Actor;
1314
using Akka.Event;
@@ -43,8 +44,7 @@ protected override void OnReceive(object message)
4344
switch (message)
4445
{
4546
case ClusterHeartbeatSender.Heartbeat hb:
46-
// TODO log the sequence nr once serializer is enabled
47-
if(VerboseHeartbeat) _cluster.CurrentInfoLogger.LogDebug("Heartbeat from [{0}]", hb.From);
47+
if (VerboseHeartbeat) _cluster.CurrentInfoLogger.LogDebug($"Heartbeat from [{hb.From}] - Sequence number [{hb.SequenceNr.ToString(CultureInfo.InvariantCulture)}]");
4848
Sender.Tell(new ClusterHeartbeatSender.HeartbeatRsp(_cluster.SelfUniqueAddress,
4949
hb.SequenceNr, hb.CreationTimeNanos));
5050
break;
@@ -58,7 +58,6 @@ public static Props Props(Cluster getCluster)
5858
{
5959
return Akka.Actor.Props.Create(() => new ClusterHeartbeatReceiver(getCluster));
6060
}
61-
6261
}
6362

6463
/// <summary>
@@ -248,7 +247,8 @@ private void CheckTickInterval()
248247
"Previous heartbeat was sent [{1}] ms ago, expected interval is [{2}] ms. This may cause failure detection " +
249248
"to mark members as unreachable. The reason can be thread starvation, e.g. by running blocking tasks on the " +
250249
"default dispatcher, CPU overload, or GC.",
251-
_cluster.SelfAddress, (now - _tickTimestamp).TotalMilliseconds, _cluster.Settings.HeartbeatInterval.TotalMilliseconds);
250+
_cluster.SelfAddress, (now - _tickTimestamp).TotalMilliseconds.ToString(CultureInfo.InvariantCulture),
251+
_cluster.Settings.HeartbeatInterval.TotalMilliseconds.ToString(CultureInfo.InvariantCulture));
252252
}
253253

254254
_tickTimestamp = DateTime.UtcNow;
@@ -258,8 +258,8 @@ private void DoHeartbeatRsp(HeartbeatRsp rsp)
258258
{
259259
if (_cluster.Settings.VerboseHeartbeatLogging)
260260
{
261-
// TODO: log response time and validate sequence nrs once serialisation of sendTime is released
262-
_log.Debug("Cluster Node [{0}] - Heartbeat response from [{1}]", _cluster.SelfAddress, rsp.From.Address);
261+
_log.Debug("Cluster Node [{0}] - Heartbeat response from [{1}] - Sequence number [{2}] - Creation time [{3}]", _cluster.SelfAddress, rsp.From.Address,
262+
rsp.SequenceNr.ToString(CultureInfo.InvariantCulture), rsp.CreationTimeNanos.ToString(CultureInfo.InvariantCulture));
263263
}
264264
_state = _state.HeartbeatRsp(rsp.From);
265265
}
@@ -768,5 +768,4 @@ public int Compare(UniqueAddress x, UniqueAddress y)
768768
}
769769
#endregion
770770
}
771-
}
772-
771+
}

0 commit comments

Comments
 (0)