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")