Рубрики
Uncategorized

Мониторинг AWS Lambda функционирует с CloudWatch

В этом сообщении в блоге мы хотим взглянуть на то, как отслеживать ваши функции AWS Lambda, используя Amazon CloudWatch. Помечено с AWS, DEVOPS, Serverless, Облако.

Этот пост блога является частью моей серии AWS:

  • Инфраструктура как код — управление AWS с террафом
  • Развертывание HTTP API на AWS с использованием шлюза лямбда и API
  • Развертывание HTTP API на AWS с использованием эластичного Geanstalk
  • Развертывание и сравнительный анализ AWS RDS MySQL
  • Обработка событий в AWS использует SNS, SQS и LAMBDA
  • Непрерывная доставка на AWS с террафом и Трэвисом СИ
  • Обработка данных датчика на AWS с использованием Core Iot Core, Kinesis и Elasticache
  • Мониторинг AWS Lambda функционирует с CloudWatch

Функции как сервисные продукты, такие как AWS Lambda, обеспечивают много удобства по сравнению с голыми металлическими, виртуальными машинами, а также контейнерными развертываниями. Вам нужно только управлять фактическим кодом, который вы хотите запустить, и остальное позаботится о поставщике облака. Но также удобно работать?

В этом сообщении мы хотим взглянуть, как помочь операциям лямбда через мониторинг и оповещение с использованием Amazon CloudWatch. Мы будем использовать существующие метрики, но также создаем пользовательский метрический фильтр для анализа потребления памяти от журналов CloudWatch.

Метрики визуализируются в приборной панели CloudWatch, и аварийные сигналы сконфигурированы для толкания уведомления по направлению к тому времени AWS SNS в случае нарушения порога. Как обычно, все будет развернуто с Hashicorp Terraform. Ниже вы найдете скриншот результирующей приборной панели, который у нас будет в конце поста.

Исходный код Доступен на Github. Обратите внимание, что мы не собираемся обсуждать темы Управление несколькими лямбдами функциями в одном репозитории или как показать Уведомления о тревоге внутри слабого канала Как это уже обсуждалось в предыдущих сообщениях в блоге.

В метриках CloudWatch организованы в так называемой пространства имен Отказ Пространство имен похоже на папку для метрик и может использоваться для группировки метрик той же приложения. А метрика является заказанным временем набор точек данных, также известный как временные ряды. Примерами используются процессорное использование экземпляра EC2 или количества запросов, сделанных для вашего API.

Большинство услуг AWS отправляют предварительно определенные метрики для CloudWatch из коробки, но также можно отправить пользовательские метрики. На сегодняшний день AWS Lambda выставляет следующие метрики для CloudWatch из коробки:

  • Завершение. Метрика вызовов измеряет количество раз, когда вызывается функция. Завершение может произойти либо через событие, либо вызов API вызова. Он включает в себя как неудачные, так и успешные вызовы, но не проваливные запросы на вызов, например, Если происходит дроссель.
  • Ошибки. Эта метрика измеряет количество раз, когда вызов не удался из-за ошибки в функции, время ожидания функции, из ошибки памяти или ошибку разрешений. Он не включает сбои из-за превышения пределов параллелизма или ошибки внутреннего обслуживания.
  • Ошибки мертвых букв. Если вы настроили очередь мертвой буквы, AWS Lambda собирается записать полезную нагрузку события неисправных вызовов в эту очередь. Метрическую ошибку мертвой буквы не удалось доставить поставки погибших букв.
  • Продолжительность. Продолжительность измеряет прошедшие настенные часы, от того, когда код функции начинается, когда он останавливает выполнение. Следите за часами не монотонным, вы можете получить отрицательные значения.
  • Дросселировать. Дроссельные вызова подсчитываются всякий раз, когда попытка вызова не удается из-за превышения пределов параллелизма.
  • Возраст итератор (только поток). Метрика века итератора доступна только тогда, когда функция лямбда вызывается такая служба потоковой передачи AWS, такая как Kinesis. Он представляет разницу времени между событием, записанным в поток и время, которое он получает подбирать функцией Lambda.
  • Одновременные исполнения. Эта метрика представляет собой совокупную метрическую учетную запись, указывающую сумму одновременных исполнений для данной функции. Это применимо для функций с пользовательским пределом параллелизма.
  • Безоговорочные параллельные исполнения. Подобно параллельному исполнению, метрики более безоговорочных одновременных исполнений, метрика также является широкой учетной записью. Это указывает на сумму параллелизма всех функций, не имеющих пользовательских пределов параллелизма.

