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