This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

错误码

使用 Dapr 时可能遇到的错误码和消息

1 - 错误概述

Dapr 错误概述

错误码是一个数字或字母数字代码,用于指示错误的性质,并在可能的情况下说明错误发生的原因。

Dapr 错误码是使用 Dapr API 进行 HTTP 和 gRPC 请求时 80 多种常见错误的标准化字符串。这些代码同时具备以下功能:

  • 在请求的 JSON 响应体中返回。
  • 启用后,在运行时日志中以 debug 级别记录。
    • 如果在 Kubernetes 中运行,错误码会记录在边车中。
    • 如果在自托管模式下运行,你可以启用并运行 debug 日志。

错误格式

Dapr 错误码由前缀、类别和错误简写组成。例如:

前缀类别错误简写
ERR_PUBSUB_NOT_FOUND

一些最常见的返回错误包括:

  • ERR_ACTOR_TIMER_CREATE
  • ERR_PURGE_WORKFLOW
  • ERR_STATE_STORE_NOT_FOUND
  • ERR_HEALTH_NOT_READY

注意: 查看 Dapr 中的完整错误码列表。

状态存储未找到时返回的错误可能如下所示:

{
  "error": "Bad Request",
  "error_msg": "{\"errorCode\":\"ERR_STATE_STORE_NOT_FOUND\",\"message\":\"state store <name> is not found\",\"details\":[{\"@type\":\"type.googleapis.com/google.rpc.ErrorInfo\",\"domain\":\"dapr.io\",\"metadata\":{\"appID\":\"nodeapp\"},\"reason\":\"DAPR_STATE_NOT_FOUND\"}]}",
  "status": 400
}

返回的错误包含:

  • 错误码:ERR_STATE_STORE_NOT_FOUND
  • 描述问题的错误消息:state store <name> is not found
  • 发生错误的应用程序 ID:nodeapp
  • 错误原因:DAPR_STATE_NOT_FOUND

Dapr 错误码指标

指标帮助你查看运行时内部错误发生的具体时间。错误码指标通过 error_code_total 端点收集。该端点默认禁用。你可以通过在配置文件中使用 recordErrorCodes 字段来启用它

演示

观看在 Diagrid Dapr v1.15 庆祝活动上呈现的演示,了解如何启用错误码指标以及如何处理运行时中返回的错误码。

下一步

查看所有 Dapr 错误码列表

2 - 错误码参考指南

Dapr 中的 gRPC 和 HTTP 错误码及其描述列表

以下表格列出了 Dapr 运行时返回的错误码。 错误码在 HTTP 请求的响应体中返回,或在 gRPC 状态响应的 ErrorInfo 部分中返回(如果存在)。 一项正在推进的工作是,根据 Richer Error Model 丰富所有 gRPC 错误响应。尚无对应 gRPC 代码的错误码表示这些错误尚未更新到此模型。

Actors API

HTTP CodegRPC CodeDescription
ERR_ACTOR_INSTANCE_MISSING缺少 actor 实例
ERR_ACTOR_INVOKE_METHOD调用 actor 方法时出错
ERR_ACTOR_RUNTIME_NOT_FOUND未找到 actor 运行时
ERR_ACTOR_STATE_GET获取 actor 状态时出错
ERR_ACTOR_STATE_TRANSACTION_SAVE保存 actor 事务时出错
ERR_ACTOR_REMINDER_CREATE创建 actor reminder 时出错
ERR_ACTOR_REMINDER_DELETE删除 actor reminder 时出错
ERR_ACTOR_REMINDER_GET获取 actor reminder 时出错
ERR_ACTOR_REMINDER_NON_HOSTED在非托管 actor 类型上执行 reminder 操作
ERR_ACTOR_TIMER_CREATE创建 actor timer 时出错
ERR_ACTOR_NO_APP_CHANNEL应用通道未初始化
ERR_ACTOR_STACK_DEPTH超出最大 actor 调用栈深度
ERR_ACTOR_NO_PLACEMENT未配置 Placement 服务
ERR_ACTOR_RUNTIME_CLOSEDActor 运行时已关闭
ERR_ACTOR_NAMESPACE_REQUIRED在 Kubernetes 模式下运行时,actor 必须配置命名空间
ERR_ACTOR_NO_ADDRESS未找到 actor 的地址

