AWS CloudWatch регистрирует метрики для обработанных и необработанных исключений
У меня есть интересный сценарий с AWS CloudWatch Logs. В настоящее время я использую log4net и закачиваю все журналы в журналы CloudWatch с помощью агента CloudWatch Logs. У меня есть метрика в CloudWatch, которая в основном сканирует записи [ERROR], и Alarm передает их другой службе для уведомлений dev по мере их появления (Threshold >= 1, period - 1 min). Все это работает отлично.
Теперь я хочу по-разному обрабатывать определенные ошибки. Например, основываясь на типе исключения, я хочу активировать Тревогу только тогда, когда в течение N минут произошло X случаев. Так что в этом случае я бы создал метрику для этого условия, а затем назначил бы ему Alarm. Проблема в том, что общая метрика ошибки, описанная в первой части этого вопроса, все еще отслеживает каждую отдельную ошибку. Так что теперь я получаю несколько уведомлений. Один для каждой ошибки и один после X числа случаев.
Я могу отключить общую метрику ошибок, но потом теряю возможность отслеживать необработанные исключения. Я должен был бы иметь метрику для каждого возможного исключения. Я что-то пропустил? Какой лучший способ справиться с этим?
1 ответ
Обычно вы можете справиться с этим, создав функцию, выполняющую некоторую дополнительную обработку, прежде чем вы получите уведомление. Самый простой способ сделать это - подписать функцию AWS Lambda на тему SNS вашего необработанного сообщения об ошибке. Отмените подписку на тему, и лямбда-функция будет уведомлять вас вместо SNS только после того, как будут выполнены все определенные вами условия.
В этой ситуации кажется, что вы хотите подавить уведомления от вашей отдельной метрики для необработанных ошибок, соответствующих вашей агрегированной метрике, когда ваша агрегатная метрика находится в состоянии тревоги.
псевдокод:
- Используйте API DescribeAlarms, чтобы получить состояние вашей совокупной тревоги необработанного исключения. Если совокупный сигнал тревоги находится в состоянии "Тревога", продолжайте.
- Используйте API FilterLogEvents, чтобы получить соответствующие события журнала:
- Ваша группа журналов
- Ваш лог поток
- FilterPattern: метрический фильтр вашего индивидуального необработанного исключения
- StartTime: отметка времени будильника - период
- EndTime: отметка времени будильника
- Используйте API GetLogEvents для получения всех событий журнала, соответствующих:
- Ваша группа журналов
- Ваш лог поток
- StartTime: отметка времени будильника - период
- EndTime: отметка времени будильника
- Если количество "всех событий" и "отфильтрованных событий" совпадают, а совокупный сигнал тревоги находится в состоянии тревоги, не отправляйте уведомление. Иначе, используйте API SES или SNS, чтобы отправить себе уведомление.
Если вы хотите продолжать получать уведомления через SNS, не используйте эту же тему, которая используется для активации лямбды, - создайте отдельную тему для уведомлений на мобильный телефон или смс.
Я не уверен, что это будет проще, чем log4net, но если вы намереваетесь выполнять подобную постобработку в своих журналах, возможно, лучше отправлять необработанные исключения напрямую в SNS, сначала постобработать в lambda, и затем запишите в журналы cloudwatch от вашей лямбда-функции. Это изменение позволит вам проверить необработанное исключение через полезную нагрузку сообщения SNS и даст вам дополнительный контроль над тем, как подавить перекрывающиеся проблемы.