AWS Lambda выполняет 15-20 секунд для отправки событий телеметрии в Azure Application Insights. - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть требование отправлять журналы из группы журналов наблюдения за облаком в экземпляр Application Insights по мере того, как он регистрируется в группе журналов.Я пытаюсь сделать это, добавив группу журналов наблюдения за облаком в качестве триггера для моей лямбды, и внутри своей лямбды я использую библиотеку аналитики приложения, чтобы отправить событие в экземпляр AI.

Когда тайм-аут выполнения по умолчанию для моей лямбды составляет 3 секунды, я не могу видеть никаких журналов внутри моего экземпляра AI. Моя лямбда успешно выполняется и завершается через 2-3 секунды.Когда я увеличиваю тайм-аут до 20 секунд, я вижу, как логи заполняются в AI, и моя лямбда выполняется в течение 15-17 секунд.

Насколько я понимаю, клиент телеметрии AI отправляет данные в пакетном режиме и временно сохраняет их вдиск до его отправки.Поскольку ресурсы для лямбды выводятся из эксплуатации после ее выполнения, я могу потерять эти события, поскольку они еще не были вытеснены.

Как я могу гарантировать, что клиент телеметрии AI не будет пакетировать эти события и отправлять их, как только он их получит?

Ниже приведен мой лямбда-код

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(); 
};

Какой-либо другой подход или лучшая практика, которой я должен следовать для достижения своей цели?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Я могу видеть это поведение, только когда моя лямбда выполняется через несколько минут после предыдущего вызова. Я попытался запустить лямбду непрерывно с интервалом в 1 секунду, и я увидел, что только первый запрос занимает столько времени, а последующие запросы в среднем занимают не более 400 миллисекунд. Это связано с тем, что для первого запроса выполнения лямбды AWS требуется некоторое время для ввода ресурсов в эксплуатацию и использует те же ресурсы, если лямбда вызывается в быстрой последовательности после первого вызова.

Похоже, мое понимание того, что "ресурсы для лямбды выводятся из эксплуатации после ее выполнения", было неполным.

0 голосов
/ 14 сентября 2018

Вы пропали без вести,

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.
    });



};

Надеюсь, это поможет.

...