Skip to content

Commit fb9ca81

Browse files
committed
Logging of UnhandledMessage (migrated from akka/akka#28414)
* make use of the existing logging of dead letter also for UnhandledMessage Supress ActorSelectionMessage with DeadLetterSuppression (migrated from akka/akka#28341) * for example the Cluster InitJoin message is marked with DeadLetterSuppression but was anyway logged because sent with actorSelection * for other WrappedMessage than ActorSelectionMessage we shouldn't unwrap and publish the inner in SuppressedDeadLetter because that might loose some information * therefore those are silenced in the DeadLetterListener instead Better deadLetter logging of wrapped messages (migrated from akka/akka#28253)
1 parent 545ce55 commit fb9ca81

File tree

15 files changed

+321
-226
lines changed

15 files changed

+321
-226
lines changed

src/contrib/cluster/Akka.Cluster.Sharding/ShardedDaemonProcess.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public MessageExtractor(int maxNumberOfShards)
7878
/// and have the message types themselves carry identifiers.
7979
/// </para>
8080
/// </summary>
81-
public sealed class ShardingEnvelope
81+
public sealed class ShardingEnvelope: IWrappedMessage
8282
{
8383
public string EntityId { get; }
8484
public object Message { get; }

src/contrib/cluster/Akka.Cluster.Tools/PublishSubscribe/DistributedMessages.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ public override string ToString()
353353
/// TBD
354354
/// </summary>
355355
[Serializable]
356-
public sealed class Publish : IDistributedPubSubMessage, IEquatable<Publish>
356+
public sealed class Publish : IDistributedPubSubMessage, IEquatable<Publish>, IWrappedMessage
357357
{
358358
/// <summary>
359359
/// TBD
@@ -420,7 +420,7 @@ public override string ToString()
420420
/// TBD
421421
/// </summary>
422422
[Serializable]
423-
public sealed class Send : IDistributedPubSubMessage, IEquatable<Send>
423+
public sealed class Send : IDistributedPubSubMessage, IEquatable<Send>, IWrappedMessage
424424
{
425425
/// <summary>
426426
/// TBD
@@ -487,7 +487,7 @@ public override string ToString()
487487
/// TBD
488488
/// </summary>
489489
[Serializable]
490-
public sealed class SendToAll : IDistributedPubSubMessage, IEquatable<SendToAll>
490+
public sealed class SendToAll : IDistributedPubSubMessage, IEquatable<SendToAll>, IWrappedMessage
491491
{
492492
/// <summary>
493493
/// TBD

src/core/Akka.API.Tests/CoreAPISpec.ApproveClusterSharding.approved.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ namespace Akka.Cluster.Sharding
252252
public Akka.Cluster.Sharding.ShardedDaemonProcessSettings WithRole(string role) { }
253253
public Akka.Cluster.Sharding.ShardedDaemonProcessSettings WithShardingSettings(Akka.Cluster.Sharding.ClusterShardingSettings shardingSettings) { }
254254
}
255-
public sealed class ShardingEnvelope
255+
public sealed class ShardingEnvelope : Akka.Actor.IWrappedMessage
256256
{
257257
public ShardingEnvelope(string entityId, object message) { }
258258
public string EntityId { get; }

src/core/Akka.API.Tests/CoreAPISpec.ApproveClusterTools.approved.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ namespace Akka.Cluster.Tools.PublishSubscribe
223223
public static Akka.Cluster.Tools.PublishSubscribe.GetTopics Instance { get; }
224224
}
225225
public interface IDistributedPubSubMessage { }
226-
public sealed class Publish : Akka.Cluster.Tools.PublishSubscribe.IDistributedPubSubMessage, System.IEquatable<Akka.Cluster.Tools.PublishSubscribe.Publish>
226+
public sealed class Publish : Akka.Actor.IWrappedMessage, Akka.Cluster.Tools.PublishSubscribe.IDistributedPubSubMessage, System.IEquatable<Akka.Cluster.Tools.PublishSubscribe.Publish>
227227
{
228228
public Publish(string topic, object message, bool sendOneMessageToEachGroup = False) { }
229229
public object Message { get; }
@@ -252,7 +252,7 @@ namespace Akka.Cluster.Tools.PublishSubscribe
252252
public override int GetHashCode() { }
253253
public override string ToString() { }
254254
}
255-
public sealed class Send : Akka.Cluster.Tools.PublishSubscribe.IDistributedPubSubMessage, System.IEquatable<Akka.Cluster.Tools.PublishSubscribe.Send>
255+
public sealed class Send : Akka.Actor.IWrappedMessage, Akka.Cluster.Tools.PublishSubscribe.IDistributedPubSubMessage, System.IEquatable<Akka.Cluster.Tools.PublishSubscribe.Send>
256256
{
257257
public Send(string path, object message, bool localAffinity = False) { }
258258
public bool LocalAffinity { get; }
@@ -263,7 +263,7 @@ namespace Akka.Cluster.Tools.PublishSubscribe
263263
public override int GetHashCode() { }
264264
public override string ToString() { }
265265
}
266-
public sealed class SendToAll : Akka.Cluster.Tools.PublishSubscribe.IDistributedPubSubMessage, System.IEquatable<Akka.Cluster.Tools.PublishSubscribe.SendToAll>
266+
public sealed class SendToAll : Akka.Actor.IWrappedMessage, Akka.Cluster.Tools.PublishSubscribe.IDistributedPubSubMessage, System.IEquatable<Akka.Cluster.Tools.PublishSubscribe.SendToAll>
267267
{
268268
public SendToAll(string path, object message, bool excludeSelf = False) { }
269269
public bool ExcludeSelf { get; }

src/core/Akka.API.Tests/CoreAPISpec.ApproveCore.approved.txt

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ namespace Akka.Actor
318318
public void Tell(object message, Akka.Actor.IActorRef sender = null) { }
319319
public override string ToString() { }
320320
}
321-
public class ActorSelectionMessage : Akka.Actor.IAutoReceivedMessage, Akka.Actor.IPossiblyHarmful
321+
public class ActorSelectionMessage : Akka.Actor.IAutoReceivedMessage, Akka.Actor.IPossiblyHarmful, Akka.Actor.IWrappedMessage
322322
{
323323
public ActorSelectionMessage(object message, Akka.Actor.SelectionPathElement[] elements, bool wildCardFanOut = False) { }
324324
public Akka.Actor.SelectionPathElement[] Elements { get; }
@@ -1133,6 +1133,10 @@ namespace Akka.Actor
11331133
Akka.Actor.ITimerScheduler Timers { get; set; }
11341134
}
11351135
public interface IWithUnboundedStash : Akka.Actor.IActorStash, Akka.Dispatch.IRequiresMessageQueue<Akka.Dispatch.IUnboundedDequeBasedMessageQueueSemantics> { }
1136+
public interface IWrappedMessage
1137+
{
1138+
object Message { get; }
1139+
}
11361140
public sealed class Identify : Akka.Actor.IAutoReceivedMessage, Akka.Actor.INotInfluenceReceiveTimeout
11371141
{
11381142
public Identify(object messageId) { }
@@ -1776,6 +1780,10 @@ namespace Akka.Actor
17761780
protected void RunTask(System.Func<System.Threading.Tasks.Task> action) { }
17771781
}
17781782
public delegate void UntypedReceive(object message);
1783+
public class static WrappedMessage
1784+
{
1785+
public static object Unwrap(object message) { }
1786+
}
17791787
}
17801788
namespace Akka.Actor.Dsl
17811789
{
@@ -2856,7 +2864,7 @@ namespace Akka.Event
28562864
{
28572865
protected ActorEventBus() { }
28582866
}
2859-
public abstract class AllDeadLetters
2867+
public abstract class AllDeadLetters : Akka.Actor.IWrappedMessage
28602868
{
28612869
protected AllDeadLetters(object message, Akka.Actor.IActorRef sender, Akka.Actor.IActorRef recipient) { }
28622870
public object Message { get; }
@@ -2910,6 +2918,12 @@ namespace Akka.Event
29102918
protected virtual void Print(Akka.Event.LogEvent logEvent) { }
29112919
protected override bool Receive(object message) { }
29122920
}
2921+
public sealed class Dropped : Akka.Event.AllDeadLetters
2922+
{
2923+
public Dropped(object message, string reason, Akka.Actor.IActorRef sender, Akka.Actor.IActorRef recipient) { }
2924+
public Dropped(object message, string reason, Akka.Actor.IActorRef recipient) { }
2925+
public string Reason { get; }
2926+
}
29132927
public class DummyClassForStringSources
29142928
{
29152929
public DummyClassForStringSources() { }
@@ -3132,12 +3146,9 @@ namespace Akka.Event
31323146
public TraceLogger() { }
31333147
protected override void OnReceive(object message) { }
31343148
}
3135-
public sealed class UnhandledMessage
3149+
public sealed class UnhandledMessage : Akka.Event.AllDeadLetters, Akka.Actor.IWrappedMessage
31363150
{
31373151
public UnhandledMessage(object message, Akka.Actor.IActorRef sender, Akka.Actor.IActorRef recipient) { }
3138-
public object Message { get; }
3139-
public Akka.Actor.IActorRef Recipient { get; }
3140-
public Akka.Actor.IActorRef Sender { get; }
31413152
}
31423153
public class Warning : Akka.Event.LogEvent
31433154
{
@@ -4065,7 +4076,7 @@ namespace Akka.Routing
40654076
public Akka.Util.ISurrogated FromSurrogate(Akka.Actor.ActorSystem system) { }
40664077
}
40674078
}
4068-
public sealed class ConsistentHashableEnvelope : Akka.Routing.RouterEnvelope, Akka.Routing.IConsistentHashable
4079+
public sealed class ConsistentHashableEnvelope : Akka.Routing.RouterEnvelope, Akka.Actor.IWrappedMessage, Akka.Routing.IConsistentHashable
40694080
{
40704081
public ConsistentHashableEnvelope(object message, object hashKey) { }
40714082
public object ConsistentHashKey { get; }

src/core/Akka.Tests/Actor/DeadLetterSuspensionSpec.cs

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,54 @@
88
using System.Threading;
99
using Akka.Actor;
1010
using Akka.Configuration;
11+
using Akka.Event;
1112
using Akka.TestKit;
1213
using Xunit;
1314

1415
namespace Akka.Tests.Actor
1516
{
1617
public class DeadLetterSuspensionSpec : AkkaSpec
1718
{
19+
private class Dropping : ActorBase
20+
{
21+
public static Props Props() => Akka.Actor.Props.Create(() => new Dropping());
22+
23+
protected override bool Receive(object message)
24+
{
25+
switch (message)
26+
{
27+
case int n:
28+
Context.System.EventStream.Publish(new Dropped(n, "Don't like numbers", Self));
29+
return true;
30+
}
31+
return false;
32+
}
33+
}
34+
35+
private class Unandled : ActorBase
36+
{
37+
public static Props Props() => Akka.Actor.Props.Create(() => new Unandled());
38+
39+
protected override bool Receive(object message)
40+
{
41+
switch (message)
42+
{
43+
case int n:
44+
Unhandled(n);
45+
return true;
46+
}
47+
return false;
48+
}
49+
}
50+
1851
private static readonly Config Config = ConfigurationFactory.ParseString(@"
1952
akka.loglevel = INFO
20-
akka.log-dead-letters = 3
53+
akka.log-dead-letters = 4
2154
akka.log-dead-letters-suspend-duration = 2s");
2255

2356
private readonly IActorRef _deadActor;
57+
private readonly IActorRef _droppingActor;
58+
private readonly IActorRef _unhandledActor;
2459

2560
public DeadLetterSuspensionSpec()
2661
: base(Config)
@@ -29,10 +64,20 @@ public DeadLetterSuspensionSpec()
2964
Watch(_deadActor);
3065
_deadActor.Tell(PoisonPill.Instance);
3166
ExpectTerminated(_deadActor);
67+
68+
_droppingActor = Sys.ActorOf(Dropping.Props(), "droppingActor");
69+
_unhandledActor = Sys.ActorOf(Unandled.Props(), "unhandledActor");
3270
}
3371

3472
private string ExpectedDeadLettersLogMessage(int count) =>
35-
$"Message [{count.GetType().Name}] from {TestActor.Path} to {_deadActor.Path} was not delivered. [{count}] dead letters encountered";
73+
$"Message [{count.GetType().Name}] from {TestActor} to {_deadActor} was not delivered. [{count}] dead letters encountered";
74+
75+
private string ExpectedDroppedLogMessage(int count) =>
76+
$"Message [{count.GetType().Name}] to {_droppingActor} was dropped. Don't like numbers. [{count}] dead letters encountered";
77+
78+
private string ExpectedUnhandledLogMessage(int count) =>
79+
$"Message [{count.GetType().Name}] from {TestActor} to {_unhandledActor} was unhandled. [{count}] dead letters encountered";
80+
3681

3782
[Fact]
3883
public void Must_suspend_dead_letters_logging_when_reaching_akka_log_dead_letters_and_then_re_enable()
@@ -42,28 +87,31 @@ public void Must_suspend_dead_letters_logging_when_reaching_akka_log_dead_letter
4287
.Expect(1, () => _deadActor.Tell(1));
4388

4489
EventFilter
45-
.Info(start: ExpectedDeadLettersLogMessage(2))
46-
.Expect(1, () => _deadActor.Tell(2));
90+
.Info(start: ExpectedDroppedLogMessage(2))
91+
.Expect(1, () => _droppingActor.Tell(2));
4792

4893
EventFilter
49-
.Info(start: ExpectedDeadLettersLogMessage(3) + ", no more dead letters will be logged in next")
50-
.Expect(1, () => _deadActor.Tell(3));
94+
.Info(start: ExpectedUnhandledLogMessage(3))
95+
.Expect(1, () => _unhandledActor.Tell(3));
5196

52-
_deadActor.Tell(4);
97+
EventFilter
98+
.Info(start: ExpectedDeadLettersLogMessage(4) + ", no more dead letters will be logged in next")
99+
.Expect(1, () => _deadActor.Tell(4));
53100
_deadActor.Tell(5);
101+
_droppingActor.Tell(6);
54102

55103
// let suspend-duration elapse
56104
Thread.Sleep(2050);
57105

58106
// re-enabled
59107
EventFilter
60-
.Info(start: ExpectedDeadLettersLogMessage(6) + ", of which 2 were not logged")
61-
.Expect(1, () => _deadActor.Tell(6));
108+
.Info(start: ExpectedDeadLettersLogMessage(7) + ", of which 2 were not logged")
109+
.Expect(1, () => _deadActor.Tell(7));
62110

63111
// reset count
64112
EventFilter
65113
.Info(start: ExpectedDeadLettersLogMessage(1))
66-
.Expect(1, () => _deadActor.Tell(7));
114+
.Expect(1, () => _deadActor.Tell(8));
67115
}
68116
}
69117
}

src/core/Akka.Tests/Event/EventStreamSpec.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ private static string GetDebugUnhandledMessagesConfig()
296296
akka {
297297
actor.serialize-messages = off
298298
actor.debug.unhandled = on
299+
log-dead-letters = off
299300
stdout-loglevel = DEBUG
300301
loglevel = DEBUG
301302
loggers = [""%logger%""]

src/core/Akka/Actor/ActorSelection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ public override string ToString()
326326
/// <summary>
327327
/// Used to deliver messages via <see cref="ActorSelection"/>.
328328
/// </summary>
329-
public class ActorSelectionMessage : IAutoReceivedMessage, IPossiblyHarmful
329+
public class ActorSelectionMessage : IAutoReceivedMessage, IPossiblyHarmful, IWrappedMessage
330330
{
331331
/// <summary>
332332
/// Initializes a new instance of the <see cref="ActorSelectionMessage" /> class.

0 commit comments

Comments
 (0)