INTEGRITY Документация

Оплата по факту использования

Многие клиенты Cloudflare предоставляют продукты SaaS (программное обеспечение как услуга) сразу нескольким собственным клиентам. Для таких компаний важно понимать, во что обходится каждый клиент, и в целом разбираться в поведении клиентов.

Хранение данных о каждом веб-запросе клиента может обходиться дорого, как и привязка просмотров страниц к конкретным клиентам. В 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 часто описывается экспоненциальным распределением: один клиент может выполнять 100 миллионов запросов в секунду, а другой всего 100 запросов в день. Если выборка применяется ко всем данным совместно, из-за использования крупных клиентов данные небольших клиентов могут быть отобраны вплоть до нуля. Analytics Engine позволяет этого избежать: в примере кода выше в качестве индекса указывается уникальный ID клиента, благодаря чему 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

Возьмите приведённые выше запросы на использование, адаптируйте их под свою модель тарификации клиентов и настройте бэкенд-систему, которая будет выполнять эти запросы и на основе полученных данных рассчитывать суммы к оплате.