From 2db6bca58df1a584b3df544f9d5ea6c451eeaef5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kevin=20Gr=C3=BCneberg?= Date: Tue, 6 Aug 2024 15:43:04 +0800 Subject: [PATCH] feat: support for new billable metrics (#28399) --- .../BillingBreakdown.constants.ts | 45 ++++++++++++++++++- .../BillingBreakdown/UpcomingInvoice.tsx | 2 +- .../Organization/Usage/TotalUsage.tsx | 22 ++++++++- .../data/analytics/org-daily-stats-query.ts | 9 +++- 4 files changed, 73 insertions(+), 5 deletions(-) diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.constants.ts b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.constants.ts index ba64d28edf3..c8d98675c00 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.constants.ts +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/BillingBreakdown.constants.ts @@ -45,6 +45,14 @@ export const BILLING_BREAKDOWN_METRICS: Metric[] = [ category: 'Authentication', unitName: 'MAU', }, + { + key: PricingMetric.MONTHLY_ACTIVE_THIRD_PARTY_USERS, + name: 'Monthly Active Third-Party Users', + units: 'absolute', + anchor: 'mauSso', + category: 'Authentication', + unitName: 'MAU', + }, { key: PricingMetric.STORAGE_SIZE, name: 'Storage Size', @@ -82,11 +90,46 @@ export const BILLING_BREAKDOWN_METRICS: Metric[] = [ category: 'Edge Functions', }, { - key: PricingMetric.DISK_SIZE_GB_HOURS, + key: PricingMetric.DISK_SIZE_GB_HOURS_GP3, name: 'Disk Size', units: 'absolute', unitName: 'GB-Hrs', category: 'Database', tip: 'Each project gets provisioned with 8 GB of disk. When you get close to the disk size limit, we autoscale your disk by 1.5x. The first 8 GB of disk is free for every single project.', }, + { + key: PricingMetric.DISK_SIZE_GB_HOURS_IO2, + name: 'Disk Size IO2', + units: 'absolute', + unitName: 'GB-Hrs', + category: 'Database', + }, + { + key: PricingMetric.DISK_IOPS_IO2, + name: 'Disk IOPS IO2', + units: 'absolute', + unitName: 'IOPS-Hrs', + category: 'Database', + }, + { + key: PricingMetric.DISK_IOPS_GP3, + name: 'Disk IOPS GP3', + units: 'absolute', + unitName: 'IOPS-Hrs', + category: 'Database', + }, + { + key: PricingMetric.DISK_THROUGHPUT_GP3, + name: 'Disk Throughput', + units: 'absolute', + unitName: 'IOPS-Hrs', + category: 'Database', + }, + { + key: PricingMetric.LOG_DRAIN_EVENTS, + name: 'Log Drain Events', + units: 'absolute', + unitName: 'hours', + category: 'Database', + }, ] diff --git a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/UpcomingInvoice.tsx b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/UpcomingInvoice.tsx index d3fe1d030e1..7d90cf17f7f 100644 --- a/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/UpcomingInvoice.tsx +++ b/apps/studio/components/interfaces/Organization/BillingSettings/BillingBreakdown/UpcomingInvoice.tsx @@ -48,7 +48,7 @@ const UpcomingInvoice = ({ slug }: UpcomingInvoiceProps) => { const fixedFees = useMemo(() => { return (upcomingInvoice?.lines || []) - .filter((item) => item !== computeCredits && !item.breakdown) + .filter((item) => item !== computeCredits && (!item.breakdown || !item.breakdown.length)) .sort((a, b) => { // Prorations should be below regular usage fees return Number(a.proration) - Number(b.proration) diff --git a/apps/studio/components/interfaces/Organization/Usage/TotalUsage.tsx b/apps/studio/components/interfaces/Organization/Usage/TotalUsage.tsx index f664536c08a..08f60c25213 100644 --- a/apps/studio/components/interfaces/Organization/Usage/TotalUsage.tsx +++ b/apps/studio/components/interfaces/Organization/Usage/TotalUsage.tsx @@ -8,7 +8,11 @@ import BillingMetric from '../BillingSettings/BillingBreakdown/BillingMetric' import { BILLING_BREAKDOWN_METRICS } from '../BillingSettings/BillingBreakdown/BillingBreakdown.constants' import ComputeMetric from '../BillingSettings/BillingBreakdown/ComputeMetric' import clsx from 'clsx' -import { ComputeUsageMetric, computeUsageMetricLabel } from 'data/analytics/org-daily-stats-query' +import { + ComputeUsageMetric, + computeUsageMetricLabel, + PricingMetric, +} from 'data/analytics/org-daily-stats-query' export interface ComputeProps { orgSlug: string @@ -19,6 +23,14 @@ export interface ComputeProps { currentBillingCycleSelected: boolean } +const METRICS_TO_HIDE_WITH_NO_USAGE: PricingMetric[] = [ + PricingMetric.DISK_IOPS_IO2, + PricingMetric.DISK_IOPS_GP3, + PricingMetric.DISK_SIZE_GB_HOURS_GP3, + PricingMetric.DISK_SIZE_GB_HOURS_IO2, + PricingMetric.DISK_THROUGHPUT_GP3, +] + const TotalUsage = ({ orgSlug, projectRef, @@ -62,7 +74,13 @@ const TotalUsage = ({ const breakdownMetrics = BILLING_BREAKDOWN_METRICS.filter((metric) => usage.usages.some((usage) => !usage.available_in_plan || usage.metric === metric.key) - ) + ).filter((metric) => { + if (!METRICS_TO_HIDE_WITH_NO_USAGE.includes(metric.key as PricingMetric)) return true + + const metricUsage = usage.usages.find((it) => it.metric === metric.key) + + return metricUsage && metricUsage.usage > 0 + }) return breakdownMetrics.slice().sort((a, b) => { const usageMetaA = usage.usages.find((x) => x.metric === a.key) diff --git a/apps/studio/data/analytics/org-daily-stats-query.ts b/apps/studio/data/analytics/org-daily-stats-query.ts index fa4e3797cc1..4f03e565f34 100644 --- a/apps/studio/data/analytics/org-daily-stats-query.ts +++ b/apps/studio/data/analytics/org-daily-stats-query.ts @@ -21,9 +21,11 @@ export enum PricingMetric { EGRESS = 'EGRESS', DATABASE_SIZE = 'DATABASE_SIZE', STORAGE_SIZE = 'STORAGE_SIZE', - DISK_SIZE_GB_HOURS = 'DISK_SIZE_GB_HOURS', + DISK_SIZE_GB_HOURS_GP3 = 'DISK_SIZE_GB_HOURS_GP3', + DISK_SIZE_GB_HOURS_IO2 = 'DISK_SIZE_GB_HOURS_IO2', MONTHLY_ACTIVE_USERS = 'MONTHLY_ACTIVE_USERS', MONTHLY_ACTIVE_SSO_USERS = 'MONTHLY_ACTIVE_SSO_USERS', + MONTHLY_ACTIVE_THIRD_PARTY_USERS = 'MONTHLY_ACTIVE_THIRD_PARTY_USERS', FUNCTION_INVOCATIONS = 'FUNCTION_INVOCATIONS', STORAGE_IMAGES_TRANSFORMED = 'STORAGE_IMAGES_TRANSFORMED', REALTIME_MESSAGE_COUNT = 'REALTIME_MESSAGE_COUNT', @@ -33,6 +35,11 @@ export enum PricingMetric { PITR_7 = 'PITR_7', PITR_14 = 'PITR_14', PITR_28 = 'PITR_28', + DISK_IOPS_GP3 = 'DISK_IOPS_GP3', + DISK_IOPS_IO2 = 'DISK_IOPS_IO2', + DISK_THROUGHPUT_GP3 = 'DISK_THROUGHPUT_GP3', + LOG_DRAIN = 'LOG_DRAIN', + LOG_DRAIN_EVENTS = 'LOG_DRAIN_EVENTS', } export enum ComputeUsageMetric {