Repository: Tochemey/goakt
Pull request #423 (2024-08-13 20:03:36)

refactor: cleaning up code from unecessary code

codecov[bot]: ## [Codecov](https://app.codecov.io/gh/Tochemey/goakt/pull/423?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 86.23%. Comparing base [(`b390fac`)](https://app.codecov.io/gh/Tochemey/goakt/commit/b390facb789985d381ae789d18afd9690af5317e?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene) to head [(`5ca6f91`)](https://app.codecov.io/gh/Tochemey/goakt/commit/5ca6f91fb0859b97ea31032a9a88d822fee4c370?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene).
> Report is 1 commits behind head on main.

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##             main     #423      +/-   ##
==========================================
- Coverage   86.43%   86.23%   -0.21%     
==========================================
  Files          47       46       -1     
  Lines        3870     3711     -159     
==========================================
- Hits         3345     3200     -145     
+ Misses        373      365       -8     
+ Partials      152      146       -6     
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/Tochemey/goakt/pull/423?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Arsene).


Patch:
diff --git a/Earthfile b/Earthfile
index ada2137..6a5add6 100644
--- a/Earthfile
+++ b/Earthfile
@@ -67,11 +67,9 @@ protogen:
             --template buf.gen.yaml \
             --path protos/goakt \
             --path protos/internal \
-            --path protos/benchmark \
             --path protos/test
 
     # save artifact to
     SAVE ARTIFACT gen/goakt AS LOCAL goaktpb
     SAVE ARTIFACT gen/test AS LOCAL  test/data/testpb
     SAVE ARTIFACT gen/internal AS LOCAL internal/internalpb