Каждая метрика может иметь до десяти измерений. А Размер Является парой ключевой стоимости, которая описывает метрику и может использоваться для уникальной идентификации метрики в дополнение к метрическому имени. Метрики, излучаемые AWS Lambda, имеют следующие размеры:

  • Имя функции. Имя функции можно использовать для выбора метрики на основе имени функции лямбда.
  • Ресурс. Размер ресурса полезен для фильтрации на основе функциональной версии или псевдонима.
  • Выполненная версия. Вы можете использовать размерное измерение версии для фильтрации на основе версии функции при использовании вызовов псевдонима.

Метрики могут быть агрегированы через так называемые Статистика Отказ CloudWatch предлагает следующую статистику: минимум, максимальный, сумма, средний, счетчик и проценты. Статистика вычисляется в пределах указанной период Отказ Насколько я понимаю, он использует падающее окно для этого Но я не совсем уверен. Пожалуйста, обратитесь к моему предыдущему посту о Окно функции в потоковой аналитике Для получения дополнительной информации о упаковках окон.

Как упоминалось ранее, также возможно создать пользовательские метрики в дополнение к те, которые предоставляют услуги AWS, предоставляют вне коробки. При взгляде на AWS Lambda метрика общих интересов — максимальное потребление памяти.

Пользовательские метрики могут быть записаны непосредственно через API CloudWatch или используя AWS SDK. Однако сама ламмбда сама не имеет никакой информации о своем потреблении памяти. Как мы можем решить эту проблему? К счастью, метрические фильтры находятся в спасении! После каждого исполнения функции AWS записывает отчет в журналы CloudWatch, которые выглядят так:

REPORT RequestId: f420d819-d07e-11e8-9ef2-4d8f649fd167  Duration: 158.15 ms Billed Duration: 200 ms Memory Size: 128 MB Max Memory Used: 38 MB

Этот отчет содержит информацию, которую мы ищем: Максимальная память используется: 38 МБ Отказ Cloudwatch предоставляет удобную функциональность для преобразования журналов в метрики, называемые Метрический фильтр Отказ

Фильтр состоит из узор , а название , а пространство имен , а ценность и необязательный значение по умолчанию . Это применяет шаблон к каждой линии журнала, а если он совпадает, испускает указанное значение внутри метрики данного имени в данном пространстве имен. Значение по умолчанию будет испущено, если нет событий журнала.

Чтобы извлечь максимальную память из линии журнала, мы можем использовать рисунок ниже и излучать значение $ max_memory_used_value. . Для получения дополнительной информации о синтаксисе шаблона, пожалуйста, обратитесь к Официальная документация Отказ

[
  report_label=\"REPORT\",
  request_id_label=\"RequestId:\", request_id_value,
  duration_label=\"Duration:\", duration_value, duration_unit=\"ms\",
  billed_duration_label1=\"Billed\", bill_duration_label2=\"Duration:\", billed_duration_value, billed_duration_unit=\"ms\",
  memory_size_label1=\"Memory\", memory_size_label2=\"Size:\", memory_size_value, memory_size_unit=\"MB\",
  max_memory_used_label1=\"Max\", max_memory_used_label2=\"Memory\", max_memory_used_label3=\"Used:\", max_memory_used_value, max_memory_used_unit=\"MB\"
]

Я заметил, что максимальная память, написанная в журнале, уже агрегируется по некоторым предыдущим вызовам. Мое подозрение состоит в том, что он относится к максимальной памяти одного запуска за кулисами, которые сбрасываются каждый раз, когда функция снова запущена, например, E.G. после перерыва или перераспределения. Если у вас есть больше информации по этому вопросу, пожалуйста, оставьте комментарий!

