我尝试记录在node.js中编写的AWS Lambda中的Application Insights指标。这是我的代码:
const appInsights = require("applicationinsights");
appInsights.setup("<guid>");
module.exports.monitor = (event, context, callback) => {
let client = appInsights.defaultClient;
// context.callbackWaitsForEmptyEventLoop = false;
client.trackMetric({name: "AI Test", value: 25});
const response = { statusCode: 200, body: 'done' };
callback(null, response);
};
问题在于Lambda会超时。
如果我取消注释context.callbackWaitsForEmptyEventLoop = false;
语句,则超时消失且AWS正常工作。但我只在Application Insights中收到一个指标值:从第一次调用开始。随后的电话似乎再也没有了。
如何调整Application Insights客户端代码以便可靠地工作而不会导致超时?这里发生了什么?
答案 0 :(得分:4)
Application Insights SDK for Node具有针对传统长期运行的服务器方案进行了优化的默认配置。干扰此用例的主要因素是批量和延迟发送遥测,因为等待更多遥测到批处理是保持事件循环打开。
最简单的解决方法是刷新遥测客户端:
const appInsights = require("applicationinsights");
appInsights.setup("<guid>").setUseDiskRetryCaching(false);
module.exports.monitor = (event, context, callback) => {
let client = appInsights.defaultClient;
client.trackMetric({name: "AI Test", value: 25});
const response = { statusCode: 200, body: 'done' };
client.flush({callback: () => {
callback(null, response);
}});
};
或者,您可以尝试调整SDK配置以将批处理间隔缩短为0,如下所示:client.config.maxBatchIntervalMs = 0;
编辑已添加setUseDiskRetryCaching(false)
,因为磁盘重试功能似乎也会使事件循环保持打开状态。