node.js - 节点:被其他 lambda 函数调用时请求上下文
问题描述
我正在构建一个由多个 lambda 函数组成的应用程序,它将成为现有应用程序环境的一部分。
我对此的问题:我不知道如何以一种简单的方式使用唯一的跟踪 id 扩展我的日志,以便所有关于一个事务的日志都使用相同的 id 记录。
要对其中一个过程提供一些见解:
lambda #1
正在使用 express 并通过 ApiGateway 公开 API。在一个“事务”中,它还在 SQS 中对一些事件进行排队。lambda #2
正在定期轮询队列并正在做一些其他工作。之后它lambda #1
直接调用以完成事务。
所以整个流程:some other app
--Request with TraceID--> ApiGateway
-> lambda #1
-> SQS
-> lambda #2
-> lambda #1
。
到目前为止
,我正在使用request-context来跟踪请求。但是,如果你有一个有效的请求上下文,那就行了。lambda #1
因此,在最后阶段调用它之后,我无法使用正确的跟踪 id 登录lambda #2
(即在其请求中提交跟踪 id)。
的调用点lambda #1
如下所示:
export function handler(event: any, context: any) {
if (event.targetAction) {
switch (event.targetAction as TargetAction) {
// invocation by lambda #2 will end up here
// we got no request context for express
case TargetAction.FINISH_TRANSACTION:
/** do some other work **/
return;
default:
/** **/
}
}
return awsServerlessExpress.proxy(server, event, context);
}
在这种情况下,如何将我的 trace-id 获取到日志中?
其他想法:
- 我可以做一个解决方法,添加一个新路由,
lambda #1
并向我的事件提交一个路径和 http 方法,然后将它传递给代理处理程序,这样我们就可以使用快速路由。似乎是一个糟糕的解决方案。
对于这方面的每一个帮助或想法,我都感到非常高兴,即使它指向了我完全不同的方向。
编辑
现在我正在使用运行良好的解决方法。我创建了一个供内部使用的路由器。如果有人感兴趣,这就是处理程序的样子:
export function handler(event: any, context: any) {
if (event.targetAction) {
switch (event.targetAction as TargetAction) {
case TargetAction.UPDATE_TRANSACTION:
const updateEvent: ExpressProxyEvent = {
path: '/internal/update-transaction',
headers: {
'Content-Type': 'application/json',
'x-trace-id': event.xtraceId,
'x-internal-router-secret': Constants.INTERNAL_ROUTER_SECRET
},
body: JSON.stringify(event),
httpMethod: 'POST'
};
event = updateEvent;
break;
case /** **/
}
return awsServerlessExpress.proxy(server, event, context);
}
这样,当由另一个 lambda 函数直接调用时,traceId 可以在请求上下文中间件中设置(事件也可以在 中正确创建lambda #2
,但它需要知道内部路由器的路径和方法lambda #1
)。
尽管如此,我仍然对独立解决方案感兴趣。
解决方案
推荐阅读
- python - 如何使用 qyery 返回无在 Django 列表视图上获取外键的名称
- python - 正则表达式匹配一个字符串及其周围的 2 个字符
- html - 如何为最近的祖先提供 XPath?
- ios - Ionic IOS 谷歌登录移动“location.protocol”科尔多瓦
- javascript - Formik - 如何清除字段并显示自定义错误
- python - 如何在 python 3.8 中永久保存用户输入的数据?
- python - 如何使用 Telethon,python 仅接收来自电报频道的新消息
- django - pdfkit:包含水印的标题不重复
- c - 为什么 for 循环中的 printf 有人可以解释我吗?
- c# - 以编程方式设置 ListBox 以滚动到所选项目