diff --git a/actor/dead_letter_test.go b/actor/dead_letter_test.go index 463c4514..a638eb4a 100644 --- a/actor/dead_letter_test.go +++ b/actor/dead_letter_test.go @@ -97,6 +97,47 @@ func TestDeadletter(t *testing.T) { err = sys.Stop(ctx) assert.NoError(t, err) }) + t.Run("With GetDeadlettersCount for a specific actor", func(t *testing.T) { + ctx := context.TODO() + sys, _ := NewActorSystem("testSys", WithLogger(log.DiscardLogger)) + + // start the actor system + err := sys.Start(ctx) + assert.NoError(t, err) + + // wait for complete start + util.Pause(time.Second) + + // create the black hole actor + actor := &mockUnhandledMessageActor{} + actorName := "actorName" + actorRef, err := sys.Spawn(ctx, actorName, actor) + assert.NoError(t, err) + assert.NotNil(t, actorRef) + + // wait a while + util.Pause(time.Second) + + // every message sent to the actor will result in deadletter + for i := 0; i < 5; i++ { + require.NoError(t, Tell(ctx, actorRef, new(testpb.TestSend))) + } + + util.Pause(time.Second) + + actorID := actorRef.ID() + reply, err := Ask(ctx, sys.getDeadletter(), &internalpb.GetDeadlettersCount{ + ActorId: &actorID, + }, 500*time.Millisecond) + require.NoError(t, err) + require.NotNil(t, reply) + response, ok := reply.(*internalpb.DeadlettersCount) + require.True(t, ok) + require.EqualValues(t, 5, response.GetTotalCount()) + + err = sys.Stop(ctx) + assert.NoError(t, err) + }) t.Run("With GetDeadletters", func(t *testing.T) { ctx := context.TODO() sys, _ := NewActorSystem("testSys", WithLogger(log.DiscardLogger)) diff --git a/actor/pid.go b/actor/pid.go index 20ffa15e..bd8a5c5d 100644 --- a/actor/pid.go +++ b/actor/pid.go @@ -1891,7 +1891,7 @@ func (pid *PID) suspend(reason string) { // getDeadlettersCount gets deadletter func (pid *PID) getDeadlettersCount(ctx context.Context) int64 { var ( - name = pid.Name() + name = pid.ID() to = pid.ActorSystem().getDeadletter() from = pid.ActorSystem().getSystemGuardian() message = &internalpb.GetDeadlettersCount{ diff --git a/actor/pid_test.go b/actor/pid_test.go index ea1fdba2..5e7a6266 100644 --- a/actor/pid_test.go +++ b/actor/pid_test.go @@ -3709,3 +3709,39 @@ func TestLogger(t *testing.T) { buffer.Reset() }) } +func TestDeadletterCountMetric(t *testing.T) { + ctx := context.TODO() + sys, _ := NewActorSystem("testSys", WithLogger(log.DiscardLogger)) + + // start the actor system + err := sys.Start(ctx) + assert.NoError(t, err) + + // wait for complete start + util.Pause(time.Second) + + // create the black hole actor + actor := &mockUnhandledMessageActor{} + actorName := "actorName" + actorRef, err := sys.Spawn(ctx, actorName, actor) + assert.NoError(t, err) + assert.NotNil(t, actorRef) + + // wait a while + util.Pause(time.Second) + + // every message sent to the actor will result in deadletter + for i := 0; i < 5; i++ { + require.NoError(t, Tell(ctx, actorRef, new(testpb.TestSend))) + } + + util.Pause(time.Second) + + metric := actorRef.Metric(ctx) + require.NotNil(t, metric) + + require.EqualValues(t, 5, metric.DeadlettersCount()) + + err = sys.Stop(ctx) + assert.NoError(t, err) +}