errors

package
v0.0.0-...-949823d Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 10, 2024 License: Apache-2.0 Imports: 6 Imported by: 0

README

Error codes in Dapr

Introduction

This guide is intended for developers working on the Dapr code base, specifically for those updating the error handling to align with the gRPC richer error model. The goal is to standardize error responses across Dapr's services.

Prerequisites

Step 1: Understanding the Current Error Handling

Currently, error handling in Dapr is a mix of predefined errors and dynamically constructed errors within the code.

  • Predefined Errors: There are some legacy predefined errors located at /pkg/messages/predefined.go, but the new errors are located in /pkg/api/errors. These errors are standard and reused across various parts of the Dapr codebase. They provide a consistent error handling mechanism for common scenarios.
  • Dynamically Constructed Errors: These errors are created on the fly within the code, typically to handle specific situations or errors that are not covered by the predefined set.

As we move predefined errors to the rich error model and a new location (pkg/api/errors), the first step in updating to the new error model is to familiarize yourself with the existing error handling patterns, both predefined and dynamically constructed. This understanding will be crucial when replacing them with the richer error model aligned with gRPC standards.

Step 2: Adding New Errors

  1. Check for existing errors: Before creating a new error, check if a relevant error file exists in /pkg/api/errors/.
  2. Create a new error file: If no relevant file exists, create a new file following the pattern <building-block>.go.

Step 3: Designing Rich Error Messages

  1. Understand Rich Error Construction: Familiarize yourself with the construction of rich error messages. The definition can be found in github.com/dapr/kit/errors.
  2. Helper Methods: Utilize the error builder and the helper methods like WithErrorInfo, WithResourceInfo to enrich error information.
  3. Reference implementation: You can check out pkg/api/errors/state.go for a reference implementation. The following code snippet shows how to create a new error using the helper methods:
func (s *StateStoreError) InvalidKeyName(key string, msg string) error {
	return s.build(
		errors.NewBuilder(
			codes.InvalidArgument,
			http.StatusBadRequest,
			msg,
			"ERR_MALFORMED_REQUEST",
		).WithFieldViolation(key, msg),
		errors.CodeIllegalKey,
		nil,
	)
}
  1. Mandatory and Optional Information:
    • ErrorInfo: This is a required field.
    • ResourceInfo and other Details fields: These are optional but should be used following best practices as outlined in the Google Cloud Error Model.

Step 4: Implementing the New Error Model

  1. Consistent Use: Ensure that the new error model is used consistently throughout the codebase.
  2. Refactoring: Replace existing errors in the code with the newly defined rich errors.

Step 5: Testing and Integration

  1. Integration Tests: Add integration tests for the new error handling mechanism.
  2. Follow Existing Patterns: Use the existing integration tests for the state API as a reference for structure and best practices. For example, these are the integration tests for the errors in state api: /tests/integration/suite/daprd/state/grpc/errors.go and /tests/integration/suite/daprd/state/http/errors.go

Documentation

Index

Constants

View Source
const (
	CodePrefixScheduler               = "SCHEDULER_" // TODO(Cassie): move this to kit eventually
	InFixJob            ReasonSegment = "JOB_"
	InFixAppID          ReasonSegment = "APPID_"
	InFixGet            ReasonSegment = "GET_"
	InFixList           ReasonSegment = "LIST_"
	InFixDelete         ReasonSegment = "DELETE_"
	InFixSchedule       ReasonSegment = "SCHEDULE_"
	PostFixRepeats      ReasonSegment = "REPEATS"
	PostFixJob          ReasonSegment = "JOB"
	PostFixJobs         ReasonSegment = "JOBS"

	MsgScheduleJob = "failed to schedule job"
	MsgGetJob      = "failed to get job"
	MsgListJobs    = "failed to list jobs"
	MsgDeleteJob   = "failed to delete job"
)

Variables

This section is empty.

Functions

func ConstructReason

func ConstructReason(vars ...ReasonSegment) string

ConstructReason is used to append several Error Reason const strings into 1 Error Reason. The format of the string should generally follow this pattern: apierrors.CodePrefix<Dapr_API>_, apierrors.InFix<const>_,apierrors.PostFix<const>

func Empty

func Empty(name string, metadata map[string]string, reason string) error

func IncorrectNegative

func IncorrectNegative(name string, metadata map[string]string, reason string) error

