如何在 azure 函数 http 触发器中触发失败,并带有自定义错误响应

Posted

技术标签:

【中文标题】如何在 azure 函数 http 触发器中触发失败,并带有自定义错误响应【英文标题】:How to trigger a failure in an azure function http trigger, WITH a custom error response 【发布时间】:2017-09-25 21:03:51 【问题描述】:

我找不到使对 nodejs azure 函数的 http 调用失败并包含自定义错误响应的方法。

调用 context.done() 允许自定义响应(但在 Application Insights 中未指示为失败)

调用 context.done(true, XXX) 确实会导致失败,但会向用户返回一般错误(无论我在 XXX 中输入了什么):

"id":"b6ca6fb0-686a-4a9c-8c66-356b6db51848","requestId":"7599d94b-d3f2-48fe-80cd-e067bb1c8557","statusCode":500,"errorCode":0,"message":"An error has occurred. For more information, please check the logs for error ID b6ca6fb0-686a-4a9c-8c66-356b6db51848"

这只是我在尝试在 Azure funcs 上运行快速 Web api 时遇到的最新问题。如果您无法跟踪错误,那么它几乎不应该被称为“Application Insights”。有任何想法吗?

【问题讨论】:

【参考方案1】:

Success 将是真实的,但 resultCode 将设置为您的值。

尝试这样的 AppInsights 查询:

// Get all errors
requests
| where toint(resultCode) >= 400
| limit 10

[更新] Requests 中的 Id 值是“函数实例 id”,它唯一地标识了该调用。

还有一个“跟踪”表,其中包含来自您的 azure 函数的日志消息。您可以通过 operation_Id 在请求和跟踪之间加入。

requests 
| where toint(resultCode) >= 400
| take 10 
| join (traces) on operation_Id 
| project id, message, operation_Id

响应正文不会自动记录到 AppInsights。您需要添加一些显式的日志语句来捕获它。

【讨论】:

列出了请求的行,但没有像“失败”视图那样指向跟踪日志的链接。除了失败次​​数之外,基本上没有任何有用的调试信息。 更新了答案以显示如何获取跟踪日志和加入请求。 也是“Application Insights”的一部分。我无法从应用洞察中进入“分析”查询页面。这似乎是一项完全不同的服务。为什么MS必须如此混乱?哇,一旦您找到一个显示“分析”的按钮并单击它,它会将您带到一个标有“Application Insights”的页面,而实际的“Application Insights”仪表板无法访问该页面。 这个视图中的每个跟踪似乎都具有完全相同的毫秒时间戳,这意味着它们不能被排序。知道如何投影实际跟踪的时间戳吗? 接受此作为最佳答案,但仍然觉得您应该能够触发失败并设置自定义消息,而不是不触发失败并搜索错误结果代码的分析。跨度> 【参考方案2】:

为什么不使用context.res 为 HTTP 触发函数返回客户响应?

【讨论】:

这对用户来说很好,但让您无法跟踪应用程序洞察力中的错误。它被认为是成功的。如果你在 done() 中输入了一个真实的值,那么它会作为错误跟踪但忽略你的身体并替换 bs 响应。 要为 Azure 函数设置 Application Insights,请查看 this documentation 和 this post。 我正在尝试在门户中使用预定义的“失败”视图。我知道我可以安装一堆库并进行自定义事件抛出,但在我看来,跟踪失败的请求应该是内置在“无服务器”托管环境中的东西。

以上是关于如何在 azure 函数 http 触发器中触发失败,并带有自定义错误响应的主要内容,如果未能解决你的问题,请参考以下文章

如何延迟读取触发 HTTP 请求的正文,直到稍后在 Azure 函数中?

Azure 函数:如何将 http 触发器函数的查询字符串参数绑定到 Cosmos DB 的 SQL 查询

Http 触发器启用 Azure 函数超时

如何从 HTTP 触发的 Azure 函数返回 blob?

HTTP 按需触发 Azure 函数多次调用自身

如何编写将部分传入消息传递给服务总线队列的 Azure HTTP 触发器函数?