我正在构建一个包含多个lambda函数的应用程序,它将成为现有应用程序环境的一部分。
与此有关的问题:我不知道如何以简单的方式扩展具有唯一跟踪ID的日志,以使与一个事务有关的所有日志都使用相同的ID记录。 / p>
要对其中一个过程提供一些见识:
lambda #1
正在使用express,并且正在通过ApiGateway公开API。在一项“交易”中,它还在SQS中排队一些事件。lambda #2
正在定期轮询队列,并且正在执行其他一些工作。之后,它将直接调用lambda #1
以完成交易。整个流程如下:some other app
-使用TraceID的请求-> ApiGateway
-> lambda #1
-> SQS
-> lambda #2
-> { {1}}。
我到目前为止所做的事情
我正在使用request-context来跟踪请求。但是,如果您有一个有效的请求上下文,那就可以了。因此,lambda #1
在最后阶段调用了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);
}
在这种情况下,如何获取我的跟踪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
中的内部路由器。
尽管如此,我仍然对独立解决方案感兴趣。