-    SAVE ARTIFACT gen/benchmark AS LOCAL bench/benchmarkpb
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 15f56cc..0000000
--- a/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-.PHONY: bench
-bench:
-	cd bench && rm -f bench.txt && go test -run=^# -bench . -benchmem -count=30 -timeout=0 | tee bench.txt
-
-.PHONY: bench-stats
-bench-stats:
-	cd bench && rm -f benchstat.txt && benchstat bench.txt | tee benchstat.txt
-
-
diff --git a/README.md b/README.md
index 3fe21be..51a5503 100644
--- a/README.md
+++ b/README.md
@@ -63,7 +63,6 @@ The project adheres to [Semantic Versioning](https://semver.org) and [Convention
     - [Static Provider Setup](#static-provider-setup)
 - [Contribution](#contribution)
   - [Test \& Linter](#test--linter)
-- [Benchmark](#benchmark)
 
 ## Design Principles
 
@@ -627,10 +626,3 @@ Prior to submitting a [pull request](https://help.github.com/articles/using-pull
 ```bash
 earthly +test
 ```
-
-## Benchmark
-
-One can run the benchmark test from the [bench package](./bench):
-
-- `make bench` to run the benchmark
-- `make bench-stats` to see the benchmark stats
diff --git a/actors/actor_system.go b/actors/actor_system.go
index 1acac8c..ef821d4 100644
--- a/actors/actor_system.go
+++ b/actors/actor_system.go
@@ -39,10 +39,7 @@ import (
 	"connectrpc.com/otelconnect"
 	"github.com/google/uuid"
 	"github.com/pkg/errors"
-	"go.opentelemetry.io/otel/codes"
 	otelmetric "go.opentelemetry.io/otel/metric"
-	"go.opentelemetry.io/otel/trace"
-	"go.opentelemetry.io/otel/trace/noop"
 	"go.uber.org/atomic"
 	"golang.org/x/net/http2"
 	"golang.org/x/net/http2/h2c"
@@ -202,7 +199,7 @@ type actorSystem struct {
 	// help protect some the fields to set
 	locker sync.Mutex
 	// specifies the stash capacity
-	stashCapacity uint64
+	stashEnabled bool
 
 	stopGC     chan types.Unit
 	gcInterval time.Duration
@@ -212,9 +209,6 @@ type actorSystem struct {
 
 	// specifies the message scheduler
 	scheduler *scheduler
-	// specifies whether tracing is enabled
-	traceEnabled atomic.Bool
-	tracer       trace.Tracer
 
 	// specifies whether metrics is enabled
 	metricEnabled atomic.Bool
@@ -256,13 +250,12 @@ func NewActorSystem(name string, opts ...Option) (ActorSystem, error) {
 		telemetry:              telemetry.New(),
 		locker:                 sync.Mutex{},
 		shutdownTimeout:        DefaultShutdownTimeout,
-		stashCapacity:          DefaultStashCapacity,
+		stashEnabled:           false,
 		stopGC:                 make(chan types.Unit, 1),
 		gcInterval:             DefaultGCInterval,
 		eventsStream:           eventstream.New(),
 		partitionHasher:        hash.DefaultHasher(),
 		actorInitTimeout:       DefaultInitTimeout,
-		tracer:                 noop.NewTracerProvider().Tracer(name),
 		clusterEventsChan:      make(chan *cluster.Event, 1),
 		registry:               types.NewRegistry(),
 		clusterSyncStopSig:     make(chan types.Unit, 1),
@@ -274,7 +267,6 @@ func NewActorSystem(name string, opts ...Option) (ActorSystem, error) {
 	system.started.Store(false)
 	system.remotingEnabled.Store(false)
 	system.clusterEnabled.Store(false)
-	system.traceEnabled.Store(false)
 	system.metricEnabled.Store(false)
 
 	system.reflection = newReflection(system.registry)
@@ -291,10 +283,6 @@ func NewActorSystem(name string, opts ...Option) (ActorSystem, error) {
 		}
 	}
 
-	if system.traceEnabled.Load() {
-		system.tracer = system.telemetry.Tracer
-	}
-
 	system.scheduler = newScheduler(system.logger, system.shutdownTimeout, withSchedulerCluster(system.cluster))
 
 	if system.metricEnabled.Load() {
@@ -315,10 +303,7 @@ func (x *actorSystem) Logger() log.Logger {
 }
 
 // Deregister removes a registered actor from the registry
-func (x *actorSystem) Deregister(ctx context.Context, actor Actor) error {
-	_, span := x.tracer.Start(ctx, "Deregister")
-	defer span.End()
-
+func (x *actorSystem) Deregister(_ context.Context, actor Actor) error {
 	x.locker.Lock()
 	defer x.locker.Unlock()
 
@@ -331,10 +316,7 @@ func (x *actorSystem) Deregister(ctx context.Context, actor Actor) error {
 }
 
 // Register registers an actor for future use. This is necessary when creating an actor remotely
-func (x *actorSystem) Register(ctx context.Context, actor Actor) error {
-	_, span := x.tracer.Start(ctx, "Register")
-	defer span.End()
-
+func (x *actorSystem) Register(_ context.Context, actor Actor) error {
 	x.locker.Lock()
 	defer x.locker.Unlock()
 
@@ -350,8 +332,6 @@ func (x *actorSystem) Register(ctx context.Context, actor Actor) error {
 // This will send the given message to the actor after the given interval specified.
 // The message will be sent once
 func (x *actorSystem) ScheduleOnce(ctx context.Context, message proto.Message, pid PID, interval time.Duration) error {
-	ctx, span := x.tracer.Start(ctx, "ScheduleOnce")
-	defer span.End()
 	return x.scheduler.ScheduleOnce(ctx, message, pid, interval)
 }
 
@@ -360,22 +340,16 @@ func (x *actorSystem) ScheduleOnce(ctx context.Context, message proto.Message, p
 // This will send the given message to the actor after the given interval specified
 // The message will be sent once
 func (x *actorSystem) RemoteScheduleOnce(ctx context.Context, message proto.Message, address *goaktpb.Address, interval time.Duration) error {
-	ctx, span := x.tracer.Start(ctx, "RemoteScheduleOnce")
-	defer span.End()
 	return x.scheduler.RemoteScheduleOnce(ctx, message, address, interval)
 }
 
 // ScheduleWithCron schedules a message to be sent to an actor in the future using a cron expression.
 func (x *actorSystem) ScheduleWithCron(ctx context.Context, message proto.Message, pid PID, cronExpression string) error {
-	ctx, span := x.tracer.Start(ctx, "ScheduleWithCron")
-	defer span.End()
 	return x.scheduler.ScheduleWithCron(ctx, message, pid, cronExpression)
 }
 
 // RemoteScheduleWithCron schedules a message to be sent to an actor in the future using a cron expression.
 func (x *actorSystem) RemoteScheduleWithCron(ctx context.Context, message proto.Message, address *goaktpb.Address, cronExpression string) error {
-	ctx, span := x.tracer.Start(ctx, "RemoteScheduleWithCron")
-	defer span.End()
 	return x.scheduler.RemoteScheduleWithCron(ctx, message, address, cronExpression)
 }
 
@@ -420,12 +394,7 @@ func (x *actorSystem) NumActors() uint64 {
 
 // Spawn creates or returns the instance of a given actor in the system
 func (x *actorSystem) Spawn(ctx context.Context, name string, actor Actor) (PID, error) {
-	ctx, span := x.tracer.Start(ctx, "Spawn")
-	defer span.End()
-
 	if !x.started.Load() {
-		span.SetStatus(codes.Error, "Spawn")
-		span.RecordError(ErrDead)
 		return nil, ErrActorSystemNotStarted
 	}
 
@@ -445,8 +414,6 @@ func (x *actorSystem) Spawn(ctx context.Context, name string, actor Actor) (PID,
 
 	pid, err := x.configPID(ctx, name, actor)
 	if err != nil {
-		span.SetStatus(codes.Error, "Spawn")
-		span.RecordError(err)
 		return nil, err
 	}
 
@@ -458,20 +425,13 @@ func (x *actorSystem) Spawn(ctx context.Context, name string, actor Actor) (PID,
 // SpawnNamedFromFunc creates an actor with the given receive function and provided name. One can set the PreStart and PostStop lifecycle hooks
 // in the given optional options
 func (x *actorSystem) SpawnNamedFromFunc(ctx context.Context, name string, receiveFunc ReceiveFunc, opts ...FuncOption) (PID, error) {
-	ctx, span := x.tracer.Start(ctx, "SpawnFromFunc")
-	defer span.End()
-
 	if !x.started.Load() {
-		span.SetStatus(codes.Error, "SpawnFromFunc")
-		span.RecordError(ErrDead)
 		return nil, ErrActorSystemNotStarted
 	}
 
 	actor := newFuncActor(name, receiveFunc, opts...)
 	pid, err := x.configPID(ctx, name, actor)
 	if err != nil {
-		span.SetStatus(codes.Error, "Spawn")
-		span.RecordError(err)
 		return nil, err
 	}
 
@@ -496,12 +456,7 @@ func (x *actorSystem) SpawnRouter(ctx context.Context, poolSize int, routeesKind
 
 // Kill stops a given actor in the system
 func (x *actorSystem) Kill(ctx context.Context, name string) error {
-	ctx, span := x.tracer.Start(ctx, "Kill")
-	defer span.End()
-
 	if !x.started.Load() {
-		span.SetStatus(codes.Error, "Kill")
-		span.RecordError(ErrActorSystemNotStarted)
 		return ErrActorSystemNotStarted
 	}
 
@@ -518,20 +473,12 @@ func (x *actorSystem) Kill(ctx context.Context, name string) error {
 		return pid.Shutdown(ctx)
 	}
 
-	err := ErrActorNotFound(actorPath.String())
-	span.SetStatus(codes.Error, "Kill")
-	span.RecordError(err)
-	return err
+	return ErrActorNotFound(actorPath.String())
 }
 
 // ReSpawn recreates a given actor in the system
 func (x *actorSystem) ReSpawn(ctx context.Context, name string) (PID, error) {
-	ctx, span := x.tracer.Start(ctx, "ReSpawn")
-	defer span.End()
-
 	if !x.started.Load() {
-		span.SetStatus(codes.Error, "ReSpawn")
-		span.RecordError(ErrActorSystemNotStarted)
 		return nil, ErrActorSystemNotStarted
 	}
 
@@ -552,10 +499,7 @@ func (x *actorSystem) ReSpawn(ctx context.Context, name string) (PID, error) {
 		return pid, nil
 	}
 
-	err := ErrActorNotFound(actorPath.String())
-	span.SetStatus(codes.Error, "ReSpawn")
-	span.RecordError(err)
-	return nil, err
+	return nil, ErrActorNotFound(actorPath.String())
 }
 
 // Name returns the actor system name
@@ -595,15 +539,10 @@ func (x *actorSystem) PeerAddress() string {
 // When remoting is enabled this method will return and error
 // An actor not found error is return when the actor is not found.
 func (x *actorSystem) ActorOf(ctx context.Context, actorName string) (addr *goaktpb.Address, pid PID, err error) {
-	ctx, span := x.tracer.Start(ctx, "ActorOf")
-	defer span.End()
-
 	x.locker.Lock()
 	defer x.locker.Unlock()
 
 	if !x.started.Load() {
-		span.SetStatus(codes.Error, "ActorOf")
-		span.RecordError(ErrActorSystemNotStarted)
 		return nil, nil, ErrActorSystemNotStarted
 	}
 
@@ -622,31 +561,21 @@ func (x *actorSystem) ActorOf(ctx context.Context, actorName string) (addr *goak
 			if errors.Is(err, cluster.ErrActorNotFound) {
 				x.logger.Infof("actor=%s not found", actorName)
 				e := ErrActorNotFound(actorName)
-				span.SetStatus(codes.Error, "ActorOf")
-				span.RecordError(e)
 				return nil, nil, e
 			}
 
-			e := errors.Wrapf(err, "failed to fetch remote actor=%s", actorName)
-			span.SetStatus(codes.Error, "ActorOf")
-			span.RecordError(e)
-			return nil, nil, e
+			return nil, nil, errors.Wrapf(err, "failed to fetch remote actor=%s", actorName)
 		}
 
 		return actor.GetActorAddress(), nil, nil
 	}
 
 	if x.remotingEnabled.Load() {
-		span.SetStatus(codes.Error, "ActorOf")
-		span.RecordError(ErrMethodCallNotAllowed)
 		return nil, nil, ErrMethodCallNotAllowed
 	}
 
 	x.logger.Infof("actor=%s not found", actorName)
-	e := ErrActorNotFound(actorName)
-	span.SetStatus(codes.Error, "ActorOf")
-	span.RecordError(e)
-	return nil, nil, e
+	return nil, nil, ErrActorNotFound(actorName)
 }
 
 // LocalActor returns the reference of a local actor.
@@ -674,40 +603,26 @@ func (x *actorSystem) LocalActor(actorName string) (PID, error) {
 // When the cluster mode is not enabled an actor not found error will be returned
 // One can always check whether cluster is enabled before calling this method or just use the ActorOf method.
 func (x *actorSystem) RemoteActor(ctx context.Context, actorName string) (addr *goaktpb.Address, err error) {
-	ctx, span := x.tracer.Start(ctx, "RemoteActor")
-	defer span.End()
-
 	x.locker.Lock()
 	defer x.locker.Unlock()
 
 	if !x.started.Load() {
 		e := ErrActorSystemNotStarted
-		span.SetStatus(codes.Error, "RemoteActor")
-		span.RecordError(e)
 		return nil, e
 	}
 
 	if x.cluster == nil {
-		e := ErrClusterDisabled
-		span.SetStatus(codes.Error, "RemoteActor")
-		span.RecordError(e)
-		return nil, e
+		return nil, ErrClusterDisabled
 	}
 
 	actor, err := x.cluster.GetActor(ctx, actorName)
 	if err != nil {
 		if errors.Is(err, cluster.ErrActorNotFound) {
 			x.logger.Infof("actor=%s not found", actorName)
-			e := ErrActorNotFound(actorName)
-			span.SetStatus(codes.Error, "RemoteActor")
-			span.RecordError(e)
-			return nil, e
+			return nil, ErrActorNotFound(actorName)
 		}
 
-		e := errors.Wrapf(err, "failed to fetch remote actor=%s", actorName)
-		span.SetStatus(codes.Error, "RemoteActor")
-		span.RecordError(e)
-		return nil, e
+		return nil, errors.Wrapf(err, "failed to fetch remote actor=%s", actorName)
 	}
 
 	return actor.GetActorAddress(), nil
@@ -715,9 +630,6 @@ func (x *actorSystem) RemoteActor(ctx context.Context, actorName string) (addr *
 
 // Start starts the actor system
 func (x *actorSystem) Start(ctx context.Context) error {
-	ctx, span := x.tracer.Start(ctx, "Start")
-	defer span.End()
-
 	x.started.Store(true)
 
 	if x.remotingEnabled.Load() {
@@ -749,17 +661,11 @@ func (x *actorSystem) Start(ctx context.Context) error {
 
 // Stop stops the actor system
 func (x *actorSystem) Stop(ctx context.Context) error {
-	ctx, span := x.tracer.Start(ctx, "Stop")
-	defer span.End()
-
 	x.logger.Infof("%s shutting down...", x.name)
 
 	// make sure the actor system has started
 	if !x.started.Load() {
-		e := ErrActorSystemNotStarted
-		span.SetStatus(codes.Error, "Stop")
-		span.RecordError(e)
-		return e
+		return ErrActorSystemNotStarted
 	}
 
 	x.stopGC <- types.Unit{}
@@ -777,8 +683,6 @@ func (x *actorSystem) Stop(ctx context.Context) error {
 
 	if x.remotingEnabled.Load() {
 		if err := x.remotingServer.Shutdown(ctx); err != nil {
-			span.SetStatus(codes.Error, "Stop")
-			span.RecordError(err)
 			return err
 		}
 
@@ -788,8 +692,6 @@ func (x *actorSystem) Stop(ctx context.Context) error {
 
 	if x.clusterEnabled.Load() {
 		if err := x.cluster.Stop(ctx); err != nil {
-			span.SetStatus(codes.Error, "Stop")
-			span.RecordError(err)
 			return err
 		}
 		close(x.actorsChan)
@@ -1122,15 +1024,11 @@ func (x *actorSystem) GetKinds(_ context.Context, request *connect.Request[inter
 // handleRemoteAsk handles a synchronous message to another actor and expect a response.
 // This block until a response is received or timed out.
 func (x *actorSystem) handleRemoteAsk(ctx context.Context, to PID, message proto.Message, timeout time.Duration) (response proto.Message, err error) {
-	ctx, span := x.tracer.Start(ctx, "HandleRemoteAsk")
-	defer span.End()
 	return Ask(ctx, to, message, timeout)
 }
 
 // handleRemoteTell handles an asynchronous message to an actor
 func (x *actorSystem) handleRemoteTell(ctx context.Context, to PID, message proto.Message) error {
-	ctx, span := x.tracer.Start(ctx, "HandleRemoteTell")
-	defer span.End()
 	return Tell(ctx, to, message)
 }
 
@@ -1228,9 +1126,8 @@ func (x *actorSystem) enableRemoting(ctx context.Context) {
 
 	var interceptor *otelconnect.Interceptor
 	var err error
-	if x.metricEnabled.Load() || x.traceEnabled.Load() {
+	if x.metricEnabled.Load() {
 		interceptor, err = otelconnect.NewInterceptor(
-			otelconnect.WithTracerProvider(x.telemetry.TracerProvider),
 			otelconnect.WithMeterProvider(x.telemetry.MeterProvider),
 		)
 		if err != nil {
@@ -1510,12 +1407,16 @@ func (x *actorSystem) configPID(ctx context.Context, name string, actor Actor) (
 		withCustomLogger(x.logger),
 		withActorSystem(x),
 		withSupervisorDirective(x.supervisorDirective),
-		withStash(x.stashCapacity),
 		withEventsStream(x.eventsStream),
 		withInitTimeout(x.actorInitTimeout),
 		withTelemetry(x.telemetry),
 	}
 
+	// enable stash
+	if x.stashEnabled {
+		pidOpts = append(pidOpts, withStash())
+	}
+
 	// disable passivation for system supervisor
 	if isSystemName(name) {
 		pidOpts = append(pidOpts, withPassivationDisabled())
@@ -1523,10 +1424,6 @@ func (x *actorSystem) configPID(ctx context.Context, name string, actor Actor) (
 		pidOpts = append(pidOpts, withPassivationAfter(x.expireActorAfter))
 	}
 
-	if x.traceEnabled.Load() {
-		pidOpts = append(pidOpts, withTracing())
-	}
-
 	if x.metricEnabled.Load() {
 		pidOpts = append(pidOpts, withMetric())
 	}
diff --git a/actors/context.go b/actors/context.go
index 90cc176..0bc50b6 100644
--- a/actors/context.go
+++ b/actors/context.go
@@ -26,7 +26,6 @@ package actors
 
 import (
 	"context"
-	"sync"
 	"time"
 
 	"go.uber.org/atomic"
@@ -149,7 +148,6 @@ type receiveContext struct {
 	remoteSender *goaktpb.Address
 	response     chan proto.Message
 	recipient    PID
-	mu           sync.Mutex
 	async        bool
 	sendTime     atomic.Time
 }
@@ -168,7 +166,6 @@ func newReceiveContext(ctx context.Context, from, to PID, message proto.Message,
 	context.recipient = to
 	context.message = message
 	context.async = async
-	context.mu = sync.Mutex{}
 	context.response = make(chan proto.Message, 1)
 	context.sendTime.Store(time.Now())
 
@@ -184,9 +181,7 @@ func (c *receiveContext) WithRemoteSender(remoteSender *goaktpb.Address) *receiv
 
 // Self returns the receiver PID of the message
 func (c *receiveContext) Self() PID {
-	c.mu.Lock()
 	self := c.recipient
-	c.mu.Unlock()
 	return self
 }
 
@@ -201,8 +196,6 @@ func (c *receiveContext) Err(err error) {
 
 // Response sets the message response
 func (c *receiveContext) Response(resp proto.Message) {
-	c.mu.Lock()
-	defer c.mu.Unlock()
 	// only set a response when the message is sync message
 	if !c.async {
 		defer close(c.response)
@@ -212,34 +205,26 @@ func (c *receiveContext) Response(resp proto.Message) {
 
 // Context represents the context attached to the message
 func (c *receiveContext) Context() context.Context {
-	c.mu.Lock()
 	ctx := c.ctx
-	c.mu.Unlock()
 	return ctx
 }
 
 // Sender of the message
 func (c *receiveContext) Sender() PID {
-	c.mu.Lock()
 	sender := c.sender
-	c.mu.Unlock()
 	return sender
 }
 
 // RemoteSender defines the remote sender of the message if it is a remote message
 // This is set to RemoteNoSender when the message is not a remote message
 func (c *receiveContext) RemoteSender() *goaktpb.Address {
-	c.mu.Lock()
 	sender := c.remoteSender
-	c.mu.Unlock()
 	return sender
 }
 
 // Message is the actual message sent
 func (c *receiveContext) Message() proto.Message {
-	c.mu.Lock()
 	message := c.message
-	c.mu.Unlock()
 	return message
 }
 
@@ -249,37 +234,27 @@ func (c *receiveContext) Message() proto.Message {
 // One needs to call UnBecomeStacked to go the previous the actor's behavior.
 // which is the default behavior.
 func (c *receiveContext) BecomeStacked(behavior Behavior) {
-	c.mu.Lock()
 	c.recipient.setBehaviorStacked(behavior)
-	c.mu.Unlock()
 }
 
 // UnBecomeStacked sets the actor behavior to the previous behavior before BecomeStacked was called
 func (c *receiveContext) UnBecomeStacked() {
-	c.mu.Lock()
 	c.recipient.unsetBehaviorStacked()
-	c.mu.Unlock()
 }
 
 // UnBecome reset the actor behavior to the default one
 func (c *receiveContext) UnBecome() {
-	c.mu.Lock()
 	c.recipient.resetBehavior()
-	c.mu.Unlock()
 }
 
 // Become switch the current behavior of the actor to a new behavior
 func (c *receiveContext) Become(behavior Behavior) {
-	c.mu.Lock()
 	c.recipient.setBehavior(behavior)
-	c.mu.Unlock()
 }
 
 // Stash enables an actor to temporarily buffer all or some messages that cannot or should not be handled using the actor’s current behavior
 func (c *receiveContext) Stash() {
-	c.mu.Lock()
 	recipient := c.recipient
-	c.mu.Unlock()
 	if err := recipient.stash(c); err != nil {
 		c.Err(err)
 	}
@@ -287,9 +262,7 @@ func (c *receiveContext) Stash() {
 
 // Unstash unstashes the oldest message in the stash and prepends to the mailbox
 func (c *receiveContext) Unstash() {
-	c.mu.Lock()
 	recipient := c.recipient
-	c.mu.Unlock()
 	if err := recipient.unstash(); err != nil {
 		c.Err(err)
 	}
@@ -298,9 +271,7 @@ func (c *receiveContext) Unstash() {
 // UnstashAll unstashes all messages from the stash buffer  and prepends in the mailbox
 // it keeps the messages in the same order as received, unstashing older messages before newer
 func (c *receiveContext) UnstashAll() {
-	c.mu.Lock()
 	recipient := c.recipient
-	c.mu.Unlock()
 	if err := recipient.unstashAll(); err != nil {
 		c.Err(err)
 	}
@@ -308,10 +279,8 @@ func (c *receiveContext) UnstashAll() {
 
 // Tell sends an asynchronous message to another PID
 func (c *receiveContext) Tell(to PID, message proto.Message) {
-	c.mu.Lock()
 	recipient := c.recipient
 	ctx := context.WithoutCancel(c.ctx)
-	c.mu.Unlock()
 	if err := recipient.Tell(ctx, to, message); err != nil {
 		panic(err)
 	}
@@ -322,10 +291,8 @@ func (c *receiveContext) Tell(to PID, message proto.Message) {
 // This is a design choice to follow the simple principle of one message at a time processing by actors.
 // When BatchTell encounter a single message it will fall back to a Tell call.
 func (c *receiveContext) BatchTell(to PID, messages ...proto.Message) {
-	c.mu.Lock()
 	recipient := c.recipient
 	ctx := context.WithoutCancel(c.ctx)
-	c.mu.Unlock()
 	if err := recipient.BatchTell(ctx, to, messages...); err != nil {
 		c.Err(err)
 	}
@@ -335,10 +302,8 @@ func (c *receiveContext) BatchTell(to PID, messages ...proto.Message) {
 // Ask has a timeout which can cause the sender to panic. When ask times out, the receiving actor does not know and may still process the message.
 // It is recommended to set a good timeout to quickly receive response and try to avoid false positives
 func (c *receiveContext) Ask(to PID, message proto.Message) (response proto.Message) {
-	c.mu.Lock()
 	recipient := c.recipient
 	ctx := context.WithoutCancel(c.ctx)
-	c.mu.Unlock()
 	reply, err := recipient.Ask(ctx, to, message)
 	if err != nil {
 		c.Err(err)
@@ -350,10 +315,8 @@ func (c *receiveContext) Ask(to PID, message proto.Message) (response proto.Mess
 // The messages will be processed one after the other in the order they are sent
 // This is a design choice to follow the simple principle of one message at a time processing by actors.
 func (c *receiveContext) BatchAsk(to PID, messages ...proto.Message) (responses chan proto.Message) {
-	c.mu.Lock()
 	recipient := c.recipient
 	ctx := context.WithoutCancel(c.ctx)
-	c.mu.Unlock()
 	reply, err := recipient.BatchAsk(ctx, to, messages...)
 	if err != nil {
 		c.Err(err)
@@ -363,10 +326,8 @@ func (c *receiveContext) BatchAsk(to PID, messages ...proto.Message) (responses
 
 // RemoteTell sends a message to an actor remotely without expecting any reply
 func (c *receiveContext) RemoteTell(to *goaktpb.Address, message proto.Message) {
-	c.mu.Lock()
 	recipient := c.recipient
 	ctx := context.WithoutCancel(c.ctx)
-	c.mu.Unlock()
 	if err := recipient.RemoteTell(ctx, to, message); err != nil {
 		c.Err(err)
 	}
@@ -375,10 +336,8 @@ func (c *receiveContext) RemoteTell(to *goaktpb.Address, message proto.Message)
 // RemoteAsk is used to send a message to an actor remotely and expect a response
 // immediately.
 func (c *receiveContext) RemoteAsk(to *goaktpb.Address, message proto.Message) (response *anypb.Any) {
-	c.mu.Lock()
 	recipient := c.recipient
 	ctx := context.WithoutCancel(c.ctx)
-	c.mu.Unlock()
 	reply, err := recipient.RemoteAsk(ctx, to, message)
 	if err != nil {
 		c.Err(err)
@@ -389,10 +348,8 @@ func (c *receiveContext) RemoteAsk(to *goaktpb.Address, message proto.Message) (
 // RemoteBatchTell sends a batch of messages to a remote actor in a way fire-and-forget manner
 // Messages are processed one after the other in the order they are sent.
 func (c *receiveContext) RemoteBatchTell(to *goaktpb.Address, messages ...proto.Message) {
-	c.mu.Lock()
 	recipient := c.recipient
 	ctx := context.WithoutCancel(c.ctx)
-	c.mu.Unlock()
 	if err := recipient.RemoteBatchTell(ctx, to, messages...); err != nil {
 		c.Err(err)
 	}
@@ -402,10 +359,8 @@ func (c *receiveContext) RemoteBatchTell(to *goaktpb.Address, messages ...proto.
 // Messages are processed one after the other in the order they are sent.
 // This can hinder performance if it is not properly used.
 func (c *receiveContext) RemoteBatchAsk(to *goaktpb.Address, messages ...proto.Message) (responses []*anypb.Any) {
-	c.mu.Lock()
 	recipient := c.recipient
 	ctx := context.WithoutCancel(c.ctx)
-	c.mu.Unlock()
 	replies, err := recipient.RemoteBatchAsk(ctx, to, messages...)
 	if err != nil {
 		c.Err(err)
@@ -416,10 +371,8 @@ func (c *receiveContext) RemoteBatchAsk(to *goaktpb.Address, messages ...proto.M
 // RemoteLookup look for an actor address on a remote node. If the actorSystem is nil then the lookup will be done
 // using the same actor system as the PID actor system
 func (c *receiveContext) RemoteLookup(host string, port int, name string) (addr *goaktpb.Address) {
-	c.mu.Lock()
 	recipient := c.recipient
 	ctx := context.WithoutCancel(c.ctx)
-	c.mu.Unlock()
 	remoteAddr, err := recipient.RemoteLookup(ctx, host, port, name)
 	if err != nil {
 		c.Err(err)
@@ -431,10 +384,8 @@ func (c *receiveContext) RemoteLookup(host string, port int, name string) (addr
 // All current messages in the mailbox will be processed before the actor shutdown after a period of time
 // that can be configured. All child actors will be gracefully shutdown.
 func (c *receiveContext) Shutdown() {
-	c.mu.Lock()
 	recipient := c.recipient
 	ctx := context.WithoutCancel(c.ctx)
-	c.mu.Unlock()
 	if err := recipient.Shutdown(ctx); err != nil {
 		c.Err(err)
 	}
@@ -442,10 +393,8 @@ func (c *receiveContext) Shutdown() {
 
 // Spawn creates a child actor or panic
 func (c *receiveContext) Spawn(name string, actor Actor) PID {
-	c.mu.Lock()
 	recipient := c.recipient
 	ctx := context.WithoutCancel(c.ctx)
-	c.mu.Unlock()
 	pid, err := recipient.SpawnChild(ctx, name, actor)
 	if err != nil {
 		c.Err(err)
@@ -455,16 +404,12 @@ func (c *receiveContext) Spawn(name string, actor Actor) PID {
 
 // Children returns the list of all the children of the given actor
 func (c *receiveContext) Children() []PID {
-	c.mu.Lock()
-	defer c.mu.Unlock()
 	return c.recipient.Children()
 }
 
 // Child returns the named child actor if it is alive
 func (c *receiveContext) Child(name string) PID {
-	c.mu.Lock()
 	recipient := c.recipient
-	c.mu.Unlock()
 	pid, err := recipient.Child(name)
 	if err != nil {
 		c.Err(err)
@@ -475,10 +420,8 @@ func (c *receiveContext) Child(name string) PID {
 // Stop forces the child Actor under the given name to terminate after it finishes processing its current message.
 // Nothing happens if child is already stopped. However, it panics when the child cannot be stopped.
 func (c *receiveContext) Stop(child PID) {
-	c.mu.Lock()
 	recipient := c.recipient
 	ctx := context.WithoutCancel(c.ctx)
-	c.mu.Unlock()
 	if err := recipient.Stop(ctx, child); err != nil {
 		c.Err(err)
 	}
@@ -491,8 +434,6 @@ func (c *receiveContext) Stop(child PID) {
 func (c *receiveContext) Forward(to PID) {
 	message := c.Message()
 	sender := c.Sender()
-	c.mu.Lock()
-	defer c.mu.Unlock()
 
 	if to.IsRunning() {
 		ctx := context.WithoutCancel(c.ctx)
@@ -501,7 +442,6 @@ func (c *receiveContext) Forward(to PID) {
 			message:   message,
 			sender:    sender,
 			recipient: to,
-			mu:        sync.Mutex{},
 			async:     false,
 		}
 		to.doReceive(receiveContext)
@@ -510,18 +450,14 @@ func (c *receiveContext) Forward(to PID) {
 
 // Unhandled is used to handle unhandled messages instead of throwing error
 func (c *receiveContext) Unhandled() {
-	c.mu.Lock()
 	me := c.recipient
-	c.mu.Unlock()
 	me.handleError(c, ErrUnhandled)
 }
 
 // RemoteReSpawn restarts an actor on a remote node.
 func (c *receiveContext) RemoteReSpawn(host string, port int, name string) {
-	c.mu.Lock()
 	recipient := c.recipient
 	ctx := context.WithoutCancel(c.ctx)
-	c.mu.Unlock()
 	if err := recipient.RemoteReSpawn(ctx, host, port, name); err != nil {
 		c.Err(err)
 	}
@@ -532,10 +468,8 @@ func (c *receiveContext) RemoteReSpawn(host string, port int, name string) {
 // This is useful when interacting with external services.
 // It’s common that you would like to use the value of the response in the actor when the long-running task is completed
 func (c *receiveContext) PipeTo(to PID, task future.Task) {
-	c.mu.Lock()
 	recipient := c.recipient
 	ctx := context.WithoutCancel(c.ctx)
-	c.mu.Unlock()
 	if err := recipient.PipeTo(ctx, to, task); err != nil {
 		c.Err(err)
 	}
diff --git a/actors/option.go b/actors/option.go
index a695b30..6780eda 100644
--- a/actors/option.go
+++ b/actors/option.go
@@ -146,9 +146,9 @@ func WithShutdownTimeout(timeout time.Duration) Option {
 }
 
 // WithStash sets the stash buffer size
-func WithStash(capacity uint64) Option {
+func WithStash() Option {
 	return OptionFunc(func(a *actorSystem) {
-		a.stashCapacity = capacity
+		a.stashEnabled = true
 	})
 }
 
@@ -166,13 +166,6 @@ func WithActorInitTimeout(timeout time.Duration) Option {
 	})
 }
 
-// WithTracing enables tracing
-func WithTracing() Option {
-	return OptionFunc(func(system *actorSystem) {
-		system.traceEnabled.Store(true)
-	})
-}
-
 // WithMetric enables metrics
 func WithMetric() Option {
 	return OptionFunc(func(system *actorSystem) {
diff --git a/actors/pid.go b/actors/pid.go
index 97cd1a6..e753d08 100644
--- a/actors/pid.go
+++ b/actors/pid.go
@@ -37,10 +37,7 @@ import (
 	"connectrpc.com/connect"
 	"connectrpc.com/otelconnect"
 	"github.com/flowchartsman/retry"
-	"go.opentelemetry.io/otel/codes"
 	otelmetric "go.opentelemetry.io/otel/metric"
-	"go.opentelemetry.io/otel/trace"
-	"go.opentelemetry.io/otel/trace/noop"
 	"go.uber.org/atomic"
 	"google.golang.org/protobuf/proto"
 	"google.golang.org/protobuf/types/known/anypb"
@@ -270,17 +267,12 @@ type pid struct {
 	behaviorStack *behaviorStack
 
 	// stash settings
-	stashBuffer   chan ReceiveContext
-	stashCapacity atomic.Uint64
-	stashLocker   *sync.Mutex
+	stashBuffer *queue.MpscQueue[ReceiveContext]
+	stashLocker *sync.Mutex
 
 	// define an events stream
 	eventsStream *eventstream.EventsStream
 
-	// define tracing
-	traceEnabled atomic.Bool
-	tracer       trace.Tracer
-
 	// set the metrics settings
 	restartCount   *atomic.Int64
 	childrenCount  *atomic.Int64
@@ -323,7 +315,6 @@ func newPID(ctx context.Context, actorPath *Path, actor Actor, opts ...pidOption
 		stashBuffer:          nil,
 		stashLocker:          &sync.Mutex{},
 		eventsStream:         nil,
-		tracer:               noop.NewTracerProvider().Tracer("PID"),
 		restartCount:         atomic.NewInt64(0),
 		childrenCount:        atomic.NewInt64(0),
 		processedCount:       atomic.NewInt64(0),
@@ -333,30 +324,20 @@ func newPID(ctx context.Context, actorPath *Path, actor Actor, opts ...pidOption
 	p.initMaxRetries.Store(DefaultInitMaxRetries)
 	p.shutdownTimeout.Store(DefaultShutdownTimeout)
 	p.lastReceivedDuration.Store(0)
-	p.stashCapacity.Store(DefaultStashCapacity)
 	p.isRunning.Store(false)
 	p.passivateAfter.Store(DefaultPassivationTimeout)
 	p.askTimeout.Store(DefaultAskTimeout)
 	p.initTimeout.Store(DefaultInitTimeout)
-	p.traceEnabled.Store(false)
 	p.metricEnabled.Store(false)
 
 	for _, opt := range opts {
 		opt(p)
 	}
 
-	if p.stashCapacity.Load() > 0 {
-		p.stashBuffer = make(chan ReceiveContext, p.stashCapacity.Load())
-	}
-
 	behaviorStack := newBehaviorStack()
 	behaviorStack.Push(p.Receive)
 	p.behaviorStack = behaviorStack
 
-	if p.traceEnabled.Load() {
-		p.tracer = p.telemetry.Tracer
-	}
-
 	if err := p.init(ctx); err != nil {
 		return nil, err
 	}
@@ -459,18 +440,11 @@ func (x *pid) Children() []PID {
 // Stop forces the child Actor under the given name to terminate after it finishes processing its current message.
 // Nothing happens if child is already stopped.
 func (x *pid) Stop(ctx context.Context, cid PID) error {
-	ctx, span := x.tracer.Start(ctx, "Stop")
-	defer span.End()
-
 	if !x.IsRunning() {
-		span.SetStatus(codes.Error, "Stop")
-		span.RecordError(ErrDead)
 		return ErrDead
 	}
 
 	if cid == nil || cid == NoSender {
-		span.SetStatus(codes.Error, "Stop")
-		span.RecordError(ErrUndefinedActor)
 		return ErrUndefinedActor
 	}
 
@@ -479,21 +453,14 @@ func (x *pid) Stop(ctx context.Context, cid PID) error {
 	x.fieldsLocker.RUnlock()
 
 	if cid, ok := children.get(cid.ActorPath()); ok {
-		desc := fmt.Sprintf("child.[%s] Shutdown", cid.ActorPath())
 		if err := cid.Shutdown(ctx); err != nil {
-			span.SetStatus(codes.Error, desc)
-			span.RecordError(err)
 			return err
 		}
 
-		span.SetStatus(codes.Ok, desc)
 		return nil
 	}
 
-	err := ErrActorNotFound(cid.ActorPath().String())
-	span.SetStatus(codes.Error, "Stop")
-	span.RecordError(err)
-	return err
+	return ErrActorNotFound(cid.ActorPath().String())
 }
 
 // IsRunning returns true when the actor is alive ready to process messages and false
@@ -521,12 +488,7 @@ func (x *pid) ActorPath() *Path {
 // Restart restarts the actor.
 // During restart all messages that are in the mailbox and not yet processed will be ignored
 func (x *pid) Restart(ctx context.Context) error {
-	ctx, span := x.tracer.Start(ctx, "Restart")
-	defer span.End()
-
 	if x == nil || x.ActorPath() == nil {
-		span.SetStatus(codes.Error, "Restart")
-		span.RecordError(ErrUndefinedActor)
 		return ErrUndefinedActor
 	}
 
@@ -559,7 +521,6 @@ func (x *pid) Restart(ctx context.Context) error {
 		go x.passivationLoop()
 	}
 
-	span.SetStatus(codes.Ok, "Restart")
 	x.restartCount.Inc()
 
 	if x.eventsStream != nil {
@@ -575,12 +536,7 @@ func (x *pid) Restart(ctx context.Context) error {
 // SpawnChild creates a child actor and start watching it for error
 // When the given child actor already exists its PID will only be returned
 func (x *pid) SpawnChild(ctx context.Context, name string, actor Actor) (PID, error) {
-	ctx, span := x.tracer.Start(ctx, "SpawnChild")
-	defer span.End()
-
 	if !x.IsRunning() {
-		span.SetStatus(codes.Error, "SpawnChild")
-		span.RecordError(ErrDead)
 		return nil, ErrDead
 	}
 
@@ -604,16 +560,11 @@ func (x *pid) SpawnChild(ctx context.Context, name string, actor Actor) (PID, er
 		withCustomLogger(x.logger),
 		withActorSystem(x.system),
 		withSupervisorDirective(x.supervisorDirective),
-		withStash(x.stashCapacity.Load()),
 		withEventsStream(x.eventsStream),
 		withInitTimeout(x.initTimeout.Load()),
 		withShutdownTimeout(x.shutdownTimeout.Load()),
 	}
 
-	if x.traceEnabled.Load() {
-		opts = append(opts, withTracing())
-	}
-
 	if x.metricEnabled.Load() {
 		opts = append(opts, withMetric())
 	}
@@ -625,8 +576,6 @@ func (x *pid) SpawnChild(ctx context.Context, name string, actor Actor) (PID, er
 	)
 
 	if err != nil {
-		span.SetStatus(codes.Error, "SpawnChild")
-		span.RecordError(err)
 		x.fieldsLocker.RUnlock()
 		return nil, err
 	}
@@ -635,7 +584,6 @@ func (x *pid) SpawnChild(ctx context.Context, name string, actor Actor) (PID, er
 	eventsStream := x.eventsStream
 
 	x.fieldsLocker.RUnlock()
-	span.SetStatus(codes.Ok, "SpawnChild")
 
 	x.Watch(cid)
 
@@ -660,7 +608,7 @@ func (x *pid) StashSize() uint64 {
 	if x.stashBuffer == nil {
 		return 0
 	}
-	return uint64(len(x.stashBuffer))
+	return uint64(x.stashBuffer.Len())
 }
 
 // PipeTo processes a long-running task and pipes the result to the provided actor.
@@ -668,18 +616,11 @@ func (x *pid) StashSize() uint64 {
 // This is useful when interacting with external services.
 // It’s common that you would like to use the value of the response in the actor when the long-running task is completed
 func (x *pid) PipeTo(ctx context.Context, to PID, task future.Task) error {
-	ctx, span := x.tracer.Start(ctx, "PipeTo")
-	defer span.End()
-
 	if task == nil {
-		span.SetStatus(codes.Error, "PipeTo")
-		span.RecordError(ErrUndefinedTask)
 		return ErrUndefinedTask
 	}
 
 	if !to.IsRunning() {
-		span.SetStatus(codes.Error, "PipeTo")
-		span.RecordError(ErrDead)
 		return ErrDead
 	}
 
@@ -694,12 +635,7 @@ func (x *pid) PipeTo(ctx context.Context, to PID, task future.Task) error {
 // Ask sends a synchronous message to another actor and expect a response.
 // This block until a response is received or timed out.
 func (x *pid) Ask(ctx context.Context, to PID, message proto.Message) (response proto.Message, err error) {
-	ctx, span := x.tracer.Start(ctx, "Ask")
-	defer span.End()
-
 	if !to.IsRunning() {
-		span.SetStatus(codes.Error, "Ask")
-		span.RecordError(ErrDead)
 		return nil, ErrDead
 	}
 
@@ -710,13 +646,10 @@ func (x *pid) Ask(ctx context.Context, to PID, message proto.Message) (response
 		select {
 		case response = <-messageContext.response:
 			x.recordLastReceivedDurationMetric(ctx)
-			span.SetStatus(codes.Ok, "Ask")
 			return
 		case <-await:
 			x.recordLastReceivedDurationMetric(ctx)
 			err = ErrRequestTimeout
-			span.SetStatus(codes.Error, "Ask")
-			span.RecordError(err)
 			x.handleError(messageContext, err)
 			return nil, err
 		}
@@ -725,19 +658,13 @@ func (x *pid) Ask(ctx context.Context, to PID, message proto.Message) (response
 
 // Tell sends an asynchronous message to another PID
 func (x *pid) Tell(ctx context.Context, to PID, message proto.Message) error {
-	ctx, span := x.tracer.Start(ctx, "Tell")
-	defer span.End()
-
 	if !to.IsRunning() {
-		span.SetStatus(codes.Error, "Tell")
-		span.RecordError(ErrDead)
 		return ErrDead
 	}
 
 	messageContext := newReceiveContext(ctx, x, to, message, true)
 	to.doReceive(messageContext)
 	x.recordLastReceivedDurationMetric(ctx)
-	span.SetStatus(codes.Ok, "Tell")
 	return nil
 }
 
@@ -746,17 +673,11 @@ func (x *pid) Tell(ctx context.Context, to PID, message proto.Message) error {
 // This is a design choice to follow the simple principle of one message at a time processing by actors.
 // When BatchTell encounter a single message it will fall back to a Tell call.
 func (x *pid) BatchTell(ctx context.Context, to PID, messages ...proto.Message) error {
-	ctx, span := x.tracer.Start(ctx, "BatchTell")
-	defer span.End()
-
 	if !to.IsRunning() {
-		span.SetStatus(codes.Error, "BatchTell")
-		span.RecordError(ErrDead)
 		return ErrDead
 	}
 
 	if len(messages) == 1 {
-		// no need to record span error here because Tell handles it
 		return x.Tell(ctx, to, messages[0])
 	}
 
@@ -767,7 +688,6 @@ func (x *pid) BatchTell(ctx context.Context, to PID, messages ...proto.Message)
 	}
 
 	x.recordLastReceivedDurationMetric(ctx)
-	span.SetStatus(codes.Ok, "BatchTell")
 	return nil
 }
 
@@ -775,12 +695,7 @@ func (x *pid) BatchTell(ctx context.Context, to PID, messages ...proto.Message)
 // The messages will be processed one after the other in the order they are sent.
 // This is a design choice to follow the simple principle of one message at a time processing by actors.
 func (x *pid) BatchAsk(ctx context.Context, to PID, messages ...proto.Message) (responses chan proto.Message, err error) {
-	ctx, span := x.tracer.Start(ctx, "BatchAsk")
-	defer span.End()
-
 	if !to.IsRunning() {
-		span.SetStatus(codes.Error, "BatchAsk")
-		span.RecordError(ErrDead)
 		return nil, ErrDead
 	}
 
@@ -798,14 +713,11 @@ func (x *pid) BatchAsk(ctx context.Context, to PID, messages ...proto.Message) (
 			select {
 			case resp := <-messageContext.response:
 				responses <- resp
-				span.SetStatus(codes.Ok, "BatchAsk")
 				x.recordLastReceivedDurationMetric(ctx)
 				break timerLoop
 			case <-await:
 				err = ErrRequestTimeout
 				x.recordLastReceivedDurationMetric(ctx)
-				span.SetStatus(codes.Error, "BatchAsk")
-				span.RecordError(err)
 				x.handleError(messageContext, err)
 				return nil, err
 			}
@@ -1172,9 +1084,6 @@ func (x *pid) RemoteReSpawn(ctx context.Context, host string, port int, name str
 // All current messages in the mailbox will be processed before the actor shutdown after a period of time
 // that can be configured. All child actors will be gracefully shutdown.
 func (x *pid) Shutdown(ctx context.Context) error {
-	ctx, span := x.tracer.Start(ctx, "Shutdown")
-	defer span.End()
-
 	x.stopLocker.Lock()
 	defer x.stopLocker.Unlock()
 
@@ -1182,7 +1091,6 @@ func (x *pid) Shutdown(ctx context.Context) error {
 
 	if !x.isRunning.Load() {
 		x.logger.Infof("Actor=%s is offline. Maybe it has been passivated or stopped already", x.ActorPath().String())
-		span.SetStatus(codes.Ok, "Shutdown")
 		return nil
 	}
 
@@ -1204,7 +1112,6 @@ func (x *pid) Shutdown(ctx context.Context) error {
 	}
 
 	x.logger.Infof("Actor=%s successfully shutdown", x.ID())
-	span.SetStatus(codes.Ok, "Shutdown")
 	return nil
 }
 
@@ -1245,25 +1152,13 @@ func (x *pid) watchees() *pidMap {
 
 // doReceive pushes a given message to the actor receiveContextBuffer
 func (x *pid) doReceive(ctx ReceiveContext) {
-	x.fieldsLocker.Lock()
-	x.lastProcessingTime.Store(time.Now())
-	x.fieldsLocker.Unlock()
-	if !x.mailbox.Push(ctx) {
-		err := errors.New("actor mailbox is closed")
-		x.logger.Warn(err)
-		x.handleError(ctx, err)
-	}
-	x.fieldsLocker.Lock()
 	x.lastProcessingTime.Store(time.Now())
-	x.fieldsLocker.Unlock()
+	x.mailbox.Push(ctx)
 }
 
 // init initializes the given actor and init processing messages
 // when the initialization failed the actor will not be started
 func (x *pid) init(ctx context.Context) error {
-	ctx, span := x.tracer.Start(ctx, "Init")
-	defer span.End()
-
 	x.logger.Info("Initialization process has started...")
 
 	cancelCtx, cancel := context.WithTimeout(ctx, x.initTimeout.Load())
@@ -1274,8 +1169,6 @@ func (x *pid) init(ctx context.Context) error {
 	retrier := retry.NewRetrier(int(x.initMaxRetries.Load()), 100*time.Millisecond, time.Second)
 	if err := retrier.RunContext(cancelCtx, x.Actor.PreStart); err != nil {
 		e := ErrInitFailure(err)
-		span.SetStatus(codes.Error, "Init")
-		span.RecordError(e)
 		return e
 	}
 
@@ -1284,7 +1177,6 @@ func (x *pid) init(ctx context.Context) error {
 	x.fieldsLocker.Unlock()
 
 	x.logger.Info("Initialization process successfully completed.")
-	span.SetStatus(codes.Ok, "Init")
 
 	if x.eventsStream != nil {
 		x.eventsStream.Publish(eventsTopic, &goaktpb.ActorStarted{
@@ -1404,15 +1296,10 @@ func (x *pid) handleReceived(received ReceiveContext) {
 			}
 		}
 		// set the total messages processed
-		x.fieldsLocker.Lock()
 		x.processedCount.Inc()
-		x.fieldsLocker.Unlock()
 	}()
 
-	x.fieldsLocker.Lock()
 	behaviorStack := x.behaviorStack
-	x.fieldsLocker.Unlock()
-
 	// send the message to the current actor behavior
 	if behavior, ok := behaviorStack.Peek(); ok {
 		behavior(received)
@@ -1452,9 +1339,6 @@ func (x *pid) passivationLoop() {
 		return
 	}
 
-	x.stopLocker.Lock()
-	defer x.stopLocker.Unlock()
-
 	x.logger.Infof("Passivation mode has been triggered for actor=%s...", x.ActorPath().String())
 
 	ctx := context.Background()
@@ -1507,17 +1391,12 @@ func (x *pid) unsetBehaviorStacked() {
 
 // doStop stops the actor
 func (x *pid) doStop(ctx context.Context) error {
-	ctx, span := x.tracer.Start(ctx, "doStop")
-	defer span.End()
-
 	x.isRunning.Store(false)
 
 	// TODO: just signal stash processing done and ignore the messages or process them
 	if x.stashBuffer != nil {
 		if err := x.unstashAll(); err != nil {
 			x.logger.Errorf("actor=(%s) failed to unstash messages", x.ActorPath().String())
-			span.SetStatus(codes.Error, "doStop")
-			span.RecordError(err)
 			return err
 		}
 	}
@@ -1630,7 +1509,7 @@ func (x *pid) registerMetrics() error {
 func (x *pid) grpcClientOptions() ([]connect.ClientOption, error) {
 	var interceptor *otelconnect.Interceptor
 	var err error
-	if x.metricEnabled.Load() || x.traceEnabled.Load() {
+	if x.metricEnabled.Load() {
 		interceptor, err = otelconnect.NewInterceptor(
 			otelconnect.WithTracerProvider(x.telemetry.TracerProvider),
 			otelconnect.WithMeterProvider(x.telemetry.MeterProvider))
@@ -1678,17 +1557,12 @@ func (x *pid) setLastProcessingDuration(d time.Duration) {
 // handleCompletion processes a long-running task and pipe the result to
 // the completion receiver
 func (x *pid) handleCompletion(ctx context.Context, completion *taskCompletion) {
-	ctx, span := x.tracer.Start(ctx, "TaskCompletion")
-	defer span.End()
-
 	// defensive programming
 	if completion == nil ||
 		completion.Receiver == nil ||
 		completion.Receiver == NoSender ||
 		completion.Task == nil {
 		x.logger.Error(ErrUndefinedTask)
-		span.RecordError(ErrUndefinedTask)
-		span.SetStatus(codes.Error, "TaskCompletion")
 		return
 	}
 
@@ -1708,8 +1582,6 @@ func (x *pid) handleCompletion(ctx context.Context, completion *taskCompletion)
 	// logger the error when the task returns an error
 	if err := result.Failure(); err != nil {
 		x.logger.Error(err)
-		span.RecordError(err)
-		span.SetStatus(codes.Error, "TaskCompletion")
 		return
 	}
 
@@ -1717,14 +1589,11 @@ func (x *pid) handleCompletion(ctx context.Context, completion *taskCompletion)
 	to := completion.Receiver
 	if !to.IsRunning() {
 		x.logger.Errorf("unable to pipe message to actor=(%s): not running", to.ActorPath().String())
-		span.RecordError(ErrDead)
-		span.SetStatus(codes.Error, "TaskCompletion")
 		return
 	}
 
 	messageContext := newReceiveContext(ctx, x, to, result.Success(), true)
 	to.doReceive(messageContext)
-	span.SetStatus(codes.Ok, "TaskCompletion")
 }
 
 // supervise watches for child actor's failure and act based upon the supervisory strategy
diff --git a/actors/pid_option.go b/actors/pid_option.go
index fd45d2a..0cc37f7 100644
--- a/actors/pid_option.go
+++ b/actors/pid_option.go
@@ -28,6 +28,7 @@ import (
 	"time"
 
 	"github.com/tochemey/goakt/v2/internal/eventstream"
+	"github.com/tochemey/goakt/v2/internal/queue"
 	"github.com/tochemey/goakt/v2/log"
 	"github.com/tochemey/goakt/v2/telemetry"
 )
@@ -101,9 +102,9 @@ func withTelemetry(telemetry *telemetry.Telemetry) pidOption {
 }
 
 // withStash sets the actor's stash buffer
-func withStash(capacity uint64) pidOption {
+func withStash() pidOption {
 	return func(pid *pid) {
-		pid.stashCapacity.Store(capacity)
+		pid.stashBuffer = queue.NewMpscQueue[ReceiveContext]()
 	}
 }
 
@@ -121,13 +122,6 @@ func withInitTimeout(duration time.Duration) pidOption {
 	}
 }
 
-// withTracing enables tracing
-func withTracing() pidOption {
-	return func(pid *pid) {
-		pid.traceEnabled.Store(true)
-	}
-}
-
 func withMetric() pidOption {
 	return func(pid *pid) {
 		pid.metricEnabled.Store(true)
diff --git a/actors/stash.go b/actors/stash.go
index 7985d33..ec7c9d7 100644
--- a/actors/stash.go
+++ b/actors/stash.go
@@ -31,10 +31,7 @@ func (x *pid) stash(ctx ReceiveContext) error {
 	if x.stashBuffer == nil {
 		return ErrStashBufferNotSet
 	}
-
-	x.stashLocker.Lock()
-	x.stashBuffer <- ctx
-	x.stashLocker.Unlock()
+	x.stashBuffer.Push(ctx)
 	return nil
 }
 
@@ -44,9 +41,7 @@ func (x *pid) unstash() error {
 		return ErrStashBufferNotSet
 	}
 
-	x.stashLocker.Lock()
-	defer x.stashLocker.Unlock()
-	received, ok := <-x.stashBuffer
+	received, ok := x.stashBuffer.Pop()
 	if !ok {
 		return errors.New("stash buffer may be closed")
 	}
@@ -64,8 +59,8 @@ func (x *pid) unstashAll() error {
 	x.stashLocker.Lock()
 	defer x.stashLocker.Unlock()
 
-	for len(x.stashBuffer) > 0 {
-		received, ok := <-x.stashBuffer
+	for x.stashBuffer.Len() > 0 {
+		received, ok := x.stashBuffer.Pop()
 		if !ok {
 			return errors.New("stash buffer may be closed")
 		}
diff --git a/bench/benchmark.go b/bench/benchmark.go
deleted file mode 100644
index d77eb71..0000000
--- a/bench/benchmark.go
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2022-2024 Tochemey
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package bench
-
-import (
-	"context"
-	"fmt"
-	"math/rand/v2"
-	"sync"
-	"sync/atomic"
-	"time"
-
-	"github.com/tochemey/goakt/v2/actors"
-	"github.com/tochemey/goakt/v2/bench/benchmarkpb"
-	"github.com/tochemey/goakt/v2/log"
-)
-
-const receivingTimeout = 100 * time.Millisecond
-
-var (
-	totalSent *atomic.Int64
-	totalRecv *atomic.Int64
-)
-
-func init() {
-	totalSent = new(atomic.Int64)
-	totalRecv = new(atomic.Int64)
-}
-
-// Benchmarker is an actor that helps run benchmark tests
-type Benchmarker struct{}
-
-func (p *Benchmarker) PreStart(context.Context) error {
-	return nil
-}
-
-func (p *Benchmarker) Receive(ctx actors.ReceiveContext) {
-	switch ctx.Message().(type) {
-	case *benchmarkpb.BenchTell:
-		totalRecv.Add(1)
-	case *benchmarkpb.BenchRequest:
-		totalRecv.Add(1)
-		ctx.Response(&benchmarkpb.BenchResponse{})
-	default:
-		ctx.Unhandled()
-	}
-}
-
-func (p *Benchmarker) PostStop(context.Context) error {
-	return nil
-}
-
-// Benchmark defines a load testing engine
-type Benchmark struct {
-	// actorsCount defines the number of actors to create
-	// on each actor system created by the loader
-	actorsCount int
-	// workersCount define the number of message senders
-	workersCount int
-	// duration specifies how long the load testing will run
-	duration time.Duration
-	pids     []actors.PID
-	system   actors.ActorSystem
-}
-
-// NewBenchmark creates an instance of Loader
-func NewBenchmark(actorsCount, workersCount int, duration time.Duration) *Benchmark {
-	return &Benchmark{
-		actorsCount:  actorsCount,
-		workersCount: workersCount,
-		duration:     duration,
-		pids:         make([]actors.PID, 0, actorsCount),
-	}
-}
-
-// Start starts the Benchmark
-func (b *Benchmark) Start(ctx context.Context) error {
-	// create the benchmark actor system
-	name := "benchmark-system"
-	b.system, _ = actors.NewActorSystem(name,
-		actors.WithLogger(log.DiscardLogger),
-		actors.WithActorInitMaxRetries(1),
-		actors.WithSupervisorDirective(actors.NewStopDirective()),
-		actors.WithReplyTimeout(receivingTimeout))
-
-	if err := b.system.Start(ctx); err != nil {
-		return err
-	}
-
-	// wait for the actor system to properly start
-	time.Sleep(time.Second)
-
-	for i := 0; i < b.actorsCount; i++ {
-		actorName := fmt.Sprintf("actor-%d", i)
-		pid, err := b.system.Spawn(ctx, actorName, &Benchmarker{})
-		if err != nil {
-			return err
-		}
-		b.pids = append(b.pids, pid)
-	}
-	// wait for the actors to properly start
-	time.Sleep(time.Second)
-	return nil
-}
-
-// Stop stops the benchmark
-func (b *Benchmark) Stop(ctx context.Context) error {
-	return b.system.Stop(ctx)
-}
-
-// BenchTell sends messages to a random actor
-func (b *Benchmark) BenchTell(ctx context.Context) error {
-	wg := sync.WaitGroup{}
-	wg.Add(b.workersCount)
-	deadline := time.Now().Add(b.duration)
-	for i := 0; i < b.workersCount; i++ {
-		go func() {
-			defer wg.Done()
-			for time.Now().Before(deadline) {
-				// randomly pick and actor
-				pid := b.pids[rand.IntN(len(b.pids))] //nolint:gosec
-				// send a message
-				_ = actors.Tell(ctx, pid, new(benchmarkpb.BenchTell))
-				// increase sent counter
-				totalSent.Add(1)
-			}
-		}()
-	}
-
-	// wait for the messages to be delivered
-	wg.Wait()
-	time.Sleep(500 * time.Millisecond)
-	if totalSent.Load() != totalRecv.Load() {
-		return fmt.Errorf("send count and receive count does not match: %d != %d", totalSent.Load(), totalRecv.Load())
-	}
-	return nil
-}
-
-// BenchAsk sends messages to a random actor
-func (b *Benchmark) BenchAsk(ctx context.Context) error {
-	wg := sync.WaitGroup{}
-	wg.Add(b.workersCount)
-	deadline := time.Now().Add(b.duration)
-	for i := 0; i < b.workersCount; i++ {
-		go func() {
-			defer wg.Done()
-			for time.Now().Before(deadline) {
-				// randomly pick and actor
-				pid := b.pids[rand.IntN(len(b.pids))] //nolint:gosec
-				// send a message
-				_, _ = actors.Ask(ctx, pid, new(benchmarkpb.BenchRequest), receivingTimeout)
-				// increase sent counter
-				totalSent.Add(1)
-			}
-		}()
-	}
-
-	// wait for the messages to be delivered
-	wg.Wait()
-	time.Sleep(500 * time.Millisecond)
-	if totalSent.Load() != totalRecv.Load() {
-		return fmt.Errorf("send count and receive count does not match: %d != %d", totalSent.Load(), totalRecv.Load())
-	}
-	return nil
-}
diff --git a/bench/benchmarkpb/benchmark.pb.go b/bench/benchmarkpb/benchmark.pb.go
deleted file mode 100644
index 17a42ae..0000000
--- a/bench/benchmarkpb/benchmark.pb.go
+++ /dev/null
@@ -1,246 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// versions:
-// 	protoc-gen-go v1.33.0
-// 	protoc        (unknown)
-// source: benchmark/benchmark.proto
-
-package benchmarkpb
-
-import (
-	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
-	reflect "reflect"
-	sync "sync"
-)
-
-const (
-	// Verify that this generated code is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
-	// Verify that runtime/protoimpl is sufficiently up-to-date.
-	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
-)
-
-type BenchTell struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-}
-
-func (x *BenchTell) Reset() {
-	*x = BenchTell{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_benchmark_benchmark_proto_msgTypes[0]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *BenchTell) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*BenchTell) ProtoMessage() {}
-
-func (x *BenchTell) ProtoReflect() protoreflect.Message {
-	mi := &file_benchmark_benchmark_proto_msgTypes[0]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use BenchTell.ProtoReflect.Descriptor instead.
-func (*BenchTell) Descriptor() ([]byte, []int) {
-	return file_benchmark_benchmark_proto_rawDescGZIP(), []int{0}
-}
-
-type BenchRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-}
-
-func (x *BenchRequest) Reset() {
-	*x = BenchRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_benchmark_benchmark_proto_msgTypes[1]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *BenchRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*BenchRequest) ProtoMessage() {}
-
-func (x *BenchRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_benchmark_benchmark_proto_msgTypes[1]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use BenchRequest.ProtoReflect.Descriptor instead.
-func (*BenchRequest) Descriptor() ([]byte, []int) {
-	return file_benchmark_benchmark_proto_rawDescGZIP(), []int{1}
-}
-
-type BenchResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-}
-
-func (x *BenchResponse) Reset() {
-	*x = BenchResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_benchmark_benchmark_proto_msgTypes[2]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *BenchResponse) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*BenchResponse) ProtoMessage() {}
-
-func (x *BenchResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_benchmark_benchmark_proto_msgTypes[2]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use BenchResponse.ProtoReflect.Descriptor instead.
-func (*BenchResponse) Descriptor() ([]byte, []int) {
-	return file_benchmark_benchmark_proto_rawDescGZIP(), []int{2}
-}
-
-var File_benchmark_benchmark_proto protoreflect.FileDescriptor
-
-var file_benchmark_benchmark_proto_rawDesc = []byte{
-	0x0a, 0x19, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2f, 0x62, 0x65, 0x6e, 0x63,
-	0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x62, 0x65, 0x6e,
-	0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x70, 0x62, 0x22, 0x0b, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63,
-	0x68, 0x54, 0x65, 0x6c, 0x6c, 0x22, 0x0e, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x0f, 0x0a, 0x0d, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xab, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x62,
-	0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x70, 0x62, 0x42, 0x0e, 0x42, 0x65, 0x6e, 0x63,
-	0x68, 0x6d, 0x61, 0x72, 0x6b, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x48, 0x02, 0x50, 0x01, 0x5a, 0x3a,
-	0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x6f, 0x63, 0x68, 0x65,
-	0x6d, 0x65, 0x79, 0x2f, 0x67, 0x6f, 0x61, 0x6b, 0x74, 0x2f, 0x76, 0x32, 0x2f, 0x62, 0x65, 0x6e,
-	0x63, 0x68, 0x2f, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x70, 0x62, 0x3b, 0x62,
-	0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x42, 0x58, 0x58,
-	0xaa, 0x02, 0x0b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x70, 0x62, 0xca, 0x02,
-	0x0b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x70, 0x62, 0xe2, 0x02, 0x17, 0x42,
-	0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x70, 0x62, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65,
-	0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61,
-	0x72, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
-	file_benchmark_benchmark_proto_rawDescOnce sync.Once
-	file_benchmark_benchmark_proto_rawDescData = file_benchmark_benchmark_proto_rawDesc
-)
-
-func file_benchmark_benchmark_proto_rawDescGZIP() []byte {
-	file_benchmark_benchmark_proto_rawDescOnce.Do(func() {
-		file_benchmark_benchmark_proto_rawDescData = protoimpl.X.CompressGZIP(file_benchmark_benchmark_proto_rawDescData)
-	})
-	return file_benchmark_benchmark_proto_rawDescData
-}
-
-var file_benchmark_benchmark_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
-var file_benchmark_benchmark_proto_goTypes = []interface{}{
-	(*BenchTell)(nil),     // 0: benchmarkpb.BenchTell
-	(*BenchRequest)(nil),  // 1: benchmarkpb.BenchRequest
-	(*BenchResponse)(nil), // 2: benchmarkpb.BenchResponse
-}
-var file_benchmark_benchmark_proto_depIdxs = []int32{
-	0, // [0:0] is the sub-list for method output_type
-	0, // [0:0] is the sub-list for method input_type
-	0, // [0:0] is the sub-list for extension type_name
-	0, // [0:0] is the sub-list for extension extendee
-	0, // [0:0] is the sub-list for field type_name
-}
-
-func init() { file_benchmark_benchmark_proto_init() }
-func file_benchmark_benchmark_proto_init() {
-	if File_benchmark_benchmark_proto != nil {
-		return
-	}
-	if !protoimpl.UnsafeEnabled {
-		file_benchmark_benchmark_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*BenchTell); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_benchmark_benchmark_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*BenchRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_benchmark_benchmark_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*BenchResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-	}
-	type x struct{}
-	out := protoimpl.TypeBuilder{
-		File: protoimpl.DescBuilder{
-			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
-			RawDescriptor: file_benchmark_benchmark_proto_rawDesc,
-			NumEnums:      0,
-			NumMessages:   3,
-			NumExtensions: 0,
-			NumServices:   0,
-		},
-		GoTypes:           file_benchmark_benchmark_proto_goTypes,
-		DependencyIndexes: file_benchmark_benchmark_proto_depIdxs,
-		MessageInfos:      file_benchmark_benchmark_proto_msgTypes,
-	}.Build()
-	File_benchmark_benchmark_proto = out.File
-	file_benchmark_benchmark_proto_rawDesc = nil
-	file_benchmark_benchmark_proto_goTypes = nil
-	file_benchmark_benchmark_proto_depIdxs = nil
-}
diff --git a/go.mod b/go.mod
index f867a8c..d492b12 100644
--- a/go.mod
+++ b/go.mod
@@ -11,9 +11,8 @@ require (
 	github.com/google/go-cmp v0.6.0
 	github.com/google/uuid v1.6.0
 	github.com/grandcat/zeroconf v1.0.0
-	github.com/klauspost/cpuid/v2 v2.2.8
 	github.com/nats-io/nats-server/v2 v2.10.18
-	github.com/nats-io/nats.go v1.36.0
+	github.com/nats-io/nats.go v1.37.0
 	github.com/pkg/errors v0.9.1
 	github.com/redis/go-redis/v9 v9.6.1
 	github.com/reugn/go-quartz v0.12.0
@@ -32,9 +31,9 @@ require (
 	golang.org/x/net v0.28.0
 	golang.org/x/sync v0.8.0
 	google.golang.org/protobuf v1.34.2
-	k8s.io/api v0.30.3
-	k8s.io/apimachinery v0.30.3
-	k8s.io/client-go v0.30.3
+	k8s.io/api v0.31.0
+	k8s.io/apimachinery v0.31.0
+	k8s.io/client-go v0.31.0
 	k8s.io/utils v0.0.0-20240711033017-18e509b52bc8
 )
 
@@ -45,10 +44,10 @@ require (
 	github.com/buraksezer/consistent v0.10.0 // indirect
 	github.com/cenkalti/backoff v2.2.1+incompatible // indirect
 	github.com/cespare/xxhash/v2 v2.3.0 // indirect
-	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
 	github.com/emicklei/go-restful/v3 v3.12.1 // indirect
-	github.com/evanphx/json-patch v5.9.0+incompatible // indirect
+	github.com/fxamacker/cbor/v2 v2.7.0 // indirect
 	github.com/go-logr/logr v1.4.2 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-openapi/jsonpointer v0.21.0 // indirect
@@ -70,6 +69,7 @@ require (
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/klauspost/compress v1.17.9 // indirect
+	github.com/klauspost/cpuid/v2 v2.2.8 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/miekg/dns v1.1.61 // indirect
 	github.com/minio/highwayhash v1.0.3 // indirect
@@ -80,8 +80,7 @@ require (
 	github.com/nats-io/jwt/v2 v2.5.8 // indirect
 	github.com/nats-io/nkeys v0.4.7 // indirect
 	github.com/nats-io/nuid v1.0.1 // indirect
-	github.com/pmezard/go-difflib v1.0.0 // indirect
-	github.com/rogpeppe/go-internal v1.12.0 // indirect
+	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 	github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect
 	github.com/stretchr/objx v0.5.2 // indirect
 	github.com/tidwall/btree v1.7.0 // indirect
@@ -89,6 +88,7 @@ require (
 	github.com/tidwall/redcon v1.6.2 // indirect
 	github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
+	github.com/x448/float16 v0.8.4 // indirect
 	golang.org/x/crypto v0.26.0 // indirect
 	golang.org/x/mod v0.20.0 // indirect
 	golang.org/x/oauth2 v0.22.0 // indirect
@@ -97,6 +97,7 @@ require (
 	golang.org/x/text v0.17.0 // indirect
 	golang.org/x/time v0.6.0 // indirect
 	golang.org/x/tools v0.24.0 // indirect
+	gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
diff --git a/go.sum b/go.sum
index 1a82c4e..ad09a87 100644
--- a/go.sum
+++ b/go.sum
@@ -42,19 +42,20 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
 github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
 github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM=
 github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
 github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
 github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
-github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls=
-github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/flowchartsman/retry v1.2.0 h1:qDhlw6RNufXz6RGr+IiYimFpMMkt77SUSHY5tgFaUCU=
 github.com/flowchartsman/retry v1.2.0/go.mod h1:+sfx8OgCCiAr3t5jh2Gk+T0fRTI+k52edaYxURQxY64=
+github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
+github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
@@ -71,7 +72,6 @@ github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDsl
 github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
 github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
 github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
 github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -188,8 +188,8 @@ github.com/nats-io/jwt/v2 v2.5.8 h1:uvdSzwWiEGWGXf+0Q+70qv6AQdvcvxrv9hPM0RiPamE=
 github.com/nats-io/jwt/v2 v2.5.8/go.mod h1:ZdWS1nZa6WMZfFwwgpEaqBV8EPGVgOTDHN/wTbz0Y5A=
 github.com/nats-io/nats-server/v2 v2.10.18 h1:tRdZmBuWKVAFYtayqlBB2BuCHNGAQPvoQIXOKwU3WSM=
 github.com/nats-io/nats-server/v2 v2.10.18/go.mod h1:97Qyg7YydD8blKlR8yBsUlPlWyZKjA7Bp5cl3MUE9K8=
-github.com/nats-io/nats.go v1.36.0 h1:suEUPuWzTSse/XhESwqLxXGuj8vGRuPRoG7MoRN/qyU=
-github.com/nats-io/nats.go v1.36.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8=
+github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE=
+github.com/nats-io/nats.go v1.37.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8=
 github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=
 github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=
 github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
@@ -205,8 +205,9 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
@@ -266,6 +267,8 @@ github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IU
 github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok=
 github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
 github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
+github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
+github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
@@ -381,6 +384,8 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4=
+gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
 gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
 gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
@@ -394,12 +399,12 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.30.3 h1:ImHwK9DCsPA9uoU3rVh4QHAHHK5dTSv1nxJUapx8hoQ=
-k8s.io/api v0.30.3/go.mod h1:GPc8jlzoe5JG3pb0KJCSLX5oAFIW3/qNJITlDj8BH04=
-k8s.io/apimachinery v0.30.3 h1:q1laaWCmrszyQuSQCfNB8cFgCuDAoPszKY4ucAjDwHc=
-k8s.io/apimachinery v0.30.3/go.mod h1:iexa2somDaxdnj7bha06bhb43Zpa6eWH8N8dbqVjTUc=
-k8s.io/client-go v0.30.3 h1:bHrJu3xQZNXIi8/MoxYtZBBWQQXwy16zqJwloXXfD3k=
-k8s.io/client-go v0.30.3/go.mod h1:8d4pf8vYu665/kUbsxWAQ/JDBNWqfFeZnvFiVdmx89U=
+k8s.io/api v0.31.0 h1:b9LiSjR2ym/SzTOlfMHm1tr7/21aD7fSkqgD/CVJBCo=
+k8s.io/api v0.31.0/go.mod h1:0YiFF+JfFxMM6+1hQei8FY8M7s1Mth+z/q7eF1aJkTE=
+k8s.io/apimachinery v0.31.0 h1:m9jOiSr3FoSSL5WO9bjm1n6B9KROYYgNZOb4tyZ1lBc=
+k8s.io/apimachinery v0.31.0/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
+k8s.io/client-go v0.31.0 h1:QqEJzNjbN2Yv1H79SsS+SWnXkBgVu4Pj3CJQgbx0gI8=
+k8s.io/client-go v0.31.0/go.mod h1:Y9wvC76g4fLjmU0BA+rV+h2cncoadjvjjkkIGoTLcGU=
 k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
 k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
 k8s.io/kube-openapi v0.0.0-20240808142205-8e686545bdb8 h1:1Wof1cGQgA5pqgo8MxKPtf+qN6Sh/0JzznmeGPm1HnE=
diff --git a/internal/queue/mpsc.go b/internal/queue/mpsc.go
index dad5ec8..a6ad006 100644
--- a/internal/queue/mpsc.go
+++ b/internal/queue/mpsc.go
@@ -56,15 +56,14 @@ func NewMpscQueue[T any]() *MpscQueue[T] {
 	}
 }
 
-// Push place the given value in the queue head (FIFO). Returns always true
-func (q *MpscQueue[T]) Push(value T) bool {
+// Push place the given value in the queue head (FIFO).
+func (q *MpscQueue[T]) Push(value T) {
 	tnode := &node[T]{
 		value: value,
 	}
 	previousHead := (*node[T])(atomic.SwapPointer((*unsafe.Pointer)(unsafe.Pointer(&q.head)), unsafe.Pointer(tnode)))
 	atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&previousHead.next)), unsafe.Pointer(tnode))
 	atomic.AddInt64(&q.length, 1)
-	return true
 }
 
 // Pop takes the QueueItem from the queue tail.
diff --git a/protos/benchmark/benchmark.proto b/protos/benchmark/benchmark.proto
deleted file mode 100644
index 232e6bb..0000000
--- a/protos/benchmark/benchmark.proto
+++ /dev/null
@@ -1,9 +0,0 @@
-syntax = "proto3";
-
-package benchmarkpb;
-
-option go_package = "github.com/tochemey/goakt/v2/bench/benchmarkpb;benchmarkpb";
-
-message BenchTell {}
-message BenchRequest {}
-message BenchResponse {}


Test patch:
diff --git a/actors/actor_system_test.go b/actors/actor_system_test.go
index be74746..cb5d649 100644
--- a/actors/actor_system_test.go
+++ b/actors/actor_system_test.go
@@ -41,7 +41,6 @@ import (
 	"github.com/travisjeffery/go-dynaport"
 	sdkmetric "go.opentelemetry.io/otel/sdk/metric"
 	"go.opentelemetry.io/otel/sdk/metric/metricdata"
-	"go.opentelemetry.io/otel/trace/noop"
 	"go.uber.org/atomic"
 	"google.golang.org/protobuf/proto"
 
@@ -108,31 +107,6 @@ func TestActorSystem(t *testing.T) {
 			assert.NoError(t, err)
 		})
 	})
-	t.Run("With Spawn an actor when started with tracing", func(t *testing.T) {
-		ctx := context.TODO()
-		sys, _ := NewActorSystem("testSys", WithLogger(log.DiscardLogger), WithTracing())
-
-		// start the actor system
-		err := sys.Start(ctx)
-		assert.NoError(t, err)
-
-		actor := newTestActor()
-		actorRef, err := sys.Spawn(ctx, "Test", actor)
-		assert.NoError(t, err)
-		assert.NotNil(t, actorRef)
-
-		// stop the actor after some time
-		time.Sleep(time.Second)
-		actorSystem := sys.(*actorSystem)
-		assert.True(t, actorSystem.traceEnabled.Load())
-		pid := actorRef.(*pid)
-		assert.True(t, pid.traceEnabled.Load())
-
-		t.Cleanup(func() {
-			err = sys.Stop(ctx)
-			assert.NoError(t, err)
-		})
-	})
 	t.Run("With Spawn an actor already exist", func(t *testing.T) {
 		ctx := context.TODO()
 		sys, _ := NewActorSystem("test", WithLogger(log.DiscardLogger))
@@ -1016,7 +990,7 @@ func TestActorSystem(t *testing.T) {
 		sys, _ := NewActorSystem("testSys",
 			WithMetric(),
 			WithTelemetry(tel),
-			WithStash(5),
+			WithStash(),
 			WithLogger(log.DiscardLogger))
 
 		// start the actor system
@@ -1408,7 +1382,6 @@ func TestActorSystem(t *testing.T) {
 			clusterEnabled: *atomic.NewBool(true),
 			telemetry:      telemetry.New(),
 			locker:         sync.Mutex{},
-			tracer:         noop.NewTracerProvider().Tracer("testSystem"),
 			scheduler:      newScheduler(logger, time.Second, withSchedulerCluster(mockedCluster)),
 			clusterConfig:  NewClusterConfig(),
 			registry:       types.NewRegistry(),
diff --git a/actors/context_test.go b/actors/context_test.go
index 9e1adeb..9d31884 100644
--- a/actors/context_test.go
+++ b/actors/context_test.go
@@ -124,7 +124,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -165,7 +164,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -209,7 +207,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -250,7 +247,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -319,7 +315,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -382,7 +377,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -451,7 +445,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -513,7 +506,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -578,7 +570,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -634,7 +625,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -671,7 +661,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -699,7 +688,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: parent,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -737,7 +725,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: parent,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -769,7 +756,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: parent,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -810,7 +796,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: parent,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -851,7 +836,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: parent,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -892,7 +876,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: parent,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -935,7 +918,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: parent,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -969,7 +951,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: parent,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1009,7 +990,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: parent,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1053,7 +1033,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: parent,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1097,7 +1076,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1183,7 +1161,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   send,
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1255,7 +1232,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   send,
 			sender:    pid2,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1322,7 +1298,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(goaktpb.PostStart),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1373,7 +1348,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1414,7 +1388,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1455,7 +1428,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1499,7 +1471,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1543,7 +1514,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1601,7 +1571,6 @@ func TestReceiveContext(t *testing.T) {
 			ctx:       ctx,
 			sender:    NoSender,
 			recipient: testerRef,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1658,7 +1627,6 @@ func TestReceiveContext(t *testing.T) {
 			ctx:       ctx,
 			sender:    NoSender,
 			recipient: testerRef,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1721,7 +1689,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1786,7 +1753,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1851,7 +1817,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1909,7 +1874,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -1959,7 +1923,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TaskComplete),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -2024,7 +1987,6 @@ func TestReceiveContext(t *testing.T) {
 			message:   new(testpb.TaskComplete),
 			sender:    NoSender,
 			recipient: pid1,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
diff --git a/actors/option_test.go b/actors/option_test.go
index 8228982..6002674 100644
--- a/actors/option_test.go
+++ b/actors/option_test.go
@@ -95,8 +95,8 @@ func TestOption(t *testing.T) {
 		},
 		{
 			name:     "WithStash",
-			option:   WithStash(10),
-			expected: actorSystem{stashCapacity: 10},
+			option:   WithStash(),
+			expected: actorSystem{stashEnabled: true},
 		},
 		{
 			name:     "WithPartitionHasher",
@@ -108,11 +108,6 @@ func TestOption(t *testing.T) {
 			option:   WithActorInitTimeout(2 * time.Second),
 			expected: actorSystem{actorInitTimeout: 2. * time.Second},
 		},
-		{
-			name:     "WithTracing",
-			option:   WithTracing(),
-			expected: actorSystem{traceEnabled: atomicTrue},
-		},
 		{
 			name:     "WithMetric",
 			option:   WithMetric(),
diff --git a/actors/pid_option_test.go b/actors/pid_option_test.go
index 313c515..973ddd1 100644
--- a/actors/pid_option_test.go
+++ b/actors/pid_option_test.go
@@ -91,11 +91,6 @@ func TestPIDOptions(t *testing.T) {
 			option:   withPassivationDisabled(),
 			expected: &pid{passivateAfter: negativeDuration},
 		},
-		{
-			name:     "WithStash",
-			option:   withStash(10),
-			expected: &pid{stashCapacity: atomicUint64},
-		},
 		{
 			name:     "withEventsStream",
 			option:   withEventsStream(eventsStream),
@@ -106,11 +101,6 @@ func TestPIDOptions(t *testing.T) {
 			option:   withInitTimeout(time.Second),
 			expected: &pid{initTimeout: atomicDuration},
 		},
-		{
-			name:     "withTracing",
-			option:   withTracing(),
-			expected: &pid{traceEnabled: atomicTrue},
-		},
 		{
 			name:     "withMetric",
 			option:   withMetric(),
diff --git a/actors/pid_test.go b/actors/pid_test.go
index add9645..e0762c6 100644
--- a/actors/pid_test.go
+++ b/actors/pid_test.go
@@ -38,7 +38,6 @@ import (
 	"github.com/travisjeffery/go-dynaport"
 	sdkmetric "go.opentelemetry.io/otel/sdk/metric"
 	"go.opentelemetry.io/otel/sdk/metric/metricdata"
-	"go.opentelemetry.io/otel/trace/noop"
 	"google.golang.org/protobuf/proto"
 
 	"github.com/tochemey/goakt/v2/goaktpb"
@@ -80,7 +79,6 @@ func TestReceive(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
@@ -341,7 +339,6 @@ func TestRestart(t *testing.T) {
 	})
 	t.Run("noSender cannot be restarted", func(t *testing.T) {
 		pid := &pid{
-			tracer:       noop.NewTracerProvider().Tracer(""),
 			fieldsLocker: &sync.RWMutex{},
 		}
 		err := pid.Restart(context.TODO())
@@ -1540,7 +1537,6 @@ func TestRegisterMetrics(t *testing.T) {
 			message:   new(testpb.TestSend),
 			sender:    NoSender,
 			recipient: pid,
-			mu:        sync.Mutex{},
 			async:     true,
 		}
 
diff --git a/actors/stash_test.go b/actors/stash_test.go
index a988c5f..5ff27e1 100644
--- a/actors/stash_test.go
+++ b/actors/stash_test.go
@@ -43,7 +43,7 @@ func TestStash(t *testing.T) {
 		opts := []pidOption{
 			withInitMaxRetries(1),
 			withCustomLogger(log.DiscardLogger),
-			withStash(10),
+			withStash(),
 		}
 
 		// create the actor path
@@ -111,7 +111,6 @@ func TestStash(t *testing.T) {
 		opts := []pidOption{
 			withInitMaxRetries(1),
 			withCustomLogger(log.DiscardLogger),
-			withStash(0),
 		}
 
 		// create the actor path
@@ -137,7 +136,6 @@ func TestStash(t *testing.T) {
 		opts := []pidOption{
 			withInitMaxRetries(1),
 			withCustomLogger(log.DiscardLogger),
-			withStash(0),
 		}
 
 		// create the actor path
diff --git a/bench/benchmark_test.go b/bench/benchmark_test.go
deleted file mode 100644
index 5ffccda..0000000
--- a/bench/benchmark_test.go
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2022-2024 Tochemey
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-package bench
-
-import (
-	"context"
-	"fmt"
-	"runtime"
-	"testing"
-	"time"
-
-	. "github.com/klauspost/cpuid/v2" //nolint
-	"github.com/stretchr/testify/require"
-
-	"github.com/tochemey/goakt/v2/actors"
-	"github.com/tochemey/goakt/v2/bench/benchmarkpb"
-	"github.com/tochemey/goakt/v2/log"
-)
-
-func BenchmarkActor(b *testing.B) {
-	b.Run("tell", func(b *testing.B) {
-		ctx := context.TODO()
-
-		// create the actor system
-		actorSystem, _ := actors.NewActorSystem("bench",
-			actors.WithLogger(log.DiscardLogger),
-			actors.WithActorInitMaxRetries(1),
-			actors.WithSupervisorDirective(actors.NewStopDirective()),
-			actors.WithReplyTimeout(receivingTimeout))
-
-		// start the actor system
-		_ = actorSystem.Start(ctx)
-
-		// define the benchmark actor
-		actor := &Benchmarker{}
-
-		// create the actor ref
-		pid, _ := actorSystem.Spawn(ctx, "test", actor)
-
-		runParallel(b, func(pb *testing.PB) {
-			for pb.Next() {
-				// send a message to the actor
-				_ = actors.Tell(ctx, pid, new(benchmarkpb.BenchTell))
-			}
-		})
-
-		_ = pid.Shutdown(ctx)
-		_ = actorSystem.Stop(ctx)
-	})
-	b.Run("tell without passivation", func(b *testing.B) {
-		ctx := context.TODO()
-
-		// create the actor system
-		actorSystem, _ := actors.NewActorSystem("bench",
-			actors.WithLogger(log.DiscardLogger),
-			actors.WithActorInitMaxRetries(1),
-			actors.WithSupervisorDirective(actors.NewStopDirective()),
-			actors.WithPassivationDisabled(),
-			actors.WithReplyTimeout(receivingTimeout))
-
-		// start the actor system
-		_ = actorSystem.Start(ctx)
-
-		// define the benchmark actor
-		actor := &Benchmarker{}
-
-		// create the actor ref
-		pid, _ := actorSystem.Spawn(ctx, "test", actor)
-
-		runParallel(b, func(pb *testing.PB) {
-			for pb.Next() {
-				// send a message to the actor
-				_ = actors.Tell(ctx, pid, new(benchmarkpb.BenchTell))
-			}
-		})
-
-		_ = pid.Shutdown(ctx)
-		_ = actorSystem.Stop(ctx)
-	})
-	b.Run("ask", func(b *testing.B) {
-		ctx := context.TODO()
-		// create the actor system
-		actorSystem, _ := actors.NewActorSystem("bench",
-			actors.WithLogger(log.DiscardLogger),
-			actors.WithActorInitMaxRetries(1),
-			actors.WithExpireActorAfter(5*time.Second),
-			actors.WithReplyTimeout(receivingTimeout))
-
-		// start the actor system
-		_ = actorSystem.Start(ctx)
-
-		// define the benchmark actor
-		actor := &Benchmarker{}
-
-		// create the actor ref
-		pid, _ := actorSystem.Spawn(ctx, "test", actor)
-		runParallel(b, func(pb *testing.PB) {
-			for pb.Next() {
-				// send a message to the actor
-				_, _ = actors.Ask(ctx, pid, new(benchmarkpb.BenchRequest), receivingTimeout)
-			}
-		})
-
-		_ = pid.Shutdown(ctx)
-		_ = actorSystem.Stop(ctx)
-	})
-	b.Run("ask without passivation", func(b *testing.B) {
-		ctx := context.TODO()
-		// create the actor system
-		actorSystem, _ := actors.NewActorSystem("bench",
-			actors.WithLogger(log.DiscardLogger),
-			actors.WithActorInitMaxRetries(1),
-			actors.WithPassivationDisabled(),
-			actors.WithReplyTimeout(receivingTimeout))
-
-		// start the actor system
-		_ = actorSystem.Start(ctx)
-
-		// define the benchmark actor
-		actor := &Benchmarker{}
-
-		// create the actor ref
-		pid, _ := actorSystem.Spawn(ctx, "test", actor)
-		runParallel(b, func(pb *testing.PB) {
-			for pb.Next() {
-				// send a message to the actor
-				_, _ = actors.Ask(ctx, pid, new(benchmarkpb.BenchRequest), receivingTimeout)
-			}
-		})
-
-		_ = pid.Shutdown(ctx)
-		_ = actorSystem.Stop(ctx)
-	})
-}
-
-func runParallel(b *testing.B, benchFn func(pb *testing.PB)) {
-	b.ReportAllocs()
-	b.ResetTimer()
-	start := time.Now()
-	b.RunParallel(benchFn)
-	opsPerSec := float64(b.N) / time.Since(start).Seconds()
-	b.ReportMetric(opsPerSec, "ops/s")
-}
-
-func TestBenchmark_BenchTell(t *testing.T) {
-	ctx := context.TODO()
-
-	actorsCount := 2000
-	workersCount := 20
-	duration := 30 * time.Second
-
-	benchmark := NewBenchmark(actorsCount, workersCount, duration)
-	require.NoError(t, benchmark.Start(ctx))
-
-	fmt.Printf("Starting benchmark for (%v): num workers:(%d)\n", duration, workersCount)
-	if err := benchmark.BenchTell(ctx); err != nil {
-		t.Fatal(err)
-	}
-
-	fmt.Printf("Go Version: %s\n", runtime.Version())
-	fmt.Printf("cpu: %s (Physical Cores: %d)\n", CPU.BrandName, CPU.PhysicalCores)
-	fmt.Printf("Runtime CPUs: %d\n", runtime.NumCPU())
-	fmt.Printf("Total actors spawned: (%d)\n", actorsCount)
-	fmt.Printf("Total workers: (%d), total messages sent: (%d), total messages received: (%d) - duration: (%v)\n", workersCount, totalSent.Load(), totalRecv.Load(), duration)
-	fmt.Printf("Messages per second: (%d)\n", totalRecv.Load()/int64(duration.Seconds()))
-	t.Cleanup(func() {
-		require.NoError(t, benchmark.Stop(ctx))
-	})
-}
-
-func TestBenchmark_BenchAsk(t *testing.T) {
-	ctx := context.TODO()
-
-	actorsCount := 2000
-	workersCount := 20
-	duration := 30 * time.Second
-
-	benchmark := NewBenchmark(actorsCount, workersCount, duration)
-	require.NoError(t, benchmark.Start(ctx))
-
-	fmt.Printf("Starting benchmark for (%v): num workers:(%d)\n", duration, workersCount)
-	if err := benchmark.BenchAsk(ctx); err != nil {
-		t.Fatal(err)
-	}
-
-	fmt.Printf("Go Version: %s\n", runtime.Version())
-	fmt.Printf("cpu: %s (Physical Cores: %d)\n", CPU.BrandName, CPU.PhysicalCores)
-	fmt.Printf("Runtime CPUs: %d\n", runtime.NumCPU())
-	fmt.Printf("Total actors spawned: (%d)\n", actorsCount)
-	fmt.Printf("Total workers: (%d), total messages sent: (%d), total messages received: (%d) - duration: (%v)\n", workersCount, totalSent.Load(), totalRecv.Load(), duration)
-	fmt.Printf("Messages per second: (%d)\n", totalRecv.Load()/int64(duration.Seconds()))
-	t.Cleanup(func() {
-		require.NoError(t, benchmark.Stop(ctx))
-	})
-}