工作流 API

HTTP CodegRPC CodeDescription
ERR_GET_WORKFLOW获取工作流时出错
ERR_START_WORKFLOW启动工作流时出错
ERR_PAUSE_WORKFLOW暂停工作流时出错
ERR_RESUME_WORKFLOW恢复工作流时出错
ERR_TERMINATE_WORKFLOW终止工作流时出错
ERR_PURGE_WORKFLOW清除工作流时出错
ERR_RAISE_EVENT_WORKFLOW在工作流中引发事件时出错
ERR_WORKFLOW_COMPONENT_MISSING缺少工作流组件
ERR_WORKFLOW_COMPONENT_NOT_FOUND未找到工作流组件
ERR_WORKFLOW_EVENT_NAME_MISSING缺少工作流事件名称
ERR_WORKFLOW_NAME_MISSING未配置工作流名称
ERR_INSTANCE_ID_INVALID工作流实例 ID 无效。(仅允许字母数字和下划线字符)
ERR_INSTANCE_ID_NOT_FOUND未找到工作流实例 ID
ERR_INSTANCE_ID_PROVIDED_MISSING缺少工作流实例 ID
ERR_INSTANCE_ID_TOO_LONG工作流实例 ID 过长

状态管理 API

HTTP CodegRPC CodeDescription
ERR_STATE_TRANSACTION状态事务出错
ERR_STATE_SAVE保存状态时出错
ERR_STATE_GET获取状态时出错
ERR_STATE_DELETE删除状态时出错
ERR_STATE_BULK_DELETE批量删除状态时出错
ERR_STATE_BULK_GET批量获取状态时出错
ERR_NOT_SUPPORTED_STATE_OPERATION事务中不支持该操作
ERR_STATE_QUERYDAPR_STATE_QUERY_FAILED查询状态时出错
ERR_STATE_STORE_NOT_FOUNDDAPR_STATE_NOT_FOUND未找到状态存储
ERR_STATE_STORE_NOT_CONFIGUREDDAPR_STATE_NOT_CONFIGURED状态存储未配置
ERR_STATE_STORE_NOT_SUPPORTEDDAPR_STATE_TRANSACTIONS_NOT_SUPPORTED状态存储不支持事务
ERR_STATE_STORE_NOT_SUPPORTEDDAPR_STATE_QUERYING_NOT_SUPPORTED状态存储不支持查询
ERR_STATE_STORE_TOO_MANY_TRANSACTIONSDAPR_STATE_TOO_MANY_TRANSACTIONS单个事务中的操作数过多
ERR_MALFORMED_REQUESTDAPR_STATE_ILLEGAL_KEY键无效

Configuration API

HTTP CodegRPC CodeDescription
ERR_CONFIGURATION_GET获取配置时出错
ERR_CONFIGURATION_STORE_NOT_CONFIGURED配置存储未配置
ERR_CONFIGURATION_STORE_NOT_FOUND未找到配置存储
ERR_CONFIGURATION_SUBSCRIBE订阅配置时出错
ERR_CONFIGURATION_UNSUBSCRIBE取消订阅配置时出错

密码学 API

HTTP CodegRPC CodeDescription
ERR_CRYPTO密码学操作出错
ERR_CRYPTO_KEY获取密码学密钥时出错
ERR_CRYPTO_PROVIDER_NOT_FOUND未找到密码学提供程序
ERR_CRYPTO_PROVIDERS_NOT_CONFIGURED密码学提供程序未配置

Secrets API

HTTP CodegRPC CodeDescription
ERR_SECRET_GET获取 secret 时出错
ERR_SECRET_STORE_NOT_FOUND未找到 secret 存储
ERR_SECRET_STORES_NOT_CONFIGUREDSecret 存储未配置
ERR_PERMISSION_DENIED策略拒绝权限

发布订阅和消息错误