func NotConfigured

func NotConfigured(name string, componentType string, metadata map[string]string, grpcCode codes.Code, httpCode int, legacyTag string, reason string) error

func NotFound

func NotFound(name string, componentType string, metadata map[string]string, grpcCode codes.Code, httpCode int, legacyTag string, reason string) error

func PubSubOutbox

func PubSubOutbox(appID string, err error) error

func SchedulerDeleteJob

func SchedulerDeleteJob(metadata map[string]string, err error) error

func SchedulerGetJob

func SchedulerGetJob(metadata map[string]string, err error) error

func SchedulerListJobs

func SchedulerListJobs(metadata map[string]string, err error) error

func SchedulerScheduleJob

func SchedulerScheduleJob(metadata map[string]string, err error) error

func SchedulerURLName

func SchedulerURLName(metadata map[string]string) error

Types

type PubSubError

type PubSubError struct {
	// contains filtered or unexported fields
}

func PubSub

func PubSub(name string) *PubSubError

func (*PubSubError) PublishForbidden

func (p *PubSubError) PublishForbidden(topic, appID string, err error) error

func (PubSubError) PublishMessage

func (p PubSubError) PublishMessage(topic string, err error) error

func (PubSubError) TestNotFound

func (p PubSubError) TestNotFound(topic string, err error) error

This is specifically for the error we are expecting for the api_tests. The not found expected error codes are different than the existing ones for PubSubNotFound, hence why this one is needed

func (*PubSubError) WithAppError

func (p *PubSubError) WithAppError(appID string, err error) *PubSubMetadataError

func (*PubSubError) WithMetadata

func (p *PubSubError) WithMetadata(metadata map[string]string) *PubSubMetadataError

type PubSubMetadataError

type PubSubMetadataError struct {
	// contains filtered or unexported fields
}

func (*PubSubMetadataError) CloudEventCreation

func (p *PubSubMetadataError) CloudEventCreation() error

func (*PubSubMetadataError) DeserializeError

func (p *PubSubMetadataError) DeserializeError(err error) error

func (*PubSubMetadataError) NameEmpty

func (p *PubSubMetadataError) NameEmpty() error

func (*PubSubMetadataError) NotConfigured

func (p *PubSubMetadataError) NotConfigured() error

func (*PubSubMetadataError) NotFound

func (p *PubSubMetadataError) NotFound() error

func (*PubSubMetadataError) TopicEmpty

func (p *PubSubMetadataError) TopicEmpty() error

func (*PubSubMetadataError) WithTopic

func (p *PubSubMetadataError) WithTopic(topic string) *PubSubTopicError

type PubSubTopicError

type PubSubTopicError struct {
	// contains filtered or unexported fields
}

func (*PubSubTopicError) MarshalEnvelope

func (p *PubSubTopicError) MarshalEnvelope() error

func (*PubSubTopicError) MarshalEvents

func (p *PubSubTopicError) MarshalEvents() error

func (*PubSubTopicError) UnmarshalEvents

func (p *PubSubTopicError) UnmarshalEvents(err error) error

UnmarshalEvents only occurs in http/api.go

type ReasonSegment

type ReasonSegment string
const (
	InFixName     ReasonSegment = "NAME_"
	InFixNegative ReasonSegment = "NEGATIVE_"
	PostFixName   ReasonSegment = "NAME"
	PostFixEmpty  ReasonSegment = "EMPTY"
)

type StateStoreError

type StateStoreError struct {
	// contains filtered or unexported fields
}

func StateStore

func StateStore(name string) *StateStoreError

func (*StateStoreError) InvalidKeyName

func (s *StateStoreError) InvalidKeyName(key string, msg string) error

func (*StateStoreError) NotConfigured

func (s *StateStoreError) NotConfigured(appID string) error

func (*StateStoreError) NotFound

func (s *StateStoreError) NotFound(appID string) error

func (*StateStoreError) QueryFailed

func (s *StateStoreError) QueryFailed(detail string) error

func (*StateStoreError) QueryUnsupported

func (s *StateStoreError) QueryUnsupported() error

func (*StateStoreError) TooManyTransactionalOps

func (s *StateStoreError) TooManyTransactionalOps(count int, max int) error

func (*StateStoreError) TransactionsNotSupported

func (s *StateStoreError) TransactionsNotSupported() error

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL