Загадочный лимит обращений к CloudWatch

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

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

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

В системе также присутсвовал другой демон, который принимал решение об увеличении/уменьшении размера облака. Он брал из этой метрики сумму всех присланных значений за последние 1/5/15 минут (CloudWatch позволяет брать SUM/AVG/MAX/MIN за произвольный интервал времени, и нам это было очень удобно), и использовал эти данные в своем внутреннем алгоритме. Фактически, эти три числа представляют из себя количество обработанных задач за соответствующий интервал времени.

Все бы хорошо, но при нагрузочном тестировании, мы начали получать от CloudWatch вот такие ошибки о превышении лимита обращений:

BotoServerError: BotoServerError: 400 Bad Request
 
 Sender
 Throttling
 Rate exceeded
 
 cc8fe7e1-fb3f-11e1-b8df-5b62d381521c
 

Оказалось, интенсивность обращений к CloudWatch ограничена, хотя по нашим оценкам наш rate обращений был не выше 5 запросов в секунду. Разумеется, пробовали гуглить документацию, форумы техподдержки Amazon, находили похожие жалобы от других пользователей, но... дальше не продвинулись: 

  1. На официальной странице, где перечислены ссылки на заявки по поднятию лимитов на все сервисы, ссылки для CloudWatch увы нет: http://aws.amazon.com/contact-us/
  2. Нашли форму этой заявки на форуме поддержки Амазон: https://portal.aws.amazon.com/gp/aws/html-forms-controller/contactus/cloudwatch-metric-request (чтобы зайти, предварительно нужно авторизоваться в AWS).
  3. Значения этих лимитов по умолчанию мы не нашли нигде: ни в документации, ни в форумах, ни в интернете.

В итоге, проблему  решили тем, что демон отчитывался о выполненной работе (клал единичку в метрику) не после каждой задачи, а агрегированно - раз в минуту. Это почти на два порядка уменьшило наш rate обращений и для нашей задачи такого решения вполне хватило. Не пришлось даже поднимать лимиты. Тем не менее, в итоге мы выяснили, что к CloudWatch метрикам нельзя обращаться очень часто, а также нашли "черную дыру" в функциональности Амазона.