Метрики — это важный строительный блок для поддержки ваших операций. Для того, чтобы сделать их действительно полезными, нам необходимо определить процесс, включающий в себя либо автоматизированные, либо ручные действия, основываясь на основе изменений метрических значений со временем.

Cloudwatch позволяет вам определить тревоги , которые являются правилами, которые вызывают Действия на основе порога в течение ряда временных периодов на одну метрику. Каждая сигнализация связана с одним или несколькими действиями. Это может быть действие EC2, AUT-аутокалирование EC2 или уведомление о SNS. Если вы отправите событие SNS, вы можете реализовать много разных потребителей, таких как функция лямбда, отправляющая Slack Message Отказ

Для нашей функции лямбда мы будем реализовывать следующие три основных аварийных сигнала:

  • Время исполнения. Каждая функция лямбда имеет настраиваемый тайм-аут. Если ваш код работает дольше, чем указанный тайм-аут, вызов будет прервана. Вы можете создать тревогу, если время выполнения превышает определенный процент настроенных тайм-аута. Таким образом, CloudWatch уведомит вас в том случае, если вам может потребоваться отрегулировать порог или улучшить производительность вашего кода.
  • Максимальная память. Подобно время выполнения, существует также настраиваемая максимальная сумма памяти. Благодаря нашему ранее определенному метрическому фильтру для максимальной используемой памяти мы можем запустить тревогу, если превышен определенный порог.
  • Ошибки выполнения. Иногда кодовые перерывы. Это может произойти, потому что некоторая служба Downstream недоступна, входной формат изменен или ваш код содержит ошибку. Запустив сигнал тревоги для ошибок выполнения, вы можете получать уведомления и действовать соответственно. Обратите внимание, однако, что это будет включать все ошибки, даже если вызов преуспел после повторения. Если вы заинтересованы только в событиях, которые не могут быть обработаны даже после попытки, необходимо настроить очередь мертвой буквы.

Если вы используете Terraporm, вы можете напрямую интерполировать тайм-аут выполнения и максимальную память и выберите процент для порога. Следующий список иллюстрирует создание аварийного ресурса с террафом, который запускается, если ваше время выполнения превышает 75% от времени ожидания.

resource "aws_cloudwatch_metric_alarm" "calculator-time" {
  alarm_name          = "${local.project-name}-calculator-execution-time"
  comparison_operator = "GreaterThanOrEqualToThreshold"
  evaluation_periods  = "1"
  metric_name         = "Duration"
  namespace           = "AWS/Lambda"
  period              = "60"
  statistic           = "Maximum"
  threshold           = "${aws_lambda_function.calculator.timeout * 1000 * 0.75}"
  alarm_description   = "Calculator Execution Time"
  treat_missing_data  = "ignore"

  insufficient_data_actions = [
    "${aws_sns_topic.alarms.arn}",
  ]

  alarm_actions = [
    "${aws_sns_topic.alarms.arn}",
  ]

  ok_actions = [
    "${aws_sns_topic.alarms.arn}",
  ]

  dimensions {
    FunctionName = "${aws_lambda_function.calculator.function_name}"
    Resource     = "${aws_lambda_function.calculator.function_name}"
  }
}

Если вы войти в консоль AWS CloudWatch, показывает ваш обзор всех ваших текущих аварийных сигналов. Приведенная ниже таблица иллюстрирует три тревоги для нашего примера функции. Я сгенерировал некоторые тестовые события, и один из него генерировал ошибку внутри функции, которая вызвала соответствующий сигнал тревоги.

В дополнение к таблице у вас также есть очень простой вид графика каждого сигнализации, который не зависит от панелей CloudWatch. Следующая цифра изображает три графика для наших аварийных сигналов.

Я большой поклонник автоматизации. Я считаю, что никто не должен посмотреть на приборные панели 24/7, пытаясь обнаружить ошибки. Тем не менее приборные панели очень полезны для быстрого обзора системы. Они также позволяют людям определить новые шаблоны, которые приводят к реализации новых типов аварийных сигналов.

