Skip to main content

Metrics and analytics

R2 exposes analytics for requests, storage, and bandwidth usage across your buckets.

The metrics displayed for a bucket in the Cloudflare dashboard are queried from Cloudflare's GraphQL Analytics API. You can access the metrics programmatically via GraphQL or HTTP client.

Metrics

R2 has three datasets:

DatasetGraphQL Dataset NameDescription
Operationsr2OperationsAdaptiveGroupsThis dataset consists of the operations taken on a bucket within an account.
Storager2StorageAdaptiveGroupsThis dataset consists of the storage of a bucket within an account.
Bandwidthr2BandwidthUsageAdaptiveGroupsDataset contains uploaded and downloaded bytes for buckets within an account.

Metrics can be queried for a maximum range of 31 days. These datasets require an accountTag filter with your Cloudflare account ID.

Querying buckets with jurisdiction restriction

In your account, you may have two buckets of the same name, one with a specified jurisdiction, and one without.

Therefore, if you want to query metrics about a bucket which has a specified jurisdiction, you must include the jurisdiction followed by an underscore before the bucket name. For example: eu_bucket-name. This ensures you query the correct bucket.

Operations dataset

FieldDescription
actionTypeThe name of the operation performed.
actionStatusThe status of the operation. Can be success, userError, or internalError.
bucketNameThe bucket this operation was performed on if applicable. For buckets with a jurisdiction specified, you must include the jurisdiction followed by an underscore before the bucket name. For example: eu_your-bucket-name
objectNameThe object this operation was performed on if applicable.
responseStatusCodeThe http status code returned by this operation.
datetimeThe time of the request.

Storage dataset

FieldDescription
bucketNameThe bucket this storage value is for. For buckets with a jurisdiction specified, you must include the jurisdiction followed by an underscore before the bucket name. For example: eu_your-bucket-name
payloadSizeThe size of the objects in the bucket.
metadataSizeThe size of the metadata of the objects in the bucket.
objectCountThe number of objects in the bucket.
uploadCountThe number of pending multipart uploads in the bucket.
datetimeThe time that this storage value represents.

Bandwidth dataset

The dataset excludes bandwidth transfers smaller than 100 KiB. This threshold applies to transfer size, not object size.

You can filter by the following fields:

FieldDescription
bucketNameThe R2 bucket identifier, including the jurisdiction prefix if applicable.
dateThe transfer timestamp truncated to the start of the day.
datetimeHourThe transfer timestamp truncated to the start of the hour.
datetimeFifteenMinutesThe transfer timestamp rounded down to the nearest quarter hour.
datetimeFiveMinutesThe transfer timestamp truncated to the start of the five-minute interval.
datetimeMinuteThe transfer timestamp truncated to the start of the minute.
datetimeThe raw transfer timestamp.

The following fields can be summed:

FieldDescription
bytesDownloadDownloaded bytes.
bytesUploadUploaded bytes.

View via the dashboard

Per-bucket analytics for R2 are available in the Cloudflare dashboard. To view current and historical metrics for a bucket:

  1. In the Cloudflare dashboard, go to the R2 object storage page.

    dash.cloudflare.com

  2. Select your bucket.

  3. Select the Metrics tab.

You can optionally select a time window to query. This defaults to the last 24 hours.

Query via the GraphQL API

You can programmatically query analytics for your R2 buckets via the GraphQL Analytics API. This API queries the same dataset as the Cloudflare dashboard, and supports GraphQL introspection.

Examples

Operations

To query the volume of each operation type on a bucket for a given time period you can run a query as such

query R2VolumeExample(
	$accountTag: string!
	$startDate: Time
	$endDate: Time
	$bucketName: string
) {
	viewer {
		accounts(filter: { accountTag: $accountTag }) {
			r2OperationsAdaptiveGroups(
				limit: 10000
				filter: {
					datetime_geq: $startDate
					datetime_leq: $endDate
					bucketName: $bucketName
				}
			) {
				sum {
					requests
				}
				dimensions {
					actionType
				}
			}
		}
	}
}

The bucketName field can be removed to get an account level overview of operations. The volume of operations can be broken down even further by adding more dimensions to the query.

Storage

To query the storage of a bucket over a given time period you can run a query as such.

query R2StorageExample(
	$accountTag: string!
	$startDate: Time
	$endDate: Time
	$bucketName: string
) {
	viewer {
		accounts(filter: { accountTag: $accountTag }) {
			r2StorageAdaptiveGroups(
				limit: 10000
				filter: {
					datetime_geq: $startDate
					datetime_leq: $endDate
					bucketName: $bucketName
				}
				orderBy: [datetime_DESC]
			) {
				max {
					objectCount
					uploadCount
					payloadSize
					metadataSize
				}
				dimensions {
					datetime
				}
			}
		}
	}
}

Bandwidth

To query hourly uploads and downloads for a bucket. Results contain byte totals, not transfer rates, and excluded transfers smaller than 100 KiB.

query R2BandwidthExample(
	$accountTag: string!
	$startDate: Time!
	$endDate: Time!
	$bucketName: string!
) {
	viewer {
		accounts(filter: { accountTag: $accountTag }) {
			r2BandwidthUsageAdaptiveGroups(
				limit: 1000
				filter: {
					datetime_geq: $startDate
					datetime_lt: $endDate
					bucketName: $bucketName
				}
				orderBy: [datetimeHour_ASC]
			) {
				sum {
					bytesUpload
					bytesDownload
				}
				dimensions {
					datetimeHour
				}
			}
		}
	}
}