TL;DR: как проверить, правильно ли работают ваши будильники!

Мотивация

AWS CloudWatch — облачный сервис для хранения и индексации любых журналов. Вы можете добавить размеры, свойства,…

С помощью AWS CloudWatch Insight мы можем определять метрики в журналах, отправлять встроенные метрики… и создавать оповещения!

Наличие сигнализации для вашего обслуживания является обязательным в настоящее время.

Язык спецификации для определения метрик и сигналов тревоги может быть немного сложным.

Дело в том, что когда у вас есть правильный синтаксис для вашей метрики и/или сигнала тревоги, сразу же возникает вопрос: как я могу его протестировать?

Давай увидим это!

AWS CLI для спасения

Если вы привыкли использовать AWS, вы, вероятно, установили инструмент aws CLI.

В разделе cloudwatch мы нашли команды и параметры для управления всем жизненным циклом метрик и сигналов тревоги.

Если вы еще не установили его, вы можете установить его с помощью следующей команды оболочки

Mac OS X

$ brew install awscli

GNU/Linux

$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install

Пример

Мы используем очень распространенный сценарий: лямбда-функцию.

Использовать формат AWS SAM очень просто.

Наша функция — это файл pdf2png. Он получает файл PDF, отображает его как изображение и сохраняет в S3 как изображение PNG.

В этом примере мы определяем две метрики:

  • Ошибка, когда файл PDF недействителен.
  • Время обработки одного файла

По этим показателям мы определяем следующие сигналы тревоги

  • Количество ошибок PDF превышает пороговое значение
  • Среднее время обработки превышает пороговое значение

Определение тревог в SAM

Как вы, наверное, знаете, Serveless Application Model, также известная как SAM, — это еще один инструмент AWS для управления бессерверными ресурсами AWS.

Если вы когда-то создавали лямбда-функцию, вы, скорее всего, использовали ее.

Сам лямбда-код выходит за рамки. Сосредоточимся на сигналах тревоги.

Код

Мы используем SAM для создания и развертывания нашего кода.

Это наш template.yaml за это.

Как вы можете видеть в приведенном выше коде, мы определяем два сигнала тревоги.

Первый касается количества обработанных PDF-файлов с ошибкой. Этот сигнал срабатывает, когда за последний час (3600 секунд) 5 или более PDF-файлов обрабатываются с ошибкой.

Второй вариант очень похож, но в этом случае мы хотим, чтобы среднее время обработки файла составляло менее 15 секунд (но наша единица измерения — миллисекунды).

Для применения вызываем следующие команды

$ sam build
$ sam deploy --guided

Параметр guided необходим только для первого развертывания. Он определяет такие вещи, как имя стека CloudFormation, политики отката и т. д.

Если все работает хорошо, результат должен быть похож на следующий.

Получить статус тревоги

Любой сигнал тревоги CloudWatch имеет состояние «INSUFFICIENT_DATA» сразу после его создания. С помощью команды cloudwatch describe-alarms мы можем увидеть его состояние и другие детали.

$ aws cloudwatch describe-alarms --region eu-west-1 --alarm-names pdf-converter-files-error
{
    "MetricAlarms": [
        {
            "ComparisonOperator": "GreaterThanOrEqualToThreshold",
            "StateReason": "Unchecked: Initial alarm creation",
            "InsufficientDataActions": [],
            "AlarmName": "pdf-converter-files-error",
            "StateValue": "INSUFFICIENT_DATA",
            "ActionsEnabled": true,
            "AlarmDescription": "Number of errors in processed PDF files pass the threshold in one hour",
            "Dimensions": [],
            "AlarmActions": [],
            "Threshold": 5.0,
            "TreatMissingData": "missing",
            "OKActions": [],
            "EvaluationPeriods": 1,
            "Namespace": "pdf-converter",
            "Statistic": "Sum",
            "Period": 3600,
            "AlarmConfigurationUpdatedTimestamp": "2022-10-06T09:29:58.012Z",
            "MetricName": "error-pdf-file",
            "AlarmArn": "arn:aws:cloudwatch:eu-west-1:520766964441:alarm:pdf-converter-files-error",
            "StateUpdatedTimestamp": "2022-10-06T09:29:58.012Z"
        }
    ]
}

Как вводить поддельные метрики

Внутри параметров CloudWatch есть команда, которая позволяет нам вводить метрические данные. Мы используем его для ввода «фальшивых» данных и смотрим, меняет ли тревога свое состояние.

Эта подкоманда put-metric-data .

Обязательные параметры: namespace , metric-name , value и, во многих случаях, unit.

Для проверки аларма о среднем времени обработки PDF-файлов в разных вызовах вводим следующие данные:

$ aws cloudwatch put-metric-data --namespace pdf-converter --metric-name pdf-processing-time --value 1200  --unit Milliseconds
$ aws cloudwatch put-metric-data --namespace pdf-converter --metric-name pdf-processing-time --value 4300  --unit Milliseconds
$ aws cloudwatch put-metric-data --namespace pdf-converter --metric-name pdf-processing-time --value 2300  --unit Milliseconds
$ aws cloudwatch put-metric-data --namespace pdf-converter --metric-name pdf-processing-time --value 6300  --unit Milliseconds

