Мониторинг CloudFront с помощью cloudwatch_exporter

Для мониторинга CloudFront, как и любых других сервисов AWS, по умолчанию можно использовать CloudWatch. Тем не менее этот сервис достаточно сильно отличается от других по ряду причин, которые мы как раз рассмотрим в этой статье. Кроме того, разберемся как забирать метрики к себе с помощью cloudwatch_exporter.

Мониторинг CloudFront с помощью cloudwatch_exporter

Работа с CloudFront уникальна по части региона AWS, есть также нюансы с именованием ресурсов, но это мы оставим на потом, а пока рассмотрим особенности представления данных.

Сходимость данных

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

Наиболее наглядно это поведение можно продемонстрировать на метрике BytesDownloaded. Обратите внимание на минутный график ниже. Значение метрики на 07:12 составляет 1 095 578 601:

Мониторинг CloudFront с помощью cloudwatch_exporter 01

Теперь тот же график, но минуту спустя:

Мониторинг CloudFront с помощью cloudwatch_exporter 02

Указатель все также на точке 07:12, но её значение теперь составляет уже 1 247 892 395! Тот же график, но спустя 4 минуты от первого изображения:

Мониторинг CloudFront с помощью cloudwatch_exporter 03

Теперь отметка 07:12 показывает уже 1 288 307 976. На этой цифре все и остановилось.

Примечание: в это верится с трудом, но это все один и тот же график, просто в разные отметки времени. Новая минутная отметка начинается с около нулевых значений и поднимается вверх, периодически увеличиваясь по мере поступления данных. Это особенно актуально для минутных точек. Для 5-минутного интервала изменяется значение лишь последней точки. Логично было бы отдавать данные за предпоследний 5-минутный интервал, а последние данные не показывать до их окончательного вида, но на практике сделано иначе.

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

Примечание: последняя опция заставляет экспортер не выставлять отметку времени рядом с метрикой. В этом случае Прометей выставит её в значение времени сбора данных с экспортера. Как итог на графике у вас будет задержка в 600 секунд (10 минут). Это неудобно, но это нужно, потому что Прометей считает устаревшими все данные, которые старше 5 минут. Читайте подробнее в статьях – Querying Prometheus и Staleness and PromQL.

Подобное поведение я проверял на метриках с большими значениями, поэтому в качестве примера была взята именно BytesDownloaded. На 5xxErrorRate это может быть уже не так заметно, потому что за минуту может не проскочить ни одной пятисотки.

Тэгирование ресурсов

Метрики CloudFront уникально идентифицируются в CloudWatch только по distribution_id (Per-Distribution Metrics). Это неудобно, потому что вместо красивого урла вам придется всматриваться в бессмысленные идентификаторы наподобие E2K15KRJXT93A3. В Прометей он переедет в виде лейбла, например:

Способ добавить нужные вам лейблы есть и упирается он в использование тегов 1. В конфигурации Terraform это будет выглядеть так:

Примечание: обратите внимание, что названия тегов чувствительны к регистру.

Далее нужно адаптировать конфигурацию cloudwatch_exporter к снятию метрик ресурсов как раз по этим тегам. Выглядеть она будет примерно так:

Сам по себе набор лейблов у метрик не изменится, но нужные лейблы появятся у метрики:

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

Неудобно, но работает. Хотя на этом нюансы не заканчиваются

Регион

Как известно, в AWS есть множество регионов доступности. Но CloudFront это CDN 2, а значит этот сервис изначально ориентирован на работу по всему миру. В какой регион тогда складывать метрики CloudWatch? В AWS пошли самым нелогичным путем и стали отгружать метрики всегда в US East (N. Virginia) – us-east-1:

To get the CloudFront metrics from the CloudWatch API, you must use the US East (N. Virginia) Region (us-east-1).

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

Все это ставит нас в затруднительное положение, если мы хотим отправлять в Прометей метрики например RDS, S3 и CloudFront. В этом случае нам нужно поднять два cloudwatch_exporter – один для RDS и S3, а другой для CF. Все потому, что экспортер не позволяет динамически устанавливать регион для каждой метрики.

Кроме того, это накладывает также необходимость постоянно руками переключать регион в веб-интерфейсе.

Выводы

Мониторинг CloudWatch от сервиса к сервису достаточно сильно отличается. Рекордсменом по количеству подводных камней на моей практике как раз является CloudFront. Особенно много неудобств доставляет медленная сходимость данных и в этом случае хотел бы предупредить вас, чтобы вы чаще сравнивали визуально графики на Прометее и в UI CloudWatch.

Яндекс.Метрика