From 4afe9ab7d9288975a8f0c8a2d8a0dfff3d53b50f Mon Sep 17 00:00:00 2001 From: Bogdan Drutu Date: Tue, 11 Feb 2025 21:30:18 -0800 Subject: [PATCH] Change memorylimiter and queue full errors to carry time-after information Signed-off-by: Bogdan Drutu --- exporter/exporterqueue/queue.go | 18 ++++++++++++++++-- internal/memorylimiter/memorylimiter.go | 15 ++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/exporter/exporterqueue/queue.go b/exporter/exporterqueue/queue.go index aa73c5708bc6..3ab1994f4f65 100644 --- a/exporter/exporterqueue/queue.go +++ b/exporter/exporterqueue/queue.go @@ -5,7 +5,12 @@ package exporterqueue // import "go.opentelemetry.io/collector/exporter/exporter import ( "context" - "errors" + "time" + + "google.golang.org/genproto/googleapis/rpc/errdetails" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/durationpb" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/exporter" @@ -16,7 +21,16 @@ import ( // not block. // Experimental: This API is at the early stage of development and may change without backward compatibility // until https://github.com/open-telemetry/opentelemetry-collector/issues/8122 is resolved. -var ErrQueueIsFull = errors.New("sending queue is full") +var ErrQueueIsFull = func() error { + st := status.New(codes.ResourceExhausted, "sending queue is full") + dt, err := st.WithDetails(&errdetails.RetryInfo{ + RetryDelay: durationpb.New(1 * time.Second), + }) + if err != nil { + panic(err) + } + return dt.Err() +}() // Done represents the callback that will be called when the read request is completely processed by the // downstream components. diff --git a/internal/memorylimiter/memorylimiter.go b/internal/memorylimiter/memorylimiter.go index 53371b8b85c9..f5a960f6cfe7 100644 --- a/internal/memorylimiter/memorylimiter.go +++ b/internal/memorylimiter/memorylimiter.go @@ -13,6 +13,10 @@ import ( "time" "go.uber.org/zap" + "google.golang.org/genproto/googleapis/rpc/errdetails" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/durationpb" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/internal/memorylimiter/iruntime" @@ -29,7 +33,16 @@ const ( var ( // ErrDataRefused will be returned to callers of ConsumeTraceData to indicate // that data is being refused due to high memory usage. - ErrDataRefused = errors.New("data refused due to high memory usage") + ErrDataRefused = func() error { + st := status.New(codes.ResourceExhausted, "data refused due to high memory usage") + dt, err := st.WithDetails(&errdetails.RetryInfo{ + RetryDelay: durationpb.New(1 * time.Second), + }) + if err != nil { + panic(err) + } + return dt.Err() + }() // ErrShutdownNotStarted indicates no memorylimiter has not start when shutdown ErrShutdownNotStarted = errors.New("no existing monitoring routine is running")