open atlas
↑ К треку
AWS на практике AWS · 05 · 01

CloudWatch: метрики, логи, алармы и счёт

CloudWatch — телеметрическая плоскость AWS по умолчанию: метрики, логи, алармы. Две ловушки — бессрочное хранение логов (тихий счёт) и аларм по среднему вместо p99. Трать ingest осознанно.

AWS Middle ◷ 18 min
Уровень
ОсновыJuniorMiddleSenior

Финансовая команда открывает месячный счёт AWS и находит пятизначную строку, которую не может объяснить: CloudWatch Logs. Никто ничего не менял. В этом и суть — никому и не нужно было. Болтливый сервис логировал каждый запрос на уровне DEBUG в лог-группу, у которой retention был выставлен по умолчанию — Never Expire (никогда не истекает). Восемнадцать месяцев каждый байт и принимался (ingest, тарифицируется один раз), и хранился вечно (storage, тарифицируется каждый месяц, накапливаясь). «Фикс» занял тридцать секунд — выставить лог-группе retention в 14 дней, — но урок структурный: дефолты CloudWatch настроены на «не потерять данные», а не на «не удивить счёт». На той же неделе у той же команды реальный инцидент остался незамеченным сорок минут, потому что аларм по латентности смотрел на среднее, и среднее выглядело нормально, пока p99 горел. CloudWatch даёт телеметрическую плоскость дёшево по духу и дорого на практике; пользоваться ею хорошо — это в основном про осознанный выбор разрешения, retention и нужной статистики.

Метрики: namespace, dimensions и разрешение, за которое платишь

Прежде чем публиковать первую кастомную метрику, спроси себя: сколько это будет стоить при 10-кратном трафике и по правильному ли числу я алармирую? Ответы лежат в трёх решениях — namespace/dimensions, разрешение и то, какую статистику ты читаешь.

Метрика CloudWatch — это упорядоченный по времени набор точек данных, одна переменная во времени, например CPU одного EC2-инстанса. Каждая метрика однозначно определяется namespace (контейнером, напр. AWS/EC2 или твоим MyApp/Checkout), именем метрики и нулём или более dimensions — парами имя/значение вроде InstanceId=i-0abc. Тонкость, которая кусает: каждая уникальная комбинация dimensions — это отдельная метрика. Добавь dimension customerId с 50 000 значений — и ты только что создал 50 000 метрик, каждая тарифицируется независимо. Это и есть ловушка высокой кардинальности, и она — самый быстрый способ превратить счёт за метрики в тикет к финансистам.

Разрешение (resolution) — второй регулятор. Метрика либо стандартного разрешения (гранулярность 1 минута), либо высокого (вплоть до 1 секунды). Метрики AWS-сервисов по умолчанию стандартные; для EC2 можно включить detailed monitoring ради 1-минутных данных вместо базовых 5-минутных. Для своих метрик ты вызываешь PutMetricData и решаешь сам. Цена разрешения: каждый вызов PutMetricData тарифицируется, поэтому публикация метрики высокого разрешения каждую секунду — это резко больше запросов и денег, чем раз в минуту. CloudWatch также автоматически прореживает данные метрик: 1-секундные живут около 3 часов, 1-минутные около 15 дней, 5-минутные около 63 дней, а часовые свёртки около 455 дней (15 месяцев), после чего метрика истекает, если новых данных нет.

# Публикуем кастомную метрику стандартного разрешения (гранулярность 1 мин, дефолт)
aws cloudwatch put-metric-data \
  --namespace "MyApp/Checkout" \
  --metric-name CheckoutLatencyMs \
  --dimensions Service=checkout,Env=prod \
  --value 412 --unit Milliseconds

# Высокое разрешение: --storage-resolution 1 хранит с гранулярностью 1 секунда.
# Каждый вызов тарифицируется, так что 1-сек публикация = ~60x запросов PutMetricData против 1-мин.
aws cloudwatch put-metric-data \
  --namespace "MyApp/Checkout" \
  --metric-name CheckoutLatencyMs \
  --storage-resolution 1 \
  --value 412 --unit Milliseconds

