【问题标题】:Application Insights metric in AWS LambdaAWS Lambda 中的 Application Insights 指标
【发布时间】:2018-03-24 14:37:35
【问题描述】:

我正在尝试从用 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 客户端代码以使其可靠工作且不会导致超时?这是怎么回事?

【问题讨论】:

    标签: javascript amazon-web-services aws-lambda azure-application-insights


    【解决方案1】:

    适用于 Node 的 Application Insights SDK 具有针对传统长时间运行的服务器方案进行了优化的默认配置。干扰此用例的主要因素是遥测数据的批处理和延迟发送,因为等待更多遥测数据批处理使事件循环保持打开状态。

    最简单的解决方法是刷新遥测客户端:

    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),因为磁盘重试功能似乎也使事件循环保持打开状态。

    【讨论】:

    • 谢谢,好像解决了不发货的问题。但是我仍然需要做callbackWaitsForEmptyEventLoop = false 以避免超时。有什么方法可以正确关闭AI客户端?
    • 有趣!我提供的原始代码示例在与虚拟仪器密钥一起使用时有效,但正如您注意到的那样,与真正的仪器密钥一起使用时会超时。我已经通过额外的配置更改更新了答案,在我的测试功能中完全修复了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    相关资源
    最近更新 更多