AWS Lambda 执行 15-20 秒以将遥测事件发送到 Azure Application Insights
AWS Lambda executes for 15-20 seconds for sending telemetry events to Azure Application Insights
我需要在记录到日志组时将日志从云监视日志组发送到 Application Insights 实例。我试图通过添加一个云监视日志组作为我的 Lambda 的触发器来做到这一点,在我的 Lambda 中,我正在使用应用程序洞察库将事件发送到 AI 实例。
当我的 lambda 的默认执行超时为 3 秒时,我无法在我的 AI 实例中看到任何日志我的 lambda 成功执行并在 2-3 秒后终止。当我将超时增加到 20 秒时,我可以看到在 AI 中填充了日志并且我的 lambda 执行了 15-17 秒。
我的理解是AI telemetry client是批量发送数据,在发送前暂存在磁盘中。由于 lambda 的资源正在退役 post 它的执行,我可能会丢失这些事件,因为它们可能尚未推出。
如何保证AI遥测客户端不对这些事件进行批处理,一收到就发送?
下面是我的 Lambda 代码
exports.handler = (event, context, callback) => {
var zlib = require("zlib");
var appInsights = require("applicationinsights");
appInsights.setup("<My Subscription Key>").setUseDiskRetryCaching(false);;
var client = appInsights.defaultClient;
// TODO implement
var payload = new Buffer.from(event.awslogs.data, 'base64');
zlib.gunzip(payload, function(err, dezipped) {
if (!err) {
client.trackEvent({ name: dezipped.toString() });
}
});
client.flush();
};
我应该遵循什么其他方法或最佳实践来实现我的目标?
你不见了,
context.callbackWaitsForEmptyEventLoop = false;
在您的代码中。
请在立即进入函数后添加此内容,并调用带有响应的回调以退出流程。
修改后的代码为:
exports.handler = (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
var zlib = require("zlib");
var appInsights = require("applicationinsights");
appInsights.setup("<My Subscription Key>").setUseDiskRetryCaching(false);;
var client = appInsights.defaultClient;
// TODO implement
var payload = new Buffer.from(event.awslogs.data, 'base64');
function gunzipcomplete() {
client.flush();
callback(null, done);
}
zlib.gunzip(payload, function(err, dezipped) {
if (!err) {
client.trackEvent({ name: dezipped.toString() });
}
gunzipcomplete(); // this is a complete.
});
};
希望对您有所帮助。
我可以看到这种行为,只有当我的 lambda 在上一次调用后几分钟的间隔后执行时。我以 1 秒的间隔连续尝试 运行 lambda,我可以看到只有第一个请求花费那么多时间,而后续请求平均不超过 400 毫秒。这是因为对于第一个 lambda 执行请求,AWS 需要一些时间来委托资源,如果 lambda 在第一次调用中快速连续调用 post,则使用相同的资源。
看来我的理解 "resources for lambda are get decommissioned post its execution" 不完整。
我需要在记录到日志组时将日志从云监视日志组发送到 Application Insights 实例。我试图通过添加一个云监视日志组作为我的 Lambda 的触发器来做到这一点,在我的 Lambda 中,我正在使用应用程序洞察库将事件发送到 AI 实例。
当我的 lambda 的默认执行超时为 3 秒时,我无法在我的 AI 实例中看到任何日志我的 lambda 成功执行并在 2-3 秒后终止。当我将超时增加到 20 秒时,我可以看到在 AI 中填充了日志并且我的 lambda 执行了 15-17 秒。
我的理解是AI telemetry client是批量发送数据,在发送前暂存在磁盘中。由于 lambda 的资源正在退役 post 它的执行,我可能会丢失这些事件,因为它们可能尚未推出。
如何保证AI遥测客户端不对这些事件进行批处理,一收到就发送?
下面是我的 Lambda 代码
exports.handler = (event, context, callback) => {
var zlib = require("zlib");
var appInsights = require("applicationinsights");
appInsights.setup("<My Subscription Key>").setUseDiskRetryCaching(false);;
var client = appInsights.defaultClient;
// TODO implement
var payload = new Buffer.from(event.awslogs.data, 'base64');
zlib.gunzip(payload, function(err, dezipped) {
if (!err) {
client.trackEvent({ name: dezipped.toString() });
}
});
client.flush();
};
我应该遵循什么其他方法或最佳实践来实现我的目标?
你不见了,
context.callbackWaitsForEmptyEventLoop = false;
在您的代码中。
请在立即进入函数后添加此内容,并调用带有响应的回调以退出流程。
修改后的代码为:
exports.handler = (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false;
var zlib = require("zlib");
var appInsights = require("applicationinsights");
appInsights.setup("<My Subscription Key>").setUseDiskRetryCaching(false);;
var client = appInsights.defaultClient;
// TODO implement
var payload = new Buffer.from(event.awslogs.data, 'base64');
function gunzipcomplete() {
client.flush();
callback(null, done);
}
zlib.gunzip(payload, function(err, dezipped) {
if (!err) {
client.trackEvent({ name: dezipped.toString() });
}
gunzipcomplete(); // this is a complete.
});
};
希望对您有所帮助。
我可以看到这种行为,只有当我的 lambda 在上一次调用后几分钟的间隔后执行时。我以 1 秒的间隔连续尝试 运行 lambda,我可以看到只有第一个请求花费那么多时间,而后续请求平均不超过 400 毫秒。这是因为对于第一个 lambda 执行请求,AWS 需要一些时间来委托资源,如果 lambda 在第一次调用中快速连续调用 post,则使用相同的资源。
看来我的理解 "resources for lambda are get decommissioned post its execution" 不完整。