HTTP CodegRPC CodeDescription
ERR_PUBSUB_EMPTYDAPR_PUBSUB_NAME_EMPTYPubsub 名称为空
ERR_PUBSUB_NOT_FOUNDDAPR_PUBSUB_NOT_FOUND未找到 Pubsub
ERR_PUBSUB_NOT_FOUNDDAPR_PUBSUB_TEST_NOT_FOUND未找到 Pubsub
ERR_PUBSUB_NOT_CONFIGUREDDAPR_PUBSUB_NOT_CONFIGUREDPubsub 未配置
ERR_TOPIC_NAME_EMPTYDAPR_PUBSUB_TOPIC_NAME_EMPTY主题名称为空
ERR_PUBSUB_FORBIDDENDAPR_PUBSUB_FORBIDDEN应用 ID 被禁止访问主题
ERR_PUBSUB_PUBLISH_MESSAGEDAPR_PUBSUB_PUBLISH_MESSAGE发布消息时出错
ERR_PUBSUB_REQUEST_METADATADAPR_PUBSUB_METADATA_DESERIALIZATION反序列化元数据时出错
ERR_PUBSUB_CLOUD_EVENTS_SERDAPR_PUBSUB_CLOUD_EVENT_CREATION创建 CloudEvent 时出错
ERR_PUBSUB_EVENTS_SERDAPR_PUBSUB_MARSHAL_ENVELOPE封送 Cloud Event 信封时出错
ERR_PUBSUB_EVENTS_SERDAPR_PUBSUB_MARSHAL_EVENTS将事件封送为字节时出错
ERR_PUBSUB_EVENTS_SERDAPR_PUBSUB_UNMARSHAL_EVENTS反封送事件时出错
ERR_PUBLISH_OUTBOX向 outbox 发布消息时出错

对话 API

HTTP CodegRPC CodeDescription
ERR_CONVERSATION_INVALID_PARMS对话组件参数无效
ERR_CONVERSATION_INVOKE调用对话时出错
ERR_CONVERSATION_MISSING_INPUTS缺少对话输入
ERR_CONVERSATION_NOT_FOUND未找到对话

服务调用 / 直接消息 API

HTTP CodegRPC CodeDescription
ERR_DIRECT_INVOKE调用服务时出错

Bindings API

HTTP CodegRPC CodeDescription
ERR_INVOKE_OUTPUT_BINDING调用输出绑定时出错

分布式锁 API

HTTP CodegRPC CodeDescription
ERR_LOCK_STORE_NOT_CONFIGURED锁存储未配置
ERR_LOCK_STORE_NOT_FOUND未找到锁存储
ERR_TRY_LOCK获取锁时出错
ERR_UNLOCK释放锁时出错

健康检查

HTTP CodegRPC CodeDescription
ERR_HEALTH_NOT_READYDapr 未就绪
ERR_HEALTH_APPID_NOT_MATCHDapr App ID 不匹配
ERR_OUTBOUND_HEALTH_NOT_READYDapr 出站未就绪

通用

HTTP CodegRPC CodeDescription
ERR_API_UNIMPLEMENTEDAPI 未实现
ERR_APP_CHANNEL_NIL应用通道为 nil
ERR_BAD_REQUEST错误请求
ERR_BODY_READ读取请求体时出错
ERR_INTERNAL内部错误
ERR_MALFORMED_REQUEST格式错误的请求
ERR_MALFORMED_REQUEST_DATA格式错误的请求数据
ERR_MALFORMED_RESPONSE格式错误的响应

Scheduler/Jobs API

HTTP CodegRPC CodeDescription
DAPR_SCHEDULER_SCHEDULE_JOBDAPR_SCHEDULER_SCHEDULE_JOB调度任务时出错
DAPR_SCHEDULER_JOB_NAMEDAPR_SCHEDULER_JOB_NAME作业名称只能设置在 URL 中
DAPR_SCHEDULER_JOB_NAME_EMPTYDAPR_SCHEDULER_JOB_NAME_EMPTY作业名称为空
DAPR_SCHEDULER_GET_JOBDAPR_SCHEDULER_GET_JOB获取任务时出错
DAPR_SCHEDULER_LIST_JOBSDAPR_SCHEDULER_LIST_JOBS列出任务时出错
DAPR_SCHEDULER_DELETE_JOBDAPR_SCHEDULER_DELETE_JOB删除任务时出错
DAPR_SCHEDULER_EMPTYDAPR_SCHEDULER_EMPTY必需参数为空
DAPR_SCHEDULER_SCHEDULE_EMPTYDAPR_SCHEDULER_SCHEDULE_EMPTY未提供任务的调度计划

