跳转到内容
搜索文档

基于使用量的计费

最后更新 查看 MarkdownAgent 设置

许多 Cloudflare 客户运营具有多个客户的软件即服务(SaaS)产品。此类公司的一大关切是了解每个客户的成本,以及更广泛地了解客户行为。

记录客户使用的每个 Web 请求可能成本高昂,将页面浏览归因于客户也是如此。在 Cloudflare,我们通过现已通过 Analytics Engine 向您提供的相同内部技术解决了此问题。

记录使用数据

Analytics Engine 设计用于 Cloudflare Workers。如果您已经使用 Cloudflare Workers 处理请求,只需几行代码即可开始向 Analytics Engine 发送数据:

  [...]

  // This examples assumes you give a unique ID to each of your SaaS customers, and the Worker has
  // assigned it to the variable named `customer_id`
  const { pathname } = new URL(request.url);
  env.USAGE_INDEXED_BY_CUSTOMER_ID.writeDataPoint({
    "indexes": [customer_id],
    "blobs": [pathname]
  });

SaaS 客户活动通常遵循指数模式:一个客户可能每秒 1 亿次请求,而另一个每天 100 次请求。如果所有数据一起采样,大客户的使用可能导致小客户的数据被采样为零。Analytics Engine 允许您防止这种情况:在上面的示例代码中,我们提供客户的唯一 ID 作为 index,使 Analytics Engine 分别采样各客户的活动。

查看使用情况

您可以使用 Grafana(用于可视化)或 JSON(用于您自己的工具)开始查看客户数据。Analytics Engine 文档的其他部分对此有深入说明。

查看所有端点的客户使用情况:

SELECT
  index1 AS customer_id,
  sum(_sample_interval) AS count
FROM
  usage_indexed_by_customer_id
GROUP BY customer_id

如果在 Grafana 中运行,此查询返回汇总各客户使用情况的图表。sum(_sample_interval) 考虑了采样——请参阅其他 Analytics Engine 文档。此查询回答"哪些客户最活跃?"

上面的示例 writeDataPoint 调用写入端点名称。如果这样做,可以按端点细分客户活动:

SELECT
  index1 AS customer_id,
  blob1 AS request_endpoint,
  sum(_sample_interval) AS count
FROM
  usage_indexed_by_customer_id
GROUP BY customer_id, request_endpoint

这可以深入了解不同客户使用的端点。这对业务目的(例如了解客户需求)以及让工程师查看活动和行为(可观测性)都很有用。

向客户计费

Analytics Engine 可用于基于可靠的使用量近似值向客户计费。为获得最佳近似值,生成账单时我们建议为每个客户执行一个查询。这比一次查询多个客户产生的采样更少。

SELECT
  index1 AS customer_id,
  blob1 AS request_endpoint,
  sum(_sample_interval) AS usage_count
FROM
  usage_indexed_by_customer_id
WHERE
  customer_id = 'substitute_customer_id_here'
  AND timestamp >= toDateTime('2023-03-01 00:00:00')
  AND timestamp < toDateTime('2023-04-01 00:00:00')
GROUP BY customer_id, request_endpoint

在每月末为每个客户运行一次此查询,可以为您提供生成账单所需的数据。这只是一个示例:您很可能需要根据计费方式调整此示例。

生成账单时,您很可能还需要提供每日成本。以下查询按天细分使用情况:

SELECT
  index1 AS customer_id,
  toStartOfInterval(timestamp, INTERVAL '1' DAY) AS date,
  blob1 AS request_endpoint,
  sum(_sample_interval) AS request_count
FROM
  usage_indexed_by_customer_id
WHERE
  customer_id = 'x'
  AND timestamp >= toDateTime('2023-03-01 00:00:00')
  AND timestamp < toDateTime('2023-04-01 00:00:00')
GROUP BY customer_id, date, request_endpoint

您需要采用上述使用查询,根据收费方式进行调整,并构建后端系统运行这些查询,根据返回的数据计算客户费用。

这篇文档对您有帮助吗?