在Grafana上可视化Cloudflare R2的GraphQL分析
(只需要一种选择)目标
Cloudflare 提供了多种数据的 GraphQL API。
- Cloudflare GraphQL API で利用可能なデータセット一覧を取得する – Qiita
例如,在R2中,您可以从分析页面上查看存储和A、B类操作的指标,但实际上是通过GraphQL API获取数据并进行展示。
你可以通过Chrome Developer Tools等工具来查看正在使用的GraphQL查询的详细信息,方法如下:

在R2指标的分析页面上,可能需要逐个查看存储桶,并且可能无法显示更详细的数据。
这次我们将使用Grafana来可视化整个账户的指标和更详细的拆分情况,让一目了然。
R2 数据集
- Cloudflare GraphQL データセットの保管期間を確認する – Qiita
截至2023年2月16日,r2OperationsAdaptiveGroups和r2StorageAdaptiveGroups提供了Beta版本,可以回溯最多90天的数据,并且可以一次获取30天的数据范围。
"r2OperationsAdaptiveGroups" "Beta. R2 operations with adaptive sampling"
"r2StorageAdaptiveGroups" "Beta. R2 storage with adaptive sampling"
创建一个Grafana Cloud帐户
我要在「https://grafana.com/products/cloud/」上创建一个免费账户。

由于存在「永久免费」的框架,即使是免费账户,也能够以一种相对可用的方式使用。

安装插件
从「https://grafana.com/grafana/plugins/fifemon-graphql-datasource/」安装GraphQL数据源插件。
由于社区创建的插件,即使在免费计划中也可以持续使用。(https://grafana.com/pricing/?tab=free)

从Grafana Cloud的界面进入到GraphQL数据源的配置页面。

创建一个GraphQL数据源数据源,进行以下设置。
-
- Name > Cloudflare GraphQL Data Source
-
- URL > https://api.cloudflare.com/client/v4/graphql
Custom HTTP Headers > X-AUTH-EMAIL, X-AUTH-KEY

仪表盘导入
由于我们将此次创建的仪表板导出为JSON文件,在GitHub中下载并进行导入。
- https://github.com/kyouheicf/cloudflare-graphql-grafana

选择先前创建的”Cloudflare GraphQL数据源”并导入以完成。

Cloudflare-GraphQL-R2 仪表板
由于存在名为”accountTag”的文本框变量,您可以在其中输入您的 Cloudflare 账户ID,从而显示R2的各种指标。
因为可以按帐户单位进行可视化,所以可以在进行迁移工作等的同时,了解本月可能产生的费用数量。

参考:以此为基础的 GraphQL 查询。
query GetR2Metrics($accountTag: string, $startDate: string) {
viewer {
accounts(filter: {accountTag: $accountTag}) {
storage: r2StorageAdaptiveGroups(orderBy: [bucketName_ASC], limit: 1000, filter: {date_geq: $startDate}) {
dimensions {
bucketName
}
max {
metadataSize
objectCount
payloadSize
uploadCount
}
}
classA: r2OperationsAdaptiveGroups(limit: 1000, filter: {date_geq: $startDate, actionStatus: "success", actionType_in: ["ListBuckets", "PutBucket", "ListObjects", "PutObject", "CopyObject", "CompleteMultipartUpload", "CreateMultipartUpload", "UploadPart", "UploadPartCopy", "PutBucketEncryption", "ListMultipartUploads"]}) {
dimensions {
actionType
}
sum {
requests
responseObjectSize
}
}
classB: r2OperationsAdaptiveGroups(limit: 1000, filter: {date_geq: $startDate, actionStatus: "success", actionType_in: ["HeadBucket", "HeadObject", "GetObject", "ReportUsageSummary", "GetBucketEncryption", "GetBucketLocation"]}) {
dimensions {
actionType
}
sum {
requests
responseObjectSize
}
}
}
}
}