通用

HTTP CodegRPC CodeDescription
ERRORERROR通用错误

后续步骤

3 - 处理 HTTP 错误代码

Dapr HTTP 错误代码的详细参考以及如何处理它们

对于发往 Dapr 运行时的 HTTP 调用,当遇到错误时,会在响应正文中返回一个错误 JSON。该 JSON 包含一个错误代码和一条描述性错误消息。

{
    "errorCode": "ERR_STATE_GET",
    "message": "Requested state key does not exist in state store."
}

相关

4 - 处理 gRPC 错误码

有关 Dapr gRPC 错误及其处理方法的信息

最初,错误遵循标准 gRPC 错误模型。然而,为了提供更详细和更有信息量的错误消息,定义了一个增强的错误模型,该模型与 gRPC 更丰富的错误模型保持一致。

标准 gRPC 错误模型

标准 gRPC 错误模型是 gRPC 中的一种错误报告方法。每个错误响应包含一个错误码和一个错误消息。错误码是标准化的,反映了常见的错误条件。

标准 gRPC 错误响应示例:

ERROR:
  Code: InvalidArgument
  Message: input key/keyPrefix 'bad||keyname' can't contain '||'

更丰富的 gRPC 错误模型

更丰富的 gRPC 错误模型通过提供有关错误的额外上下文和详细信息来扩展标准错误模型。该模型包括标准的错误 codemessage,以及一个 details 部分,其中可以包含各种类型的信息,例如 ErrorInfoResourceInfoBadRequest 详细信息。

更丰富的 gRPC 错误响应示例:

ERROR:
  Code: InvalidArgument
  Message: input key/keyPrefix 'bad||keyname' can't contain '||'
  Details:
  1)	{
    	  "@type": "type.googleapis.com/google.rpc.ErrorInfo",
    	  "domain": "dapr.io",
    	  "reason": "DAPR_STATE_ILLEGAL_KEY"
    	}
  2)	{
    	  "@type": "type.googleapis.com/google.rpc.ResourceInfo",
    	  "resourceName": "statestore",
    	  "resourceType": "state"
    	}
  3)	{
    	  "@type": "type.googleapis.com/google.rpc.BadRequest",
    	  "fieldViolations": [
    	    {
    	      "field": "bad||keyname",
    	      "description": "input key/keyPrefix 'bad||keyname' can't contain '||'"
    	    }
    	  ]
    	}

对于 HTTP 客户端,Dapr 将 gRPC 错误模型转换为类似的 JSON 格式结构。响应包括一个 errorCode、一个 message 和一个 details 数组,该数组反映了在更丰富的 gRPC 模型中找到的结构。

HTTP 错误响应示例:

{
    "errorCode": "ERR_MALFORMED_REQUEST",
    "message": "api error: code = InvalidArgument desc = input key/keyPrefix 'bad||keyname' can't contain '||'",
    "details": [
        {
            "@type": "type.googleapis.com/google.rpc.ErrorInfo",
            "domain": "dapr.io",
            "metadata": null,
            "reason": "DAPR_STATE_ILLEGAL_KEY"
        },
        {
            "@type": "type.googleapis.com/google.rpc.ResourceInfo",
            "description": "",
            "owner": "",
            "resource_name": "statestore",
            "resource_type": "state"
        },
        {
            "@type": "type.googleapis.com/google.rpc.BadRequest",
            "field_violations": [
                {
                    "field": "bad||keyname",
                    "description": "api error: code = InvalidArgument desc = input key/keyPrefix 'bad||keyname' can't contain '||'"
                }
            ]
        }
    ]
}

你可以在这里找到所有可能的状态详情的规范。

相关链接