В CloudWatch A Приборная панель состоит из нескольких виджеты . Виджет может быть графиком метрик или текста в синтаксисе разметки. Для нашей примерной функции мы хотим построить четыре времени выполнения Metrics, максимальную память используемую, ошибки выполнения и вызовы.

Даубинги внутренне хранятся как объекты JSON, а также могут управляться террафом. Объект приборной панели состоит из массива объектов виджета. Исходный код полной приборной панели ( CloudWatch_dashboard.tf ) слишком большой, чтобы отображаться здесь, поэтому мы будем смотреть только на два виджета, чтобы проиллюстрировать точку. Следующий список показывает виджет суммы вызова.

{
  "type": "metric",
  "x": 12,
  "y": 7,
  "width": 12,
  "height": 6,
  "properties": {
    "metrics": [
      [
        "AWS/Lambda", "Invocations",
        "FunctionName", "${aws_lambda_function.calculator.function_name}",
        "Resource", "${aws_lambda_function.calculator.function_name}",
        {
          "color": "${local.dashboard-calculator-invocation-color}",
          "stat": "Sum",
          "period": 10
        }
      ]
    ],
    "view": "timeSeries",
    "stacked": false,
    "region": "${data.aws_region.current.name}",
    "title": "Invocations"
  }
}

А вот что это выглядит в браузере:

Мы также можем добавить горизонтальные аннотации, чтобы указать наш порог тревоги. Кроме того, это может быть полезно отображать разную статистику. Для виджета времени выполнения мы добавили горизонтальную аннотацию, а также две статистики: максимальное и среднее время выполнения. Пожалуйста, найдите код и скриншот результата ниже.

{
  "type": "metric",
  "x": 0,
  "y": 1,
  "width": 12,
  "height": 6,
  "properties": {
    "metrics": [
      [
        "AWS/Lambda", "Duration",
        "FunctionName", "${aws_lambda_function.calculator.function_name}",
        "Resource", "${aws_lambda_function.calculator.function_name}",
        {
          "stat": "Maximum",
          "yAxis": "left",
          "label": "Maximum Execution Time",
          "color": "${local.dashboard-calculator-max-time-color}",
          "period": 10
        }
      ],
      [
        "AWS/Lambda", "Duration",
        "FunctionName", "${aws_lambda_function.calculator.function_name}",
        "Resource", "${aws_lambda_function.calculator.function_name}",
        {
          "stat": "Average",
          "yAxis": "left",
          "label": "Average Execution Time",
          "color": "${local.dashboard-calculator-avg-time-color}",
          "period": 10
        }
      ]
    ],
    "view": "timeSeries",
    "stacked": false,
    "region": "${data.aws_region.current.name}",
    "yAxis": {
      "left": {
        "min": 0,
        "max": ${aws_lambda_function.calculator.timeout}000,
        "label": "ms",
        "showUnits": false
      }
    },
    "title": "Execution Time",
    "period": 300,
    "annotations": {
      "horizontal": [{
          "color": "${local.dashboard-calculator-max-time-color}",
          "label": "Alarm Threshold",
          "value": ${aws_cloudwatch_metric_alarm.calculator-time.threshold}
        }
      ]
    }
  }
}

В этом посте мы видели, как создавать метрические фильтры CloudWatch, аварийные сигналы и приборные панели. Мы смотрели на различные метрики, которые предоставляются для LAMBDA функций из коробки, и как анализировать максимальное расход памяти от журналов CloudWatch с использованием метрического фильтра.

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

Вы когда-нибудь использовали CloudWatch для управления метриками и тревогами? Я лично узнаю его гораздо удобнее, чем использовать внешнее решение, такое как Elasticsearch, при работе на функциях лямбда. Каково твое мнение? Пожалуйста, дайте мне знать в комментариях ниже.

Обложка изображения по Роджер Шульц

Оригинал: «https://dev.to/frosnerd/monitoring-aws-lambda-functions-with-cloudwatch-1nap»