Когда ты читаешь метрику, ты выбираешь статистику — Average, Sum, Maximum или перцентиль вроде p99. Этот выбор не косметический. Среднее прячет хвост: если 99 процентов запросов быстрые, а 1 процент падает по таймауту, среднее почти не сдвигается, пока реальные пользователи страдают. Для любого SLO по латентности ставь аларм по p99 (или p95), никогда по среднему. (Заметь: перцентилям нужны сырые точки данных; если ты публикуешь предагрегированный statistic set, p99 обычно не восстановить.) Цены ниже иллюстративны и зависят от региона — в US East (N. Virginia) кастомная метрика стоит около $0.30/метрика/месяц за первые 10 000; всегда сверяйся со страницей цен CloudWatch.

Логи: группы, потоки и ловушка retention

CloudWatch Logs организует данные как лог-потоки (одна последовательность событий на источник — напр. один контейнер), сгруппированные в лог-группы (всё, что разделяет одни и те же настройки retention, доступа и мониторинга). Retention выставляется на лог-группу, и вот ловушка, прямо названная в документации: по умолчанию данные логов хранятся бессрочно — консоль показывает это как Never Expire. Ingest тарифицируется один раз за GB (около $0.50/GB в us-east-1, иллюстративно); storage тарифицируется каждый месяц (около $0.03/GB/месяц). Never-expire плюс высокообъёмные DEBUG-логи означает, что строка storage растёт без предела. Выставляй retention осознанно — 7, 14, 30 или 90 дней для большинства логов приложений — и убирай шумное debug-логирование в проде.

Чтобы превратить логи в сигнал, есть два инструмента. Logs Insights — ad-hoc запросы для расследования: пишешь запрос, сканируешь диапазон времени, получаешь результаты. Metric filter — долговечная версия: он матчит паттерн во входящих лог-событиях и выпускает метрику CloudWatch, которую можно рисовать и алармить — например, считая строки ERROR, чтобы всплеск кого-то поднял.

# Выставляем retention осознанно — эта одна команда — весь фикс ловушки never-expire
aws logs put-retention-policy --log-group-name /myapp/checkout --retention-in-days 14
-- Logs Insights: топ-20 самых медленных запросов checkout за последний час, для ad-hoc разбора
fields @timestamp, requestId, durationMs
| filter service = "checkout" and durationMs > 1000
| sort durationMs desc
| limit 20
// Metric filter: превращаем каждую строку ERROR в метрику-счётчик, по которой можно алармить
{
  "filterName": "checkout-errors",
  "filterPattern": "ERROR",
  "logGroupName": "/myapp/checkout",
  "metricTransformations": [
    { "metricNamespace": "MyApp/Checkout", "metricName": "ErrorCount", "metricValue": "1", "defaultValue": 0 }
  ]
}

Алармы: состояния, окна оценки и за чем следить

Аларм следит за одной метрикой (или выражением metric-math) и сравнивает её с порогом за период на протяжении некоторого числа периодов оценки. Он находится в одном из трёх состояний: OK, ALARM или INSUFFICIENT_DATA (недостаточно точек данных, чтобы решить — частое сразу после создания или когда метрика перестаёт отчитываться). Алармы запускают действия только при устойчивой смене состояния, а не просто из-за нахождения в состоянии — поэтому ты настраиваешь «N из M точек нарушают» для баланса чувствительности и дребезга. Действия идут в SNS-топик (пейджинг, ChatOps) или в политику Auto Scaling.

Два уточнения важны на сеньорском уровне. Композитные алармы комбинируют другие алармы булевым правилом — например (ALARM("CPUHigh") OR ALARM("DiskHigh")) AND OK("Deploying") — так ты получаешь один пейдж по реальному условию вместо десяти связанных пейджей от одной первопричины. Anomaly detection обучает полосу ожидаемых значений по истории и алармит, когда метрика выходит за полосу, что лучше статического порога для метрик с дневной или недельной сезонностью. И повторяющаяся ошибка: алармить по CPU, когда пользователи чувствуют латентность и error rate. Ставь аларм по p99-латентности и по метрике-счётчику ошибок, которую выдаёт твой metric filter, — из этого и сделан SLO.

РегуляторПо умолчаниюЧем грозит / стоитСеньорский ход
Разрешение метрикиСтандартное (1-мин); EC2 базовое 5-мин1-сек = ~60x тарифицируемых вызовов PutMetricDataВысокое разрешение лишь там, где субминутный инсайт окупается
Dimensions (кардинальность)Выбираешь самКаждая комбо — тарифицируемая метрика; userId взрывает счётДержи dimensions низкокардинальными; никогда не на пользователя
Retention логовNever ExpireStorage тарифицируется ежемесячно вечно — тихий счётВыставь 7/14/30/90д на группу; убери prod DEBUG
Статистика алармаЧасто Average / CPUСреднее прячет хвост; пропускает реальную больАларм по p99-латентности + error rate
Отсутствующие данныеtreatMissingDataНеверная настройка = тихая слепая зона или ложный пейджВыбирай breaching/notBreaching/missing осознанно
Почему это работает

