Дополнительные метрики CloudWatch у AWS S3 изначально отключены, а по умолчанию доступны всего лишь две метрики. Это BucketSizeBytes и NumberOfObjects. Алерт разумно сделать разве что по первой, а вторая пригодится лишь для сведения. Полезно было бы видеть метрики, которые отражают качество взаимодействия с клиентами и такие метрики есть! Правда нюанс в том, что включать их нужно отдельно на каждый бакет. Об этом и поговорим сегодня в статье.
Дополнительные метрики CloudWatch у AWS S3
Для подключения метрик можно использовать в том числе Amazon S3 REST API и AWS CLI, но наиболее частый сценарий это конечно UI. Но не забывайте, что ручную работу можно исключить, используя Terraform. С него и начнем, как с самого изящного варианта.
Terraform
За настройку метрик CloudWatch S3 отвечает ресурс aws_s3_bucket_metric 1. Использовать его очень просто:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
resource "aws_s3_bucket" "test_bucket" { bucket = "cw-metrics-test" acl = "private" } resource "aws_s3_bucket_metric" "test_bucket_metrics" { bucket = aws_s3_bucket.test_bucket.bucket # https://docs.aws.amazon.com/AmazonS3/latest/userguide/configure-request-metrics-bucket.html # Names can only contain letters, numbers, periods, dashes, and underscores. # We recommend using the name EntireBucket for a filter that applies to all objects. name = "EntireBucket" } |
А для тех, кто администрирует S3 руками, внизу пошаговая инструкция.
UI
Есть официальный гайд, в котором вы найдете последовательность настройки фильтра для включения метрик, вот он – Creating a CloudWatch metrics configuration for all the objects in your bucket. Русифицированная версия отсутствует. Подписи на скриншотах внизу соответствуют пунктам шагов в инструкции.
3. Choose the Metrics tab.
4. Under Bucket metrics, choose View additional charts.
5. Choose the Request metrics tab.
6. Choose Create filter.
7. In the Filter name box, enter your filter name.
Names can only contain letters, numbers, periods, dashes, and underscores. We recommend using the name EntireBucket for a filter that applies to all objects.
8.Under Filter scope, choose This filter applies to all objects in the bucket.
You can also define a filter so that the metrics are only collected and reported on a subset of objects in the bucket. For more information, see Creating a metrics configuration that filters by prefix, object tag, or access point.
9. Choose Save changes.
После этого можете возвращаться в Bucket metrics и там все увидеть.
При этом в CloudWatch появится новый набор метрик – Request Metrics Per Filter. Вот так это выглядит:
Настройка завершена.
cloudwatch_exporter
CloudWatch отдает базовые метрики – BucketSizeBytes и NumberOfObjects – раз в сутки. На графиках это будет выглядеть как одна единственная точка за 24 часа. Для Прометея это не подходит – хочется видеть именно непрерывный график, по которому можно будет алертить.
Именно поэтому у меня будут использоваться кастомные параметры для этих двух метрик:
1 2 3 |
range_seconds: 172800 # 2 day period_seconds: 86400 set_timestamp: false |
Последний параметр нужен, чтобы экспортер не выставлял отметку времени, ведь если она будет старше 5 минут (а она будет, читай выше), то Prometheus справедливо посчитает метрику как Staleness 2 3. Этот хак и позволяет растянуть в горизонтальную линию одну единственную точку.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
--- delay_seconds: 0 range_seconds: 300 region: us-east-1 metrics: # https://docs.aws.amazon.com/AmazonS3/latest/userguide/metrics-dimensions.html # common - aws_namespace: AWS/S3 aws_metric_name: BucketSizeBytes aws_dimensions: [StorageType,BucketName] aws_statistics: [Average] range_seconds: 172800 # 2 day period_seconds: 86400 set_timestamp: false - aws_namespace: AWS/S3 aws_metric_name: NumberOfObjects aws_dimensions: [StorageType,BucketName] aws_statistics: [Average] range_seconds: 172800 # 2 day period_seconds: 86400 set_timestamp: false # read how to enable the metrics below: https://docs.aws.amazon.com/AmazonS3/latest/userguide/configure-request-metrics-bucket.html # requests - aws_namespace: AWS/S3 aws_metric_name: GetRequests aws_dimensions: [FilterId,BucketName] aws_statistics: [Sum] - aws_namespace: AWS/S3 aws_metric_name: PutRequests aws_dimensions: [FilterId,BucketName] aws_statistics: [Sum] - aws_namespace: AWS/S3 aws_metric_name: DeleteRequests aws_dimensions: [FilterId,BucketName] aws_statistics: [Sum] - aws_namespace: AWS/S3 aws_metric_name: FirstByteLatency aws_dimensions: [FilterId,BucketName] aws_statistics: [Average] - aws_namespace: AWS/S3 aws_metric_name: TotalRequestLatency aws_dimensions: [FilterId,BucketName] aws_statistics: [Average] |
Обратите внимание, что метрики requests по умолчанию возвращают точки значительно чаще – раз в минуту:
Request metrics are available at one-minute intervals after some latency for processing.
Именно поэтому параметров cloudwatch_exporter по умолчанию нам достаточно. На этом все. Успехов!