Как получить сигнал тревоги при отсутствии журналов за определенный период времени в AWS Cloudwatch?

У меня есть приложение Java, которое работает в AWS Elastic Container Service. Приложение периодически опрашивает очередь. Иногда нет ответа из очереди и приложение зависает навсегда. Я приложил методы к блокам try-catch с протоколированием исключений. Даже несмотря на то, что логов в Cloudwatch после этого нет. Без исключений и ошибок. Есть ли способ, которым я могу определить эту ситуацию. ? (Нет логов в Cloudwatch). Подобно фильтрации шаблона журнала ошибок. Так что я могу перезапустить службу. Любой трюк или решение будут оценены.

public void handleProcess() {
    try {
        while(true) {
            Response response = QueueUitils.pollQueue(); // poll the queue
            QueueUitils.processMessage(response);
            TimeUnit.SECONDS.sleep(WAIT_TIME); // WAIT_TIME = 20
        }
    } catch (Exception e) {
        LOGGER.error("Data Queue operation failed" + e.getMessage());
        throw e;
    }
}

person Ashan Tharindu    schedule 18.09.2020    source источник


Ответы (2)


Вы можете сделать это с помощью CloudWatch Alarms. Для этого я настроил тестовую функцию Lambda, которая запускается каждую минуту и ​​регистрируется в CloudWatch.

  1. Перейдите в CloudWatch и нажмите Тревоги в меню слева.
  2. Нажмите оранжевую кнопку Создать будильник Создать будильник
  3. Нажмите Выбрать показатель Выбрать показатель
  4. Затем выберите Журналы, затем Показатели группы журналов и выберите показатель IncomingLogEvents для соответствующей группы журналов (группы журналов, в которую ведет журнал ваше приложение). В моем случае это /aws/lambda/test-log-silence Выберите метрику группы журналов
  5. Нажмите Выбрать показатель.
  6. Теперь вы можете указать, как вы хотите измерять метрику. Я выбрал средние записи журнала за 5 минут, поэтому через 5 минут, если записей в журнале нет, это значение будет равно нулю. Укажите измерения показателей
  7. Прокрутите вниз, и вы установите флажок «Меньше или равно нулю». Это вызовет тревогу, если в журнале нет записей в течение 5 минут (или что-то еще, что вы решите установить). Указать условия
  8. Теперь нажмите «Далее», и вы можете указать тему SNS для отправки уведомления. Вы можете настроить тему SNS, чтобы уведомлять вас по электронной почте, SMS, AWS Lambda и другим способом.
person brads3290    schedule 19.09.2020
comment
Извините, что влезаю в этот вопрос. У меня есть аналогичное требование, когда я должен проверить, нет ли сообщения журнала в течение 6 часов, тогда я должен вызвать состояние тревоги. Я реализовал ту же конфигурацию, что и выше. Но все же поведение не соответствует. Он не переходит в состояние тревоги, даже если он превышает 6 часов. Похоже, что может быть недостаточно данных, когда журнал не поступает. Нужны некоторые материалы здесь. - person Swapnil Mhaske; 18.03.2021
comment
@SwapnilMhaske Когда вы создаете будильник, внизу страницы есть дополнительная конфигурация. Выберите, что считать отсутствующие данные хорошими или плохими в соответствии с вашими требованиями. По умолчанию отсутствующие данные рассматриваются как отсутствующие. Вот почему он переходит в недостаточное состояние. - person Ashan Tharindu; 23.03.2021

Со ссылкой на ответ brads3290, если вы используете AWS CDK:

import * as cloudwatch from '@aws-cdk/aws-cloudwatch'; 
// ...
const metric = new cloudwatch.Metric({
      namespace: 'AWS/Logs',
      metricName: 'IncomingLogEvents',
      dimensions: { LogGroupName: '/aws/lambda/test-log-silence' },
      statistic: "Average",
      period: cdk.Duration.minutes(5),
    });

const alarm = new cloudwatch.Alarm(this, 'Alarm', {
      metric,
      threshold: 0,
      comparisonOperator: cloudwatch.ComparisonOperator.LESS_THAN_OR_EQUAL_TO_THRESHOLD,
      evaluationPeriods: 1,
      datapointsToAlarm: 1,
      treatMissingData: cloudwatch.TreatMissingData.BREACHING,
    });

Это также должно решить проблему игнорирования отсутствующих данных.

person sompnd    schedule 23.04.2021