Почему INSUFFICIENT_DATA так важен? У аларма три состояния, и по умолчанию пейджит только ALARM. Если метрика перестаёт отчитываться — агент умер, функцию перестали вызывать, деплой переименовал метрику, — аларм соскальзывает в INSUFFICIENT_DATA, а не в ALARM. С неверной настройкой treatMissingData «нет данных» трактуется как «всё хорошо», и твой самый важный аларм замолкает ровно тогда, когда то, за чем он следит, упало. Сеньорская привычка — решать явно: для heartbeat-метрики трактуй отсутствие данных как breaching, чтобы тишина пейджила тебя; для разреженной метрики — как notBreaching, чтобы не получать ложных алармов. Дефолт редко бывает верным ответом для критичного аларма.

Выбери лучший вариант

Высоконагруженный checkout-API логирует каждый запрос на DEBUG. Счёт CloudWatch доминирован Logs, а нарушение SLO на прошлой неделе осталось незамеченным, потому что единственный аларм по латентности смотрел на среднее. Выбери первый ход с наибольшим рычагом.

Викторина

Ты создаёшь новый аларм на метрику, которую сервис публикует лишь изредка, и он сразу показывает INSUFFICIENT_DATA. Что значит это состояние?

Викторина

Твой аларм по латентности смотрит на статистику Average и оставался в OK во время сбоя, когда многие пользователи видели таймауты. Почему он пропустил боль?

Вспомните перед уходом
  1. 01
    Почему retention «Never Expire» — тихая ловушка стоимости и каков осознанный фикс?
  2. 02
    Почему алармить по p99-латентности, а не по среднему CPU, и как сюда вписываются INSUFFICIENT_DATA и композитные алармы?
Итог

CloudWatch — телеметрическая плоскость AWS по умолчанию, и у неё три части. Метрики — это временные ряды, определяемые namespace и dimensions, где каждая уникальная комбинация dimensions — отдельно тарифицируемая метрика, так что высококардинальные dimensions вроде ID на пользователя взрывают и число метрик, и счёт. Разрешение — регулятор: стандартное 1-минутное по умолчанию, высокое — вплоть до 1 секунды, и поскольку каждый вызов PutMetricData тарифицируется, 1-секундная публикация стоит куда дороже. Когда читаешь метрику, ты выбираешь статистику, и для латентности эта статистика должна быть p99 (или p95), никогда не среднее, потому что среднее прячет медленный хвост, который пользователи реально чувствуют. Логи организованы в потоки, сгруппированные в лог-группы, и retention выставляется на группу — его дефолт Never Expire, что в сочетании с многословным логированием и есть тихая ловушка стоимости, ведь ingest тарифицируется один раз за GB, а storage каждый месяц вечно; фикс — осознанный retention плюс срез prod-объёма логов, потому что ingest — доминирующий рычаг стоимости. Logs Insights обслуживает ad-hoc запросы, а metric filters превращают лог-паттерн (вроде строк ERROR) в метрику, по которой можно алармить. Алармы сравнивают метрику с порогом за период и окно оценки, находятся в OK / ALARM / INSUFFICIENT_DATA и действуют через SNS или Auto Scaling; композитные алармы комбинируют условия булевой логикой, чтобы подавлять связанный шум, полосы anomaly detection бьют статические пороги для сезонных данных, а treatMissingData надо выбирать осознанно, чтобы остановившаяся метрика пейджила тебя, а не молчала. Цены здесь иллюстративны и зависят от региона — сверяйся со страницей цен CloudWatch. Теперь, когда видишь неожиданную строку в счёте AWS или аларм по латентности, оставшийся зелёным во время аварии, твои первые два вопроса: какой retention у этой лог-группы и какую статистику смотрит аларм?

Практика

Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 5 завершено
Связанные уроки

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources4
expand
  1. 01
  2. 02
  3. 03
  4. 04

Trademarks belong to their respective owners. Editorial reference only.