MidПрактика2 min

Мониторинг AWS

CloudWatch логи, метрики, X-Ray трейсинг и мониторинг расходов для CRC

CloudWatch Logs

Lambda автоматически отправляет логи в CloudWatch. Каждое выполнение функции создаёт log stream.

Просмотр логов

# Последние логи
aws logs tail /aws/lambda/visitor-counter --follow

# Поиск ошибок
aws logs filter-log-events \
  --log-group-name /aws/lambda/visitor-counter \
  --filter-pattern "ERROR"

# Логи за последний час
aws logs filter-log-events \
  --log-group-name /aws/lambda/visitor-counter \
  --start-time $(date -d '1 hour ago' +%s000) \
  --filter-pattern "Visitor count"

Структурированное логирование

import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    # Structured logging
    logger.info(json.dumps({
        'action': 'increment_counter',
        'requestId': context.aws_request_id,
        'functionName': context.function_name,
        'memoryLimitMB': context.memory_limit_in_mb,
        'remainingTimeMs': context.get_remaining_time_in_millis()
    }))

    count = get_and_increment()

    logger.info(json.dumps({
        'action': 'counter_updated',
        'count': count,
        'requestId': context.aws_request_id
    }))

    return response({'count': count})

Log Retention

# Установите retention, чтобы не копить логи вечно
aws logs put-retention-policy \
  --log-group-name /aws/lambda/visitor-counter \
  --retention-in-days 7

# Для CRC 7 дней достаточно
# Стоимость хранения: $0.03/GB/месяц

CloudWatch Metrics

Встроенные метрики Lambda

Метрика Описание Для CRC
Invocations Количество вызовов Трафик
Duration Время выполнения Производительность
Errors Количество ошибок Здоровье
Throttles Количество throttled вызовов Перегрузка
ConcurrentExecutions Одновременные вызовы Масштабирование

Создание алармов

# Alarm: ошибки Lambda > 5 за 5 минут
aws cloudwatch put-metric-alarm \
  --alarm-name crc-lambda-errors \
  --metric-name Errors \
  --namespace AWS/Lambda \
  --statistic Sum \
  --period 300 \
  --threshold 5 \
  --comparison-operator GreaterThanThreshold \
  --evaluation-periods 1 \
  --dimensions Name=FunctionName,Value=visitor-counter \
  --alarm-actions arn:aws:sns:us-east-1:123456789012:crc-alerts

# Alarm: средняя длительность > 3 секунды
aws cloudwatch put-metric-alarm \
  --alarm-name crc-lambda-duration \
  --metric-name Duration \
  --namespace AWS/Lambda \
  --statistic Average \
  --period 300 \
  --threshold 3000 \
  --comparison-operator GreaterThanThreshold \
  --evaluation-periods 2 \
  --dimensions Name=FunctionName,Value=visitor-counter

CloudWatch Dashboard

# Создаём dashboard
aws cloudwatch put-dashboard \
  --dashboard-name CRC-Dashboard \
  --dashboard-body '{
    "widgets": [
      {
        "type": "metric",
        "properties": {
          "title": "Lambda Invocations",
          "metrics": [
            ["AWS/Lambda", "Invocations", "FunctionName", "visitor-counter"]
          ],
          "period": 300,
          "stat": "Sum"
        }
      },
      {
        "type": "metric",
        "properties": {
          "title": "Lambda Duration",
          "metrics": [
            ["AWS/Lambda", "Duration", "FunctionName", "visitor-counter"]
          ],
          "period": 300,
          "stat": "Average"
        }
      },
      {
        "type": "metric",
        "properties": {
          "title": "Lambda Errors",
          "metrics": [
            ["AWS/Lambda", "Errors", "FunctionName", "visitor-counter"]
          ],
          "period": 300,
          "stat": "Sum"
        }
      },
      {
        "type": "metric",
        "properties": {
          "title": "API Gateway Requests",
          "metrics": [
            ["AWS/ApiGateway", "Count", "ApiId", "API_ID"]
          ],
          "period": 300,
          "stat": "Sum"
        }
      }
    ]
  }'

X-Ray Tracing

X-Ray показывает путь запроса через все сервисы:

# Включаем X-Ray для Lambda
aws lambda update-function-configuration \
  --function-name visitor-counter \
  --tracing-config Mode=Active
# В Lambda с X-Ray
import aws_xray_sdk.core
aws_xray_sdk.core.patch_all()  # Patch boto3, requests, etc.

# Теперь каждый вызов DynamoDB виден в X-Ray trace

Мониторинг расходов

# Текущие расходы
aws ce get-cost-and-usage \
  --time-period Start=$(date -d '30 days ago' +%Y-%m-%d),End=$(date +%Y-%m-%d) \
  --granularity MONTHLY \
  --metrics BlendedCost \
  --group-by Type=DIMENSION,Key=SERVICE

# Free Tier использование
aws ce get-cost-and-usage \
  --time-period Start=$(date -d '30 days ago' +%Y-%m-%d),End=$(date +%Y-%m-%d) \
  --granularity MONTHLY \
  --filter '{"Tags": {"Key": "project", "Values": ["crc"]}}'

Проверь себя

Зачем использовать структурированное логирование (JSON) вместо обычных строк?

Какая метрика Lambda показывает проблемы с производительностью?

Какой alarm следует настроить в первую очередь для CRC?

Что показывает AWS X-Ray для CRC?

Зачем устанавливать Log Retention на 7 дней для CRC?