Если мы теперь проверим статус тревоги,

$ aws cloudwatch describe-alarms
{
            "AlarmName": "pdf-converter-TotalPDFProcessingTimeAlarm-FX2TV7R36S0T",
            "AlarmArn": "arn:aws:cloudwatch:eu-west-1:520766964441:alarm:pdf-converter-TotalPDFProcessingTimeAlarm-FX2TV7R36S0T",
            "AlarmDescription": "Average processing time exceeds threshold",
            "AlarmConfigurationUpdatedTimestamp": "2022-10-09T09:36:56.511Z",
            "ActionsEnabled": true,
            "OKActions": [],
            "AlarmActions": [],
            "InsufficientDataActions": [],
            "StateValue": "OK",
            "StateReason": "Threshold Crossed: 1 datapoint [1200.0 (08/10/22 09:39:00)] was not greater than or equal to the threshold (15000.0).",
            "StateReasonData": "{\"version\":\"1.0\",\"queryDate\":\"2022-10-09T09:39:13.827+0000\",\"startDate\":\"2022-10-08T09:39:00.000+0000\",\"unit\":\"Milliseconds\",\"statistic\":\"Average\",\"period\":86400,\"recentDatapoints\":[1200.0],\"threshold\":15000.0,\"evaluatedDatapoints\":[{\"timestamp\":\"2022-10-08T09:39:00.000+0000\",\"sampleCount\":1.0,\"value\":1200.0}]}",
            "StateUpdatedTimestamp": "2022-10-09T09:39:13.829Z",
            "MetricName": "pdf-processing-time",
            "Namespace": "pdf-converter",
            "Statistic": "Average",
            "Dimensions": [],
            "Period": 86400,
            "Unit": "Milliseconds",
            "EvaluationPeriods": 1,
            "Threshold": 15000.0,
            "ComparisonOperator": "GreaterThanOrEqualToThreshold"
}

Все в порядке… идем запускать.

$ aws cloudwatch put-metric-data --namespace pdf-converter --metric-name pdf-processing-time --value 61300  --unit Milliseconds
$ aws cloudwatch put-metric-data --namespace pdf-converter --metric-name pdf-processing-time --value 161300  --unit Milliseconds
$ aws cloudwatch put-metric-data --namespace pdf-converter --metric-name pdf-processing-time --value 13300  --unit Milliseconds

Обычно повторная оценка аварийных сигналов занимает до нескольких минут. Но мы можем принудительно установить оценку вручную для состояния тревоги «недостаточно данных».

$ aws cloudwatch set-alarm-state --alarm-name processing-time-exceeds-alarm --state-value "INSUFFICIENT_DATA" --state-reason "manual testing"

…и Бинго!

$ aws cloudwatch describe-alarms
{
    "MetricAlarms": [
        {
            "AlarmName": "pdf-converter-TotalPDFProcessingTimeAlarm-FX2TV7R36S0T",
            "AlarmArn": "arn:aws:cloudwatch:eu-west-1:520766964441:alarm:pdf-converter-TotalPDFProcessingTimeAlarm-FX2TV7R36S0T",
            "AlarmDescription": "Average processing time exceeds threshold",
            "AlarmConfigurationUpdatedTimestamp": "2022-10-09T09:36:56.511Z",
            "ActionsEnabled": true,
            "OKActions": [],
            "AlarmActions": [],
            "InsufficientDataActions": [],
            "StateValue": "ALARM",
            "StateReason": "Threshold Crossed: 1 datapoint [35714.28571428572 (08/10/22 09:47:00)] was greater than or equal to the threshold (15000.0).",
            "StateReasonData": "{\"version\":\"1.0\",\"queryDate\":\"2022-10-09T09:47:13.813+0000\",\"startDate\":\"2022-10-08T09:47:00.000+0000\",\"unit\":\"Milliseconds\",\"statistic\":\"Average\",\"period\":86400,\"recentDatapoints\":[35714.28571428572],\"threshold\":15000.0,\"evaluatedDatapoints\":[{\"timestamp\":\"2022-10-08T09:47:00.000+0000\",\"sampleCount\":7.0,\"value\":35714.28571428572}]}",
            "StateUpdatedTimestamp": "2022-10-09T09:47:13.815Z",
            "MetricName": "pdf-processing-time",
            "Namespace": "pdf-converter",
            "Statistic": "Average",
            "Dimensions": [],
            "Period": 86400,
            "Unit": "Milliseconds",
            "EvaluationPeriods": 1,
            "Threshold": 15000.0,
            "ComparisonOperator": "GreaterThanOrEqualToThreshold"
        }
    ],
    "CompositeAlarms": []
}

Если мы зайдем в консоль AWS Cloudwatch, мы также увидим уведомление о тревоге.

Заключение

В настоящее время рекомендуется разрабатывать тесты для всего. Насколько мне известно, решений для тестирования подобных инфраструктурных вещей не существует. Если вы знаете что-нибудь, пожалуйста, поделитесь этим со мной.

Между тем, благодаря CLI мы можем выполнять некоторые базовые тесты.