在Grafana上可视化Cloudflare R2的GraphQL分析

(只需要一种选择)目标

Cloudflare 提供了多种数据的 GraphQL API。

    Cloudflare GraphQL API で利用可能なデータセット一覧を取得する – Qiita

例如,在R2中,您可以从分析页面上查看存储和A、B类操作的指标,但实际上是通过GraphQL API获取数据并进行展示。

你可以通过Chrome Developer Tools等工具来查看正在使用的GraphQL查询的详细信息,方法如下:

image-20230216210517265

在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/」上创建一个免费账户。

image-20230216172040540

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

image-20230216172103405

安装插件

从「https://grafana.com/grafana/plugins/fifemon-graphql-datasource/」安装GraphQL数据源插件。

由于社区创建的插件,即使在免费计划中也可以持续使用。(https://grafana.com/pricing/?tab=free)

image-20230216172734112

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

image-20230216173113880

创建一个GraphQL数据源数据源,进行以下设置。

    • Name > Cloudflare GraphQL Data Source

 

    • URL > https://api.cloudflare.com/client/v4/graphql

Custom HTTP Headers > X-AUTH-EMAIL, X-AUTH-KEY

image-20230216173434257

仪表盘导入

由于我们将此次创建的仪表板导出为JSON文件,在GitHub中下载并进行导入。

    https://github.com/kyouheicf/cloudflare-graphql-grafana
image-20230216211829191

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

image-20230216173826095

Cloudflare-GraphQL-R2 仪表板

由于存在名为”accountTag”的文本框变量,您可以在其中输入您的 Cloudflare 账户ID,从而显示R2的各种指标。

因为可以按帐户单位进行可视化,所以可以在进行迁移工作等的同时,了解本月可能产生的费用数量。

image-20230216174208651

参考:以此为基础的 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
        }
      }
    }
  }
}
广告
将在 10 秒后关闭
bannerAds