Copyright © 2024 – FinOps Open Cost and Usage Specification (FOCUS) a Series of the Joint Development Foundation Projects, LLC. Linux Foundation trademark, and document use rules apply.
This section describes the status of this document at the time of its publication.
This is a published release of the FinOps Open Cost and Usage Specification.
This document was produced by a group operating under the Joint Development Foundation Projects agreement. FOCUS maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information.
Copyright (c) Joint Development Foundation Projects, LLC, FinOps Open Cost and Usage Specification (FOCUS) Series and its contributors. The materials in this repository are made available under the Creative Commons Attribution 4.0 International license (CC-BY-4.0), available at [ https://creativecommons.org/licenses/by/4.0/legalcode](https://creativecommons.org/licenses/by/4.0/legalcode).
This work is made available under: Creative Commons Attribution 4.0 International License.
THESE MATERIALS ARE PROVIDED “AS IS.” The parties expressly disclaim any warranties (express, implied, or otherwise), including implied warranties of merchantability, non-infringement, fitness for a particular purpose, or title, related to the materials. The entire risk as to implementing or otherwise using the materials is assumed by the implementer and user. IN NO EVENT WILL THE PARTIES BE LIABLE TO ANY OTHER PARTY FOR LOST PROFITS OR ANY FORM OF INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER FROM ANY CAUSES OF ACTION OF ANY KIND WITH RESPECT TO THIS DELIVERABLE OR ITS GOVERNING AGREEMENT, WHETHER BASED ON BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), OR OTHERWISE, AND WHETHER OR NOT THE OTHER MEMBER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This document is governed by the Patent Policy Option 4: W3C Mode: See project charter.
FOCUS is an open-source specification for billing data. It defines a common schema for billing data, aligns terminology with the FinOps Framework and defines a minimum set of requirements for billing data. The specification provides clear guideline for billing data generators to produce FinOps-serviceable data. The specification enables FinOps practitioners to perform common FinOps capabilities such as chargeback, cost allocation, budgeting and forecasting etc. using a generic set of instructions, regardless of the origin of the FOCUS compatible dataset.
Thanks to the following FOCUS Maintainers for their leadership and contributions to the FOCUS Release v1.1 specification.
Thanks to the following FOCUS members for their contributions to the FOCUS Release v1.1 specification.
Thanks to the following FOCUS Steering Committee members for their leadership on the FOCUS specification.
This section is non-normative.
FOCUS aims to establish a community-driven specification for consumption-based billing data. Due to the lack of a broadly adopted specification, infrastructure and services
providers
have resorted to proprietary billing schemas and terminology. The lack of conformance amongst the billing data generators has forced FinOps practitioners to employ disparate, best-effort schemes which each practitioner must develop individually for each provider to perform essential FinOps capabilities such as chargeback, cost allocation, budgeting and forecasting.
The FOCUS specification’s schema definition and FinOps-aligned terminology provide a clear guide for producing FinOps-serviceable billing datasets. Datasets conforming to FOCUS enable FinOps practitioners to perform common FinOps capabilities, like the ones mentioned above, using a generic set of instructions, regardless of the origin of the dataset.
This project is supported by the FinOps Foundation. This work initially started under the Open Billing working group under the FinOps Foundation. The decision was made in Jan 2023 to begin to migrate the work to a newly formed project under the Linux Foundation called the FinOps Open Cost and Usage Specification (FOCUS) to better support the creation of a specification.
This specification is designed to be used by three major groups:
The FOCUS working group will develop an open-source specification for billing data. The schema will define data
dimensions
,
metrics
, a set of attributes about billing data, and a common lexicon for describing billing data.
The following principles were considered while building the specification.
The keywords “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this specification are to be interpreted as described in BCP14 [ RFC2119][ RFC8174] when, and only when, they appear in all capitals, as shown here.
Under each column defined in the FOCUS specification, there exists a ‘Feature level’ designation that describes the column as ‘Mandatory’, ‘Conditional’, or ‘Optional’. Feature level is designated based on the following criteria described in the normative requirements in each column definition:
There are no current resources available to test for specification conformance or validators to run on sample data. When one becomes available, this section of the specification will be updated with details.
The FOCUS specification defines a group of columns that provide qualitative values (such as dates, resource, and provider information) categorized as “dimensions” and quantitative values (numeric values) categorized as “metrics” that can be used for performing various FinOps capabilities. Metrics are commonly used for aggregations (sum, multiplication, averaging etc.) and statistical operations within the dataset. Dimensions are commonly used to categorize, filter, and reveal details in your data when combined with metrics. The Columns are presented in Alphabetical order.
An
availability zone
is a provider-assigned identifier for a physically separated and isolated area within a Region that provides high availability and fault tolerance. Availability Zone is commonly used for scenarios like analyzing cross-zone data transfer usage and the corresponding cost based on where
resources
are deployed.
The AvailabilityZone column is RECOMMENDED to be present in a
FOCUS dataset
when the provider supports deploying resources or services within an availability zone. This column MUST be of type String and MAY contain null values when a charge is not specific to an availability zone.
AvailabilityZone
Availability Zone
A provider-assigned identifier for a physically separated and isolated area within a Region that provides high availability and fault tolerance.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Recommended |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
The
billed cost
represents a charge serving as the basis for invoicing, inclusive of the impacts of all reduced rates and discounts while excluding the
amortization
of relevant purchases (one-time or recurring) paid to cover future eligible charges. This cost is denominated in the Billing Currency. The Billed Cost is commonly used to perform FinOps capabilities that require cash-basis accounting such as cost allocation, budgeting, and invoice reconciliation.
The BilledCost column MUST be present in a
FOCUS dataset
and MUST NOT be null. This column MUST be of type Decimal, MUST conform to Numeric Format, and be denominated in the BillingCurrency. The sum of the BilledCost for
rows
in a given
billing period
MUST match the sum of the invoices received for that billing period for a
billing account
.
BilledCost
Billed Cost
A charge serving as the basis for invoicing, inclusive of all reduced rates and discounts while excluding the amortization of upfront charges (one-time or recurring).
Constraint | Value |
---|---|
Column type | Metric |
Feature level | Mandatory |
Allows nulls | False |
Data type | Decimal |
Value format | Numeric Format |
Number range | Any valid decimal value |
A Billing Account ID is a provider-assigned identifier for a
billing account
. Billing accounts are commonly used for scenarios like grouping based on organizational constructs, invoice reconciliation and cost allocation strategies.
The BillingAccountId column MUST be present in a
FOCUS dataset
. This column MUST be of type String and MUST NOT contain null values. BillingAccountId MUST be a globally unique identifier within a provider.
See Appendix: Grouping constructs for resources or services for details and examples of the different grouping constructs supported by FOCUS.
BillingAccountId
Billing Account ID
The identifier assigned to a billing account by the provider.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | False |
Data type | String |
Value format | <not specified> |
A Billing Account Name is a display name assigned to a
billing account
. Billing accounts are commonly used for scenarios like grouping based on organizational constructs, invoice reconciliation and cost allocation strategies.
The BillingAccountName column MUST be present in a
FOCUS dataset
and MUST NOT be null when the provider supports assigning a display name for the billing account. This column MUST be of type String. BillingAccountName MUST be unique within a customer when a customer has more than one billing account.
See Appendix: Grouping constructs for resources or services for details and examples of the different grouping constructs supported by FOCUS.
BillingAccountName
Billing Account Name
The display name assigned to a billing account.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
Billing currency
is an identifier that represents the currency that a charge for
resources
or
services
was billed in. Billing Currency is commonly used in scenarios where costs need to be grouped or aggregated.
The BillingCurrency column MUST be present in a
FOCUS dataset
. BillingCurrency MUST match the currency used in the invoice generated by the invoice issuer. This column MUST be of type String and MUST NOT contain null values. BillingCurrency MUST conform to Currency Code Format requirements.
BillingCurrency
Billing Currency
Represents the currency that a charge was billed in.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | False |
Data type | String |
Value format | Currency Code Format |
Billing Period End represents the
exclusive
end date and time of a
billing period
. For example, a time period where BillingPeriodStart is ‘2024-01-01T00:00:00Z’ and BillingPeriodEnd is ‘2024-02-01T00:00:00Z’ includes charges for January, since BillingPeriodStart is
inclusive
, but does not include charges for February since BillingPeriodEnd is exclusive.
The BillingPeriodEnd column MUST be present in a
FOCUS dataset
. This column MUST be of type Date/Time Format, MUST be an exclusive value, and MUST NOT contain null values. The sum of the BilledCost column for
rows
in a given billing period MUST match the sum of the invoices received for that billing period for a
billing account
.
BillingPeriodEnd
Billing Period End
The
exclusive
end date and time of a
billing period
.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | False |
Data type | Date/Time |
Value format | Date/Time Format |
Billing Period Start represents the
inclusive
start date and time of a
billing period
. For example, a time period where BillingPeriodStart is ‘2024-01-01T00:00:00Z’ and BillingPeriodEnd is ‘2024-02-01T00:00:00Z’ includes charges for January, since BillingPeriodStart is inclusive, but does not include charges for February since BillingPeriodEnd is
exclusive
.
The BillingPeriodStart column MUST be present in a
FOCUS dataset
, MUST be of type Date/Time Format, MUST be an inclusive value, and MUST NOT contain null values. The sum of the BilledCost metric for
rows
in a given billing period MUST match the sum of the invoices received for that billing period for a
billing account
.
BillingPeriodStart
Billing Period Start
The
inclusive
start date and time of a
billing period
.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | False |
Data type | Date/Time |
Value format | Date/Time Format |
A Capacity Reservation ID is the identifier assigned to a
capacity reservation
by the provider. Capacity Reservation ID is commonly used for scenarios to allocate charges for capacity reservation usage.
The CapacityReservationId column adheres to the following requirements:
CapacityReservationId
Capacity Reservation ID
The identifier assigned to a capacity reservation by the provider.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
Capacity Reservation Status indicates whether the charge represents either the consumption of the
capacity reservation
identified in the CapacityReservationId column or when the capacity reservation is unused.
The CapacityReservationStatus column adheres to the following requirements:
CapacityReservationStatus
Capacity Reservation Status
Indicates whether the charge represents either the consumption of a capacity reservation or when a capacity reservation is unused.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | Allowed Values |
Allowed values:
Value | Description |
---|---|
Used | Charges that utilized a specific amount of a capacity reservation. |
Unused | Charges that represent the unused portion of a capacity reservation. |
Charge Category represents the highest-level classification of a charge based on the nature of how it is billed. Charge Category is commonly used to identify and distinguish between types of charges that may require different handling.
The ChargeCategory column MUST be present in a
FOCUS dataset
and MUST NOT be null. This column is of type String and MUST be one of the allowed values.
ChargeCategory
Charge Category
Represents the highest-level classification of a charge based on the nature of how it is billed.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | False |
Data type | String |
Value format | Allowed values |
Allowed values:
Value | Description |
---|---|
Usage | Positive or negative charges based on the quantity of a service or resource that was consumed over a given period of time including refunds. |
Purchase | Positive or negative charges for the acquisition of a service or resource bought upfront or on a recurring basis including refunds. |
Tax | Positive or negative applicable taxes that are levied by the relevant authorities including refunds. Tax charges may vary depending on factors such as the location, jurisdiction, and local or federal regulations. |
Credit | Positive or negative charges granted by the provider for various scenarios e.g promotional credits or corrections to promotional credits. |
Adjustment | Positive or negative charges the provider applies that do not fall into other category values. |
Charge Class indicates whether the row represents a correction to a previously invoiced
billing period
. Charge Class is commonly used to differentiate corrections from regularly incurred charges.
The ChargeClass column MUST be present in a
FOCUS dataset
. This column MUST be of type String and MUST be “Correction” when the row represents a correction to a previously invoiced billing period. ChargeClass MUST be null when it is not a correction or when it is a correction within the current billing period.
ChargeClass
Charge Class
Indicates whether the row represents a correction to a previously invoiced billing period.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | True |
Data type | String |
Value format | Allowed values |
Allowed values:
Value | Description |
---|---|
Correction | Correction to a previously invoiced billing period (e.g., refunds and credit modifications). |
A Charge Description provides a high-level context of a
row
without requiring additional discovery. This column is a self-contained summary of the charge’s purpose and price. It typically covers a select group of corresponding details across a billing dataset or provides information not otherwise available.
The ChargeDescription column MUST be present in a
FOCUS dataset
, MUST be of type String, and SHOULD NOT be null. Providers SHOULD specify the length of this column in their publicly available documentation.
ChargeDescription
Charge Description
Self-contained summary of the charge’s purpose and price.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
Charge Frequency indicates how often a charge will occur. Along with the charge period related columns, the Charge Frequency is commonly used to understand recurrence periods (e.g., monthly, yearly), forecast upcoming charges, and differentiate between one-time and recurring fees for purchases.
The ChargeFrequency column is RECOMMENDED be present in a
FOCUS dataset
and MUST NOT be null. This column is of type String and MUST be one of the allowed values. When ChargeCategory is “Purchase”, ChargeFrequency MUST NOT be “Usage-Based”.
ChargeFrequency
Charge Frequency
Indicates how often a charge will occur.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Recommended |
Allows nulls | False |
Data type | String |
Value format | Allowed values |
Allowed values:
Value | Description |
---|---|
One-Time | Charges that only happen once and will not repeat. One-time charges are typically recorded on the hour or day when the cost was incurred. |
Recurring | Charges that repeat on a periodic cadence (e.g., weekly, monthly) regardless of whether the product or service was used. Recurring charges typically happen on the same day or point within every period. The charge date does not change based on how or when the service is used. |
Usage-Based | Charges that repeat every time the service is used. Usage-based charges are typically recorded hourly or daily, based on the granularity of the cost data for the period when the service was used (referred to as charge period). Usage-based charges are not recorded when the service is not used. |
Charge Period End represents the
exclusive
end date and time of a
charge period
. For example, a time period where ChargePeriodStart is ‘2024-01-01T00:00:00Z’ and ChargePeriodEnd is ‘2024-01-02T00:00:00Z’ includes charges for January 1, since ChargePeriodStart is
inclusive
, but does not include charges for January 2 since ChargePeriodEnd is exclusive.
ChargePeriodEnd MUST be present in a
FOCUS dataset
, MUST be of type Date/Time, MUST be an exclusive value, and MUST NOT contain null values. ChargePeriodEnd MUST match the ending date and time boundary of the effective period of the charge.
ChargePeriodEnd
Charge Period End
The
exclusive
end date and time of a charge period.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | False |
Data type | Date/Time |
Value format | Date/Time Format |
Charge Period Start represents the
inclusive
start date and time within a
charge period
. For example, a time period where ChargePeriodStart is ‘2024-01-01T00:00:00Z’ and ChargePeriodEnd is ‘2024-01-02T00:00:00Z’ includes charges for January 1, since ChargePeriodStart is inclusive, but does not include charges for January 2 since ChargePeriodEnd is
exclusive
.
ChargePeriodStart MUST be present in a
FOCUS dataset
, MUST be of type Date/Time, MUST be an inclusive value, and MUST NOT contain null values. ChargePeriodStart MUST match the beginning date and time boundary of the effective period of the charge.
ChargePeriodStart
Charge Period Start
The
inclusive
start date and time within a
charge period
.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | False |
Data type | Date/Time |
Value format | Date/Time Format |
Commitment Discount Category indicates whether the
commitment discount
identified in the CommitmentDiscountId column is based on usage quantity or cost (aka “spend”). The CommitmentDiscountCategory column is only applicable to commitment discounts and not
negotiated discounts
.
The CommitmentDiscountCategory column MUST be present in a
FOCUS dataset
when the provider supports commitment discounts. This column MUST be of type String, MUST be null when CommitmentDiscountId is null, and MUST NOT be null when CommitmentDiscountId is not null. The CommitmentDiscountCategory MUST be one of the allowed values.
CommitmentDiscountCategory
Commitment Discount Category
Indicates whether the commitment discount identified in the CommitmentDiscountId column is based on usage quantity or cost (aka “spend”).
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | Allowed Values |
Allowed values:
Value | Description |
---|---|
Spend | Commitment discounts that require a predetermined amount of spend. |
Usage | Commitment discounts that require a predetermined amount of usage. |
A Commitment Discount ID is the identifier assigned to a
commitment discount
by the provider. Commitment Discount ID is commonly used for scenarios like chargeback for commitments and savings per commitment discount. The CommitmentDiscountId column is only applicable to commitment discounts and not
negotiated discounts
.
The CommitmentDiscountId column MUST be present in a
FOCUS dataset
when the provider supports commitment discounts. This column MUST be of type String and MUST NOT contain null values when a charge is related to a commitment discount. When a charge is not associated with a commitment discount, the column MUST be null. CommitmentDiscountId MUST ensure global uniqueness within the provider and SHOULD be a fully-qualified identifier.
CommitmentDiscountId
Commitment Discount ID
The identifier assigned to a commitment discount by the provider.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
A Commitment Discount Name is the display name assigned to a
commitment discount
. The CommitmentDiscountName column is only applicable to commitment discounts and not
negotiated discounts
.
The CommitmentDiscountName column MUST be present in a
FOCUS dataset
when the provider supports commitment discounts. This column MUST be of type String. The CommitmentDiscountName value MUST be null if the charge is not related to a commitment discount and MAY be null if a display name cannot be assigned to a commitment discount. CommitmentDiscountName MUST NOT be null if a display name can be assigned to a commitment discount.
CommitmentDiscountName
Commitment Discount Name
The display name assigned to a commitment discount.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
Commitment Discount Quantity is the amount of a
commitment discount
purchased or accounted for in commitment discount related
rows
that is denominated in Commitment Discount Units. The aggregated Commitment Discount Quantity across purchase records, pertaining to a particular Commitment Discount ID during its
term
, represents the total Commitment Discount Units acquired with that commitment discount. For committed usage, the Commitment Discount Quantity is either the number of Commitment Discount Units consumed by a row that is covered by a commitment discount or is the unused portion of a commitment discount over a charge period. Commitment Discount Quantity is commonly used in commitment discount analysis and optimization use cases and only applies to commitment discounts, not
negotiated discounts
.
When CommitmentDiscountCategory is “Usage” (usage-based commitment discounts), the Commitment Discount Quantity reflects the predefined amount of usage purchased or consumed. If
commitment discount flexibility
is applicable, this value may be further transformed based on additional, provider-specific requirements. When CommitmentDiscountCategory is “Spend” (spend-based commitment discounts), the Commitment Discount Quantity reflects the predefined amount of spend purchased or consumed.
The CommitmentDiscountQuantity column adheres to the following requirements:
In cases where the ChargeCategory is “Purchase”, CommitmentDiscountId is not null, and ChargeClass is not “Correction”, the following applies:
In cases where the ChargeCategory is “Usage”, CommitmentDiscountId is not null, and ChargeClass is not “Correction”, the following applies:
CommitmentDiscountQuantity MUST be null in all other cases.
CommitmentDiscountQuantity
Commitment Discount Quantity
The amount of a commitment discount purchased or accounted for in commitment discount related rows that is denominated in Commitment Discount Units.
Aggregation: When aggregating Commitment Discount Quantity for commitment utilization calculations, it’s important to exclude commitment discount purchases (i.e. when ChargeCategory is “Purchase”) that are paid to cover future eligible charges (e.g., commitment discount). Otherwise, when accounting for all upfront or accrued purchases, it’s important to exclude commitment discount usage (i.e. when ChargeCategory is “Usage”). This exclusion helps prevent double counting of these quantities in the aggregation.
Constraint | Value |
---|---|
Column type | Metric |
Feature level | Conditional |
Allows nulls | True |
Data type | Decimal |
Value format | Numeric Format |
Number range | Any valid decimal value |
Commitment Discount Status indicates whether the charge corresponds with the consumption of a
commitment discount
identified in the CommitmentDiscountId column or the unused portion of the committed amount. The CommitmetnDiscountStatus column is only applicable to commitment discounts and not
negotiated discounts
.
The CommitmentDiscountStatus column MUST be present in a
FOCUS dataset
when the provider supports commitment discounts. This column MUST be of type String, MUST be null when CommitmentDiscountId is null, and MUST NOT be null when CommitmentDiscountId is not null and Charge Category is “Usage”. CommitmentDiscountStatus MUST be one of the allowed values.
CommitmentDiscountStatus
Commitment Discount Status
Indicates whether the charge corresponds with the consumption of a commitment discount or the unused portion of the committed amount.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | Allowed Values |
Allowed values:
Value | Description |
---|---|
Used | Charges that utilized a specific amount of a commitment discount. |
Unused | Charges that represent the unused portion of the commitment discount. |
Commitment Discount Type is a provider-assigned name to identify the type of
commitment discount
applied to the
row
. The CommitmentDiscountType column is only applicable to commitment discounts and not
negotiated discounts
.
The CommitmentDiscountType column MUST be present in a
FOCUS dataset
when the provider supports commitment discounts. This column MUST be of type String, MUST be null when CommitmentDiscountId is null, and MUST NOT be null when CommitmentDiscountId is not null.
CommitmentDiscountType
Commitment Discount Type
A provider-assigned identifier for the type of commitment discount applied to the row.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
Commitment Discount Unit represents the provider-specified measurement unit indicating how a provider measures the Commitment Discount Quantity of a
commitment discount
. The CommitmentDiscountUnit column is only applicable to commitment discounts and not
negotiated discounts
.
The CommitmentDiscountUnit column adheres to the following requirements:
In cases where the CommitmentDiscountUnit is not null, the following applies:
CommitmentDiscountUnit
Commitment Discount Unit
The provider-specified measurement unit indicating how a provider measures the Commitment Discount Quantity of a commitment discount.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | Unit Format |
The Consumed Quantity represents the volume of a metered SKU associated with a
resource
or
service
used, based on the Consumed Unit. Consumed Quantity is often derived at a finer granularity or over a different time interval when compared to the Pricing Quantity (complementary to Pricing Unit) and focuses on resource and service consumption, not pricing and cost.
The ConsumedQuantity column adheres to the following requirements:
ConsumedQuantity
Consumed Quantity
The volume of a metered SKU associated with a resource or service used, based on the Consumed Unit.
Constraint | Value |
---|---|
Column type | Metric |
Feature level | Conditional |
Allows nulls | True |
Data type | Decimal |
Value format | Numeric Format |
Number range | Any valid decimal value |
The Consumed Unit represents a provider-specified measurement unit indicating how a provider measures usage of a metered SKU associated with a
resource
or
service
. Consumed Unit complements the Consumed Quantity metric. It is often listed at a finer granularity or over a different time interval when compared to Pricing Unit (complementary to Pricing Quantity), and focuses on resource and service consumption, not pricing and cost.
The ConsumedUnit column adheres to the following requirements:
ConsumedUnit
Consumed Unit
Provider-specified measurement unit indicating how a provider measures usage of a metered SKU associated with a resource or service.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | Unit Format recommended |
Contracted Cost represents the cost calculated by multiplying
contracted unit price
and the corresponding Pricing Quantity. Contracted Cost is denominated in the Billing Currency and is commonly used for calculating savings based on negotiation activities, by comparing it with List Cost. If
negotiated discounts
are not applicable, the Contracted Cost defaults to the List Cost.
The ContractedCost column MUST be present in a
FOCUS dataset
and MUST NOT be null. This column MUST be of type Decimal, MUST conform to Numeric Format requirements, and be denominated in the BillingCurrency. When ContractedUnitPrice is present and not null, multiplying the ContractedUnitPrice by PricingQuantity MUST produce the ContractedCost, except in cases of ChargeClass “Correction”, which may address PricingQuantity or any cost discrepancies independently.
In cases where the ContractedUnitPrice is present and null, the following applies:
ContractedCost
Contracted Cost
Cost calculated by multiplying contracted unit price and the corresponding Pricing Quantity.
Aggregation: When aggregating Contracted Cost for savings calculations, it’s important to exclude either Charge Category “Purchase” charges (one-time and recurring) that are paid to cover future eligible charges (e.g., Commitment Discount) or the covered Charge Category “Usage” charges themselves. This exclusion helps prevent double counting of these charges in the aggregation. Which set of charges to exclude depends on whether cost are aggregated on a billed basis (exclude covered charges) or accrual basis (exclude Purchases for future charges). For instance, charges categorized as Charge Category “Purchase” and their related Charge Category “Tax” charges for a Commitment Discount might be excluded from an accrual basis cost aggregation of Contracted Cost. This is because the “Usage” and “Tax” charge records provided during the term of the commitment discount already specify the Contracted Cost. Purchase charges that cover future eligible charges can be identified by filtering for Charge Category “Purchase” records with a Billed Cost greater than 0 and an Effective Cost equal to 0.
Constraint | Value |
---|---|
Column type | Metric |
Feature level | Mandatory |
Allows nulls | False |
Data type | Decimal |
Value format | Numeric Format |
Number range | Any valid decimal value |
The Contracted Unit Price represents the agreed-upon unit price for a single Pricing Unit of the associated SKU, inclusive of
negotiated discounts
, if present, while excluding negotiated
commitment discounts
or any other discounts. This price is denominated in the Billing Currency. The Contracted Unit Price is commonly used for calculating savings based on negotiation activities. If negotiated discounts are not applicable, the Contracted Unit Price defaults to the List Unit Price.
The ContractedUnitPrice column MUST be present in a
FOCUS dataset
when the provider supports negotiated pricing concepts. This column MUST be a Decimal within the range of non-negative decimal values, MUST conform to Numeric Format requirements, and be denominated in the BillingCurrency. It MUST NOT be null when ChargeClass is not “Correction” and ChargeCategory is “Usage” or “Purchase”, MUST be null when ChargeCategory is “Tax”, and MAY be null for all other combinations of ChargeClass and ChargeCategory. When ContractedUnitPrice is present and not null, multiplying ContractedUnitPrice by PricingQuantity MUST equal ContractedCost, except in cases of ChargeClass “Correction”, which may address PricingQuantity or any cost discrepancies independently.
ContractedUnitPrice
Contracted Unit Price
The agreed-upon unit price for a single Pricing Unit of the associated SKU, inclusive of negotiated discounts, if present, while excluding negotiated commitment discounts or any other discounts.
Aggregation: Column values should only be viewed in the context of their row and not aggregated to produce a total.
Constraint | Value |
---|---|
Column type | Metric |
Feature level | Conditional |
Allows nulls | True |
Data type | Decimal |
Value format | Numeric Format |
Number range | Any valid non-negative decimal value |
Effective Cost represents the
amortized
cost of the
charge
after applying all reduced rates, discounts, and the applicable portion of relevant, prepaid purchases (one-time or recurring) that covered this charge. The amortized portion included should be proportional to the Pricing Quantity and the time granularity of the data. Since amortization breaks down and spreads the cost of a prepaid purchase, to subsequent eligible charges, the Effective Cost of the original prepaid charge is set to 0. Effective Cost does not mix or “blend” costs across multiple charges of the same service. This cost is denominated in the Billing Currency. The Effective Cost is commonly utilized to track and analyze spending trends.
This column resolves two challenges that are faced by practitioners:
The EffectiveCost column MUST be present in a
FOCUS dataset
and MUST NOT be null. This column MUST be of type Decimal, MUST conform to Numeric Format requirements, and be denominated in the BillingCurrency. EffectiveCost MUST be 0 when ChargeCategory is “Purchase” and the purchase is intended to cover future eligible charges. The aggregated EffectiveCost for a billing period may not match the charge received on the invoice for the same billing period.
In cases where the ChargeCategory is not “Usage” or “Purchase”, the following applies:
EffectiveCost
Effective Cost
The amortized cost of the charge after applying all reduced rates, discounts, and the applicable portion of relevant, prepaid purchases (one-time or recurring) that covered this charge.
Providers should distribute the commitment purchase amount instead of including a row at the beginning of a period so practitioners do not need to manually distribute the fee themselves.
Eligible purchases should be amortized using a methodology determined by the provider that reflects the needs of their customer base and is proportional to the Pricing Quantity and the time granularity of the row. Should a practitioner desire to amortize relevant purchases using a different approach, the practitioner can do so using the Billed Cost for the line item representing the initial purchase.
Constraint | Value |
---|---|
Column type | Metric |
Feature level | Mandatory |
Allows nulls | False |
Data type | Decimal |
Value format | Numeric Format |
Number range | Any valid decimal value |
An Invoice Issuer is an entity responsible for invoicing for the
resources
or
services
consumed. It is commonly used for cost analysis and reporting scenarios.
The InvoiceIssuer column MUST be present in a
FOCUS dataset
. This column MUST be of type String and MUST NOT contain null values.
See Appendix: Origination of cost data section for examples of Provider, Publisher and Invoice Issuer values that can be used for various purchasing scenarios.
InvoiceIssuerName
Invoice Issuer
The name of the entity responsible for invoicing for the resources or services consumed.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | False |
Data type | String |
Value format | <not specified> |
List Cost represents the cost calculated by multiplying the
list unit price
and the corresponding Pricing Quantity. List Cost is denominated in the Billing Currency and is commonly used for calculating savings based on various rate optimization activities, by comparing it with Contracted Cost, Billed Cost and Effective Cost.
The ListCost column MUST be present in a
FOCUS dataset
and MUST NOT be null. This column MUST be of type Decimal, MUST conform to Numeric Format requirements, and be denominated in the BillingCurrency. When ListUnitPrice is present and not null, multiplying the ListUnitPrice by PricingQuantity MUST produce the ListCost, except in cases of ChargeClass “Correction”, which may address PricingQuantity or any cost discrepancies independently.
In cases where the ListUnitPrice is present and is null, the following applies:
ListCost
List Cost
Cost calculated by multiplying List Unit Price and the corresponding Pricing Quantity.
Aggregation: When aggregating List Cost for savings calculations, it’s important to exclude either Charge Category “Purchase” charges (one-time and recurring) that are paid to cover future eligible charges (e.g., Commitment Discount) or the covered Charge Category “Usage” charges themselves. This exclusion helps prevent double counting of these charges in the aggregation. Which set of charges to exclude depends on whether cost are aggregated on a billed basis (exclude covered charges) or accrual basis (exclude Purchases for future charges). For instance, charges categorized as Charge Category “Purchase” and their related Charge Category “Tax” charges for a Commitment Discount might be excluded from an accrual basis cost aggregation of List Cost. This is because the “Usage” and “Tax” charge records provided during the term of the commitment discount already specify the List Cost. Purchase charges that cover future eligible charges can be identified by filtering for Charge Category “Purchase” records with a Billed Cost greater than 0 and an Effective Cost equal to 0.
Constraint | Value |
---|---|
Column type | Metric |
Feature level | Mandatory |
Allows nulls | False |
Data type | Decimal |
Value format | Numeric Format |
Number range | Any valid decimal value |
The List Unit Price represents the suggested provider-published unit price for a single Pricing Unit of the associated SKU, exclusive of any discounts. This price is denominated in the Billing Currency. The List Unit Price is commonly used for calculating savings based on various rate optimization activities.
The ListUnitPrice column MUST be present in a
FOCUS dataset
when the provider publishes unit prices exclusive of discounts. This column MUST be a Decimal within the range of non-negative decimal values, MUST conform to Numeric Format requirements, and be denominated in the BillingCurrency. It MUST NOT be null when ChargeClass is not “Correction” and ChargeCategory is “Usage” or “Purchase”, MUST be null when ChargeCategory is “Tax”, and MAY be null for all other combinations of ChargeClass and ChargeCategory. When ListUnitPrice is present and is not null, multiplying ListUnitPrice by PricingQuantity MUST equal ListCost, except in cases of ChargeClass “Correction”, which may address PricingQuantity or any cost discrepancies independently.
ListUnitPrice
List Unit Price
The suggested provider-published unit price for a single Pricing Unit of the associated SKU, exclusive of any discounts.
Aggregation: Column values should only be viewed in the context of their row and not aggregated to produce a total.
Constraint | Value |
---|---|
Column type | Metric |
Feature level | Conditional |
Allows nulls | True |
Data type | Decimal |
Value format | Numeric Format |
Number range | Any valid non-negative decimal value |
Pricing Category describes the pricing model used for a charge at the time of use or purchase. It can be useful for distinguishing between charges incurred at the
list unit price
or a reduced price and exposing optimization opportunities, like increasing
commitment discount
coverage.
The PricingCategory column adheres to the following requirements:
PricingCategory
Pricing Category
Describes the pricing model used for a charge at the time of use or purchase.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | Allowed values |
Allowed values:
Value | Description |
---|---|
Standard | Charges priced at the agreed upon rate for the billing account, including negotiated discounts . This pricing includes any flat rate and volume/tiered pricing but does not include dynamic pricing or reduced pricing due to the application of a commitment discount. This does include the purchase of a commitment discount at agreed upon rates. |
Dynamic | Charges priced at a variable rate determined by the provider. This includes any product or service with a unit price the provider can change without notice, like interruptible or low priority resources. |
Committed | Charges with reduced pricing due to the application of the commitment discount specified by the Commitment Discount ID. |
Other | Charges priced in a way not covered by another pricing category. |
The Pricing Quantity represents the volume of a given SKU associated with a
resource
or
service
used or purchased, based on the Pricing Unit. Distinct from Consumed Quantity (complementary to Consumed Unit), it focuses on pricing and cost, not resource and service consumption.
The PricingQuantity column MUST be present in a
FOCUS dataset
. This column MUST be of type Decimal and MUST conform to Numeric Format requirements. The value MAY be negative in cases where ChargeClass is “Correction”. This column MUST NOT be null when ChargeClass is not “Correction” and ChargeCategory is “Usage” or “Purchase”, MUST be null when ChargeCategory is “Tax”, and MAY be null for all other combinations of ChargeClass and ChargeCategory. When unit prices are not null, multiplying PricingQuantity by a unit price MUST produce a result equal to the corresponding cost metric, except in cases of ChargeClass “Correction”, which may address PricingQuantity or any cost discrepancies independently.
PricingQuantity
Pricing Quantity
The volume of a given SKU associated with a resource or service used or purchased, based on the Pricing Unit.
Aggregation: When aggregating Pricing Quantity for commitment utilization calculations, it’s important to exclude commitment discount purchases (i.e. when ChargeCategory is “Purchase”) that are paid to cover future eligible charges (e.g., Commitment Discount). Otherwise, when accounting for all upfront or accrued purchases, it’s important to exclude commitment discount usage (i.e. when ChargeCategory is “Usage”). This exclusion helps prevent double counting of these quantities in the aggregation.
Constraint | Value |
---|---|
Column type | Metric |
Feature level | Mandatory |
Allows nulls | True |
Data type | Decimal |
Value format | Numeric Format |
Number Range | Any valid decimal value |
The Pricing Unit represents a provider-specified measurement unit for determining unit prices, indicating how the provider rates measured usage and purchase quantities after applying pricing rules like
block pricing
. Common examples include the number of hours for compute appliance runtime (e.g. Hours
), gigabyte-hours for a storage appliance (e.g., GB-Hours
), or an accumulated count of requests for a network appliance or API service (e.g., 1000 Requests
). Pricing Unit complements the Pricing Quantity metric. Distinct from the Consumed Unit, it focuses on pricing and cost, not
resource
and
service
consumption, often at a coarser granularity.
The PricingUnit column MUST be present in a
FOCUS dataset
. This column MUST be of type String. It MUST NOT be null when ChargeClass is not “Correction” and ChargeCategory is “Usage” or “Purchase”, MUST be null when ChargeCategory is “Tax”, and MAY be null for all other combinations of ChargeClass and ChargeCategory. Units of measure used in PricingUnit SHOULD adhere to the values and format requirements specified in the UnitFormat attribute.
The PricingUnit value MUST be semantically equal to the corresponding pricing measurement unit value provided in:
PricingUnit
Pricing Unit
Provider-specified measurement unit for determining unit prices, indicating how the provider rates measured usage and purchase quantities after applying pricing rules like block pricing.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | True |
Data type | String |
Value format | Unit Format |
A Provider is an entity that makes the
resources
or
services
available for purchase. It is commonly used for cost analysis and reporting scenarios.
The Provider column MUST be present in a
FOCUS dataset
. This column MUST be of type String and MUST NOT contain null values.
See Appendix: Origination of cost data section for examples of Provider, Publisher and Invoice Issuer values that can be used for various purchasing scenarios.
ProviderName
Provider
The name of the entity that made the resources or services available for purchase.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | False |
Data type | String |
Value format | <not specified> |
A Publisher is an entity that produces the
resources
or
services
that were purchased. It is commonly used for cost analysis and reporting scenarios.
The Publisher column MUST be present in a
FOCUS dataset
. This column MUST be of type String and MUST NOT contain null values.
See Appendix: Origination of cost data section for examples of Provider, Publisher and Invoice Issuer values that can be used for various purchasing scenarios.
PublisherName
Publisher
The name of the entity that produced the resources or services that were purchased.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | False |
Data type | String |
Value format | <not specified> |
A Region ID is a provider-assigned identifier for an isolated geographic area where a
resource
is provisioned or a
service
is provided. The region is commonly used for scenarios like analyzing cost and unit prices based on where resources are deployed.
The RegionId column MUST be present in a
FOCUS dataset
when the provider supports deploying resources or services within a region and MUST be of type String. RegionId MUST NOT be null when a resource or service is operated in or managed from a distinct region by the Provider and MAY contain null values when a resource or service is not restricted to an isolated geographic area.
RegionId
Region ID
Provider-assigned identifier for an isolated geographic area where a resource is provisioned or a service is provided.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
Region Name is a provider-assigned display name for an isolated geographic area where a
resource
is provisioned or a
service
is provided. Region Name is commonly used for scenarios like analyzing cost and unit prices based on where resources are deployed.
The RegionName column MUST be present in a
FOCUS dataset
when the provider supports deploying resources or services within a region and MUST be of type String. RegionName MUST NOT be null when a resource or service is operated in or managed from a distinct region by the Provider and MAY contain null values when a resource or service is not restricted to an isolated geographic area.
RegionName
Region Name
The name of an isolated geographic area where a resource is provisioned or a service is provided.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
A Resource ID is an identifier assigned to a
resource
by the provider. The Resource ID is commonly used for cost reporting, analysis, and allocation scenarios.
The ResourceId column MUST be present in a
FOCUS dataset
when the provider supports billing based on provisioned resources. This column MUST be of type String. The ResourceId value MAY be a nullable column as some cost data
rows
may not be associated with a resource. ResourceId MUST appear in the cost data if an identifier is assigned to a resource by the provider. ResourceId SHOULD be a fully-qualified identifier that ensures global uniqueness within the provider.
ResourceId
Resource ID
Identifier assigned to a resource by the provider.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
The Resource Name is a display name assigned to a
resource
. It is commonly used for cost analysis, reporting, and allocation scenarios.
The ResourceName column MUST be present in a
FOCUS dataset
when the provider supports billing based on provisioned resources. This column MUST be of type String. The ResourceName value MAY be a nullable column as some cost data
rows
may not be associated with a resource or because a display name cannot be assigned to a resource. ResourceName MUST NOT be null if a display name can be assigned to a resource. Resources not provisioned interactively or only have a system-generated ResourceId MUST NOT duplicate the same value as the ResourceName.
ResourceName
Resource Name
Display name assigned to a resource.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
Resource Type describes the kind of
resource
the charge applies to. A Resource Type is commonly used for scenarios like identifying cost changes in groups of similar resources and may include values like Virtual Machine, Data Warehouse, and Load Balancer.
The ResourceType column MUST be present in a
FOCUS dataset
when the provider supports billing based on provisioned resources and supports assigning a type for resources. This column MUST be of type String and MUST NOT be null when a corresponding ResourceId is not null. When a corresponding ResourceId value is null, the ResourceType column value MUST also be null.
ResourceType
Resource Type
The kind of resource the charge applies to.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
The Service Category is the highest-level classification of a
service
based on the core function of the service. Each service should have one and only one category that best aligns with its primary purpose. The Service Category is commonly used for scenarios like analyzing costs across providers and tracking the migration of workloads across fundamentally different architectures.
The ServiceCategory column MUST be present in a
FOCUS dataset
and MUST NOT be null. This column is of type String and MUST be one of the allowed values.
ServiceCategory
Service Category
Highest-level classification of a service based on the core function of the service.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | False |
Data type | String |
Value format | Allowed Values |
Allowed values:
Service Category | Description |
---|---|
AI and Machine Learning | Artificial Intelligence and Machine Learning related technologies. |
Analytics | Data processing, analytics, and visualization capabilities. |
Business Applications | Business and productivity applications and services. |
Compute | Virtual, containerized, serverless, or high-performance computing infrastructure and services. |
Databases | Database platforms and services that allow for storage and querying of data. |
Developer Tools | Software development and delivery tools and services. |
Multicloud | Support for interworking of multiple cloud and/or on-premises environments. |
Identity | Identity and access management services. |
Integration | Services that allow applications to interact with one another. |
Internet of Things | Development and management of IoT devices and networks. |
Management and Governance | Management, logging, and observability of a customer’s use of cloud. |
Media | Media and entertainment streaming and processing services. |
Migration | Moving applications and data to the cloud. |
Mobile | Services enabling cloud applications to interact via mobile technologies. |
Networking | Network connectivity and management. |
Security | Security monitoring and compliance services. |
Storage | Storage services for structured or unstructured data. |
Web | Services enabling cloud applications to interact via the Internet. |
Other | New or emerging services that do not align with an existing category. |
A
service
represents an offering that can be purchased from a provider (e.g., cloud virtual machine, SaaS database, professional services from a systems integrator). A service offering can include various types of usage or other charges. For example, a cloud database service may include compute, storage, and networking charges.
The Service Name is a display name for the offering that was purchased. The Service Name is commonly used for scenarios like analyzing aggregate cost trends over time and filtering data to investigate anomalies.
The ServiceName column MUST be present in a
FOCUS dataset
. This column MUST be of type String and MUST NOT contain null values.
ServiceName
Service Name
An offering that can be purchased from a provider (e.g., cloud virtual machine, SaaS database, professional services from a systems integrator).
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Mandatory |
Allows nulls | False |
Data type | String |
Value format | <not specified> |
The Service Subcategory is a secondary classification of the Service Category for a
service
based on its core function. The Service Subcategory (in conjunction with the Service Category) is commonly used for scenarios like analyzing spend and usage for specific workload types across providers and tracking the migration of workloads across fundamentally different architectures.
The ServiceSubcategory column adheres to the following requirements:
ServiceSubcategory
Service Subcategory
Secondary classification of the Service Category for a service based on its core function.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Recommended |
Allows nulls | False |
Data type | String |
Value format | Allowed Values |
Allowed values:
Service Category | Service Subcategory | Service Subcategory Description |
---|---|---|
AI and Machine Learning | AI Platforms | Unified solution that combines artificial intelligence and machine learning technologies. |
AI and Machine Learning | Bots | Automated performance of tasks such as customer service, data collection, and content moderation. |
AI and Machine Learning | Generative AI | Creation of content like text, images, and music by learning patterns from existing data. |
AI and Machine Learning | Machine Learning | Creation, training, and deployment of statistical algorithms that learn from and perform tasks based on data. |
AI and Machine Learning | Natural Language Processing | Generation of human language, handling tasks like translation, sentiment analysis, and text summarization. |
AI and Machine Learning | Other (AI and Machine Learning) | AI and Machine Learning services that do not fall into one of the defined subcategories. |
Analytics | Analytics Platforms | Unified solution that combines technologies across the entire analytics lifecycle. |
Analytics | Business Intelligence | Semantic models, dashboards, reports, and data visualizations to track performance and identify trends. |
Analytics | Data Processing | Integration and transformation tasks to prepare data for analysis. |
Analytics | Search | Discovery of information by indexing and retrieving data from various sources. |
Analytics | Streaming Analytics | Real-time data stream processes to detect patterns, trends, and anomalies as they occur. |
Analytics | Other (Analytics) | Analytics services that do not fall into one of the defined subcategories. |
Business Applications | Productivity and Collaboration | Tools that facilitate individuals managing tasks and working together. |
Business Applications | Other (Business Applications) | Business Applications services that do not fall into one of the defined subcategories. |
Compute | Containers | Management and orchestration of containerized compute platforms. |
Compute | End User Computing | Virtualized desktop infrastructure and device / endpoint management. |
Compute | Quantum Compute | Resources and simulators that leverage the principles of quantum mechanics. |
Compute | Serverless Compute | Enablement of compute capabilities without provisioning or managing servers. |
Compute | Virtual Machines | Computing environments ranging from hosts with abstracted operating systems to bare-metal servers. |
Compute | Other (Compute) | Compute services that do not fall into one of the defined subcategories. |
Databases | Caching | Low-latency and high-throughput access to frequently accessed data. |
Databases | Data Warehouses | Big data storage and querying capabilities. |
Databases | Ledger Databases | Immutable and transparent databases to record tamper-proof and cryptographically secure transactions. |
Databases | NoSQL Databases | Unstructured or semi-structured data storage and querying capabilities. |
Databases | Relational Databases | Structured data storage and querying capabilities. |
Databases | Time Series Databases | Time-stamped data storage and querying capabilities. |
Databases | Other (Databases) | Database services that do not fall into one of the defined subcategories. |
Developer Tools | Developer Platforms | Unified solution that combines technologies across multiple areas of the software development lifecycle. |
Developer Tools | Continuous Integration and Deployment | CI/CD tools and services that support building and deploying code for software and systems. |
Developer Tools | Development Environments | Tools and services that support authoring code for software and systems. |
Developer Tools | Source Code Management | Tools and services that support version control of code for software and systems. |
Developer Tools | Quality Assurance | Tools and services that support testing code for software and systems. |
Developer Tools | Other (Developer Tools) | Developer Tools services that do not fall into one of the defined subcategories. |
Identity | Identity and Access Management | Technologies that ensure users have appropriate access to resources. |
Identity | Other (Identity) | Identity services that do not fall into one of the defined subcategories. |
Integration | API Management | Creation, publishing, and management of application programming interfaces. |
Integration | Messaging | Asynchronous communication between distributed applications. |
Integration | Workflow Orchestration | Design, execution, and management of business processes and workflows. |
Integration | Other (Integration) | Integration services that do not fall into one of the defined subcategories. |
Internet of Things | IoT Analytics | Examination of data collected from IoT devices. |
Internet of Things | IoT Platforms | Unified solution that combines IoT data collection, processing, visualization, and device management. |
Internet of Things | Other (Internet of Things) | Internet of Things (IoT) services that do not fall into one of the defined subcategories. |
Management and Governance | Architecture | Planning, design, and construction of software systems. |
Management and Governance | Compliance | Adherance to regulatory standards and industry best practices. |
Management and Governance | Cost Management | Monitoring and controlling expenses of systems and services. |
Management and Governance | Data Governance | Management of the availability, usability, integrity, and security of data. |
Management and Governance | Disaster Recovery | Plans and procedures that ensure systems and services can recover from disruptions. |
Management and Governance | Endpoint Management | Tools that configure and secure access to devices. |
Management and Governance | Observability | Monitoring, logging, and tracing of data to track the performance and health of systems. |
Management and Governance | Support | Assistance and expertise supplied by providers. |
Management and Governance | Other (Management and Governance) | Management and governance services that do not fall into one of the defined subcategories. |
Media | Content Creation | Production of media content. |
Media | Gaming | Development and delivery of gaming services. |
Media | Media Streaming | Multimedia delivered and rendered in real-time on devices. |
Media | Mixed Reality | Technologies that blend real-world and computer-generated environments. |
Media | Other (Media) | Media services that do not fall into one of the defined subcategories. |
Migration | Data Migration | Movement of stored data from one location to another. |
Migration | Resource Migration | Movement of resources from one location to another. |
Migration | Other (Migration) | Migration services that do not fall into one of the defined subcategories. |
Mobile | Other (Mobile) | All Mobile services. |
Multicloud | Multicloud Integration | Environments that facilitate consumption of services from multiple cloud providers. |
Multicloud | Other (Multicloud) | Multicloud services that do not fall into one of the defined subcategories. |
Networking | Application Networking | Distribution of incoming network traffic across application-based workloads. |
Networking | Content Delivery | Distribution of digital content using a network of servers (CDNs). |
Networking | Network Connectivity | Facilitates communication between networks or network segments. |
Networking | Network Infrastructure | Configuration, monitoring, and troubleshooting of network devices. |
Networking | Network Routing | Services that select paths for traffic within or across networks. |
Networking | Network Security | Protection from unauthorized network access and cyber threats using firewalls and anti-malware tools. |
Networking | Other (Networking) | Networking services that do not fall into one of the defined subcategories. |
Security | Secret Management | Information used to authenticate users and systems, including secrets, certificates, tokens, and other keys. |
Security | Security Posture Management | Tools that help organizations configure, monitor, and improve system security. |
Security | Threat Detection and Response | Collect and analyze security data to identify and respond to potential security threats and vulnerabilities. |
Security | Other (Security) | Security services that do not fall into one of the defined subcategories. |
Storage | Backup Storage | Secondary storage to protect against data loss. |
Storage | Block Storage | High performance, low latency storage that provides random access. |
Storage | File Storage | Scalable, sharable storage for file-based data. |
Storage | Object Storage | Highly available, durable storage for unstructured data. |
Storage | Storage Platforms | Unified solution that supports multiple storage types. |
Storage | Other (Storage) | Storage services that do not fall into one of the defined subcategories. |
Web | Application Platforms | Integrated environments that run web applications. |
Web | Other (Web) | Web services that do not fall into one of the defined subcategories. |
Other | Other (Other) | Services that do not fall into one of the defined categories. |
A SKU ID is a unique identifier that defines a provider-supported construct for organizing properties that are common across one or more
SKU Prices
. SKU ID can be referenced on a catalog or
price list
published by a provider to look up detailed information about the SKU. The composition of the properties associated with the SKU ID may differ across providers. Some providers may not support the
SKU
construct and instead associate all such properties directly with the SKU Price. SKU ID is commonly used for analyzing cost based on SKU-related properties above the pricing constructs.
The SkuId column MUST be present in a
FOCUS dataset
when the provider publishes a SKU list. This column MUST be of type String. It MUST NOT be null when ChargeClass is not “Correction” and ChargeCategory is “Usage” or “Purchase”, MUST be null when ChargeCategory is “Tax”, and MAY be null for all other combinations of ChargeClass and ChargeCategory. SkuId MUST equal SkuPriceId when a provider does not support an overarching SKU ID construct.
SkuId
SKU ID
A unique identifier that defines a provider-supported construct for organizing properties that are common across one or more SKU Prices.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
The SKU Meter describes the functionality being metered or measured by a particular SKU in a charge.
Providers often have billing models in which multiple SKUs exist for a given service to describe and bill for different functionalities for that service. For example, an object storage service may have separate SKUs for functionalities such as object storage, API requests, data transfer, encryption, and object management. This field helps practitioners understand which functionalities are being metered by the different SKUs that appear in a
FOCUS dataset
.
The SkuMeter column adheres to the following requirements:
Compute Usage, Block Volume Usage, Data Transfer, API Requests
SkuMeter
SKU Meter
Describes the functionality being metered or measured by a particular SKU in a charge.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
The SKU Price Details column represents a list of relevant properties shared by all charges with the same SKU Price ID. These properties provide qualitative and quantitative details about the service represented by a SKU Price ID. This can enable practitioners to calculate metrics such as total units of a service when it is not directly billed in those units (e.g. cores) and thus enables FinOps capabilities such as unit economics. These properties can also help a practitioner understand the specifics of a SKU Price ID and differentiate it other SKU Price IDs.
The SkuPriceDetails column adheres to the following requirements:
SkuPriceDetails
SKU Price Details
A set of properties of a SKU Price ID which are meaningful and common to all instances of that SKU Price ID.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | JSON |
Value format | Key-Value Format |
A SKU Price ID is a unique identifier that defines the unit price used to calculate the charge. SKU Price ID can be referenced on a
price list
published by a provider to look up detailed information, including a corresponding list unit price. The composition of the properties associated with the SKU Price ID may differ across providers. SKU Price ID is commonly used for analyzing cost based on pricing properties such as Terms and Tiers.
The SkuPriceId column adheres to the following requirements:
SkuPriceId
SKU Price ID
A unique identifier that defines the unit price used to calculate the charge.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
A Sub Account ID is a provider-assigned identifier assigned to a
sub account
. Sub Account ID is commonly used for scenarios like grouping based on organizational constructs, access management needs, and cost allocation strategies.
The SubAccountId column MUST be present in a
FOCUS dataset
when the provider supports a sub account construct. This column MUST be of type String. If a charge does not apply to a sub account, the SubAccountId column MUST be null.
See Appendix: Grouping constructs for resources or services for details and examples of the different grouping constructs supported by FOCUS.
SubAccountId
Sub Account ID
An ID assigned to a grouping of
resources
or
services
, often used to manage access and/or cost.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
A Sub Account Name is a display name assigned to a
sub account
. Sub account Name is commonly used for scenarios like grouping based on organizational constructs, access management needs, and cost allocation strategies.
The SubAccountName column MUST be present in a
FOCUS dataset
when the provider supports a sub account construct. This column MUST be of type String. If a charge does not apply to a sub account, the SubAccountName column MUST be null.
See Appendix: Grouping constructs for resources or services for details and examples of the different grouping constructs supported by FOCUS.
SubAccountName
Sub Account Name
A name assigned to a grouping of
resources
or
services
, often used to manage access and/or cost.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | String |
Value format | <not specified> |
The Tags column represents the set of tags assigned to
tag sources
that also account for potential provider-defined or user-defined tag evaluations. Tags are commonly used for scenarios like adding business context to cost and usage data to identify and accurately allocate charges. Tags may also be referred to by providers using other terms such as labels.
A tag becomes
finalized
when a single value is selected from a set of possible tag values assigned to the tag key. When supported by a provider, this can occur when a tag value is set by provider-defined or user-defined rules.
The Tags column adheres to the following requirements:
Provider-defined Tags additionally adhere to the following requirements:
This example illustrates three different tagging scenarios. The first two illustrate when the provider supports both keys and values, while the third is for supporting keys only. The first tag is user-defined and doesn’t have a provider prefix. The second tag is provider-defined and has a prefix of acme/
, which is reserved by the provider. The third tag has a tag key of baz
and its value is assigned the boolean value true
since the tag doesn’t support a value.
Within a provider, tag keys may be associated with multiple values, and potentially defined at different levels within the provider, such as accounts, folders,
resource
and other resource grouping constructs. When finalizing, providers must reduce these multiple levels of definition to a single value where each key is associated with exactly one value. The method by which this is done and the semantics are up to each provider but must be documented within their respective documentation.
As an example, let’s assume 1
sub account
exists with 1 virtual machine with the following details, and tag inheritance favors Resources over Sub Accounts.
The table below represents a finalized dataset with these resources. It also shows the finalized state after all resource-oriented, tag inheritance rules are processed.
ResourceType | ResourceId | Tags |
---|---|---|
Sub Account | my-sub-account | { “team”: “ops”, “env”: “prod” } |
Virtual Machine | my-vm | { “team”: “web”, “env”: “prod” } |
Because the the Virtual Machine Resource did not have an env
tag, it inherited tag, env:prod
(italicized), from its parent sub account. Conversely, because the Virtual Machine Resource already has a team
tag ( team:web
), it did not inherit team:ops
from its parent sub account.
Tags
Tags
The set of tags assigned to tag sources that account for potential provider-defined or user-defined tag evaluations.
Constraint | Value |
---|---|
Column type | Dimension |
Feature level | Conditional |
Allows nulls | True |
Data type | JSON |
Value format | Key-Value Format |
1.0-preview
Attributes are requirements that apply across a
FOCUS dataset
instead of an individual column level. Requirements on data content can include naming conventions, data types, formatting standardizations, etc. Attributes may introduce high-level requirements for data granularity, recency, frequency, etc. Requirements defined in attributes are necessary for servicing FinOps capabilities accurately using a standard set of instructions regardless of the origin of the data.
Column IDs provided in cost data following a consistent naming and ordering convention reduce friction for FinOps practitioners who consume the data for analysis, reporting, and other use cases.
All columns defined in the FOCUS specification MUST follow the naming and ordering requirements listed below.
ColumnNamingAndOrdering
Column Naming and Ordering
Naming and ordering convention for columns appearing in a
FOCUS dataset
.
Id
or Name
suffix in the Column ID. Display Name for a Column MAY avoid the Name suffix if there are no other columns with the same name prefix. x_
prefix to identify them as external, custom columns and distinguish them from FOCUS columns to avoid conflicts in future releases. Id
or Name
suffix in the Column ID. Display Name for a Column MAY avoid the Name
suffix if it is considered superfluous. Category
suffix MUST be normalized. Columns that contain currency information in cost data following a consistent format reduce friction for FinOps practitioners who consume the data for analysis, reporting, and other use cases.
All columns capturing a currency value, defined in the FOCUS specification, MUST follow the requirements listed below. Custom currency-related columns SHOULD also follow the same formatting requirements.
CurrencyCodeFormat
Currency Code Format
Formatting for currency columns appearing in a
FOCUS dataset
.
Currency-related columns MUST be represented as a three-letter alphabetic code as dictated in the governing document ISO 4217:2015.
None
Columns that provide date and time information conforming to specified rules and formatting requirements ensure clarity, accuracy, and ease of interpretation for both humans and systems.
All columns capturing a date/time value, defined in the FOCUS specification, MUST follow the formatting requirements listed below. Custom date/time-related columns SHOULD also follow the same formatting requirements.
DateTimeFormat
Date/Time Format
Rules and formatting requirements for date/time-related columns appearing in a
FOCUS dataset
.
None
A discount is a pricing construct where providers offer a reduced price for
services
. Providers may have many types of discounts, including but not limited to commercially
negotiated discounts
,
commitment discounts
when you agree to a certain amount of usage or spend, and bundled discounts where you receive free or discounted usage of one product or service based on the usage of another. Discount Handling is commonly used in scenarios like verifying discounts were applied and calculating cost savings.
Some discount offers can be purchased from a provider to get reduced prices. The most common example is a commitment discount, where you “purchase” a commitment to use or spend a specific amount within a period. When a commitment isn’t fully utilized, the unused amount reduces the potential savings from the discount and can even result in paying higher costs than without the discount. Due to this risk, unused commitment amounts need to be clearly identifiable at a granular level. To facilitate this, unused commitments are recorded with a separate row for each charge period where the commitment was not fully utilized. To show the impact of purchased discounts on each discounted row, discount purchases need the purchase amount to be amortized over the
term
the discount is applied to (e.g., 1 year) with each
charge period
split and applied to each row that received the discount.
Amortization is a process used to break down and spread purchase costs over a period of time or term of use. When a purchase is applicable to resources, like commitment discounts, the amortized cost of a resource takes the initial payment and term into account and distributes it out based on the resource’s usage, attributing the prorated cost for each unit of billing. Amortization enables users of billing data to distribute purchase charges to the appropriate audience in support of cost allocation efforts. Discount Handling for purchased commitments is commonly used for scenarios like calculating utilization and implementing chargeback for the purchase amount.
While providers may use different terms to describe discounts, FOCUS identifies a discount as being a reduced price applied directly to a row. Any price or cost reductions that are awarded after the fact are identified as a “Credit” Charge Category. One example might be when a provider offers a reduced rate after passing a certain threshold of usage or spend.
All rows defined in FOCUS MUST follow the discount handling requirements listed below.
DiscountHandling
Discount Handling
Indicates how to include and apply discounts to usage charges or rows in a FOCUS dataset.
None
Columns that provide Key-Value information are often used in place of separate columns for enumerating data which would be inherently sparse and/or without predetermined keys. This consolidates related information and provides more consistency in the schema. Key-value pairs are also referred to as name-value pairs, attribute-value pairs, or field-value pairs.
All key-value related columns defined in the FOCUS specification MUST follow the key-value formatting requirements listed below.
KeyValueFormat
Key-Value Format
Rules and formatting requirements for columns appearing in a
FOCUS dataset
that convey data as key-value pairs.
true
, false
, or null
. None
Cost data
rows
that don’t have a value that can be presented for a column must be handled in a consistent way to reduce friction for FinOps practitioners who consume the data for analysis, reporting, and other use cases.
All columns defined in the FOCUS specification MUST follow the null handling requirements listed below. Custom columns SHOULD also follow the same formatting requirements.
NullHandling
Null Handling
Indicates how to handle columns that don’t have a value.
None
Columns that provide numeric values conforming to specified rules and formatting requirements ensure clarity, accuracy, and ease of interpretation for humans and systems. The FOCUS specification does not require a specific level of precision for numeric values. The level of precision required for a given column is determined by the provider and should be part of a data definition published by the provider.
All columns capturing a numeric value, defined in the FOCUS specification, MUST follow the formatting requirements listed below. Custom numeric value capturing columns SHOULD adopt the same format requirements over time.
NumericFormat
Numeric Format
Rules and formatting requirements for numeric columns appearing in a
FOCUS dataset
.
Allowed values:
Data Type | Type Description |
---|---|
Integer | Specifies a numeric value represented by a whole number or by zero. Integer number formats correspond to standard data types defined by ISO/IEC 9899:2018 |
Decimal | Specifies a numeric value represented by a decimal number. Decimal formats correspond to ISO/IEC/IEEE 60559:2011 and IEEE 754-2008 definitions. |
Allowed values:
Data Type | Precision | Definition | Range / Significant Digits |
---|---|---|---|
Integer | Short | 16-bit signed short int ISO/IEC 9899:2018 | -32,767 to +32,767 |
Integer | Long | 32-bit signed long int ISO/IEC 9899:2018 | -2,147,483,647 to +2,147,483,647 |
Integer | Extended | 64-bit signed two’s complement integer or higher | -(2^63 – 1) to (2^63 – 1) |
Decimal | Single | 32-bit binary format IEEE 754-2008 floating-point (decimal32) | 9 |
Decimal | Double | 64-bit binary format IEEE 754-2008 floating-point (decimal64) | 16 |
Decimal | Extended | 128-bit binary format IEEE 754-2008 floating-point (decimal128) or higher | 36+ |
This format requires that single numeric values be represented using an integer or decimal format without additional characters or qualifiers. The following lists provide examples of values that meet the requirements and those that do not.
Values Meeting Numeric Requirements:
Values NOT Meeting Numeric Requirements
None
Columns that capture string values conforming to specified requirements foster data integrity, interoperability, and consistency, improve data analysis and reporting, and support reliable data-driven decision-making.
All columns capturing a string value, defined in the FOCUS specification, MUST follow the requirements listed below. Custom string value capturing columns SHOULD adopt the same requirements over time.
StringHandling
String Handling
Requirements for string-capturing columns appearing in a
FOCUS dataset
.
Billing data frequently captures data measured in units related to data size, count, time, and other
dimensions
. The Unit Format attribute provides a standard for expressing units of measure in columns appearing in a
FOCUS dataset
.
All columns defined in FOCUS specifying Unit Format as a value format MUST follow the requirements listed below.
UnitFormat
Unit Format
Indicates standards for expressing measurement units in columns appearing in a FOCUS dataset.
<plural-units>
– “GB”, “Seconds”
<singular-unit>-<plural-time-units>
– “GB-Hours”, “MB-Days”
<plural-units>/<singular-time-unit>
– “GB/Hour”, “PB/Day”
<quantity> <plural-units>
– “1000 Tokens”, “1000 Characters”
<plural-units>/<interval> <plural-time-units>
– “Units/3 Months”
Data size unit names MUST be abbreviated using one of the abbreviations in the following table. For example, a unit name of “TB” is a valid unit name, and a unit name of “terabyte” is an invalid unit name. Data size abbreviations can be considered both the singular and plural form of the unit. For example, “GB” is both the singular and plural form of the unit “gigabyte”, and “GBs” would be an invalid unit name. Values that exceed 10^18 MUST use the abbreviation for exabit, exabyte, exbibit, and exbibyte, and values smaller than a byte MUST use the abbreviation for bit or byte. For example, the abbreviation “YB” for “yottabyte” is not a valid data size unit name as it represents a value larger than what is listed in the following table.
The following table lists the valid abbreviations for data size units from a single bit or byte to 10^18 bits or bytes.
Data size in bits | Data size in bytes |
---|---|
b (bit) = 10^1 | B (byte = 10^1) |
Kb (kilobit = 10^3) | KB (kilobyte = 10^3) |
Mb (megabit = 10^6) | MB (megabyte = 10^6) |
Gb (gigabit = 10^9) | GB (gigabyte = 10^9) |
Tb (terabit = 10^12) | TB (terabyte = 10^12) |
Pb (petabit = 10^15) | PB (petabyte = 10^15) |
Eb (exabit = 10^18) | EB (exabyte = 10^18) |
Kib (kibibit = 2^10) | KiB (kibibyte = 2^10) |
Mib (mebibit = 2^20) | MiB (mebibyte = 2^20) |
Gib (gibibit = 2^30) | GiB (gibibyte = 2^30) |
Tib (tebibit = 2^40) | TiB (tebibyte = 2^40) |
Pib (pebibit = 2^50) | PiB (pebibyte = 2^50) |
Eib (exbibit = 2^60) | EiB (exbibyte = 2^60) |
A count-based unit is a noun that represents a discrete number of items, events, or actions. For example, a count-based unit can be used to represent the number of requests, instances, tokens, or connections.
If the following list of recommended values does not cover a count-based unit, a provider MAY introduce a new noun representing a count-based unit. All nouns appearing in units that are not listed in the recommended values table will be considered count-based units. A new count-based unit value MUST be capitalized.
Count |
---|
Count |
Unit |
Request |
Token |
Connection |
Certificate |
Domain |
Core |
A time-based unit is a noun that represents a time interval. Time-based units can be used to measure consumption over a time interval or in combination with another unit to capture a rate of consumption. Time-based units MUST match one of the values listed in the following table.
Time |
---|
Year |
Month |
Day |
Hour |
Minute |
Second |
If the unit value is a composite value made from combinations of one or more units, each component MUST also align with the set of recommended values.
Instead of “per” or “-” to denote a Composite Unit, slash (“/”) and space(” “) MUST be used as a common convention. Count-based units like requests, instances, and tokens SHOULD be expressed using a value listed in the count dimension. For example, if a usage unit is measured as a rate of requests or instances over a period of time, the unit SHOULD be listed as “Requests/Day” to signify the number of requests per day.
None
1.0-preview
The FOCUS specification defines a metadata structure to be supplied by data providers to facilitate practitioners’ use of FOCUS data. This metadata includes general information about the data generator and the schema of the
FOCUS dataset
.
FOCUS Metadata SHOULD be provided in a format that is accessible programmatically, such as a file, website, API, or table. Providers SHOULD provide documentation on their implementation of the FOCUS metadata.
The FOCUS metadata about the generator of the FOCUS data.
The FOCUS Data Generator metadata MUST be provided. This metadata MUST be of type Object and MUST NOT contain null values.
For an example of the FOCUS Data Generator metadata please refer to: Data Generator Example
Human-readable name of the entity that is generating the data.
The DataGenerator MUST be provided in the metadata. DataGenerator MUST be of type String and MUST NOT be null. The DataGenerator SHOULD be easily associated with the provider who generated the
FOCUS dataset
.
DataGenerator
Data Generator
Constraint | Value |
---|---|
Feature level | Mandatory |
Allows nulls | False |
Data type | String |
Value format | <not specified> |
The schema metadata object and its contents provides information about the structure of the data provided.
FOCUS data artifacts, whether they are data files, data streams, or data tables, MUST provide a clear reference to the schema of the data. This reference MUST be retrievable without inspection of the contents of the FOCUS data within the data artifact. For some delivery mechanisms such as database tables, the provider may rely on the schema functionality of the providing system.
It is recommended that the schema reference be provided as an external reference rather than included in full as metadata accompanying the data artifact. This allows for easier understanding of when changes to the schema of the
FOCUS datasets
occurs.
Should the provider change the structure of the supplied FOCUS data artifact, a new schema metadata object MUST be supplied. These scenarios include, but are not limited to:
Should there be an error where the schema metadata object does not match the schema of the FOCUS data artifact, the provider MUST update the schema metadata object to match the schema of the FOCUS data artifact. This is to ensure that the schema metadata object is always accurate.
For an example of the FOCUS schema metadata please refer to: Schema Metadata Example
The Schema ID provides the reference item to associate which Schema was used for the generation of a FOCUS Dataset.
The SchemaId MUST be present in the metadata. The SchemaId MUST be of String. It is RECOMMENDED for SchemaId to be a Globally Unique Identifier (GUID).
SchemaId
Schema ID
Constraint | Value |
---|---|
Feature level | Mandatory |
Allows nulls | False |
Data type | STRING |
Value format | Recommend GUID String |
Date the schema was created.
The CreationDate MUST be present in the metadata. This MUST be of type Date/Time and MUST NOT contain null values. CreationDate MUST conform to DateTimeFormat.
CreationDate
Creation Date
Constraint | Value |
---|---|
Feature level | Mandatory |
Allows nulls | False |
Data type | Date/Time |
Value format | Date/Time Format |
The version of FOCUS utilized for building the dataset.
The FocusVersion MUST be provided in the metadata. FocusVersion MUST be of type String and MUST NOT contain null values. FocusVersion MUST match one of the published versions of the FOCUS specification. FocusVersion MUST match the version of the FOCUS specification that the
FOCUS dataset
conforms to.
FocusVersion
FOCUS Version
Constraint | Value |
---|---|
Feature level | Mandatory |
Allows nulls | False |
Data type | STRING |
Value format | Must align with a published FocusVersion |
The ProviderVersion MAY be supplied to declare the version of logic by which the
FOCUS dataset
was generated and is separate from FOCUS Version. ProviderVersion allows for the provider to specify changes that may not result in a structural change in the data. It is suggested that the provider version use a versioning approach such as SemVer version.
ProviderVersion MUST be of type String and MUST NOT contain null values. If FocusVersion is changed a new ProviderVersion MUST be also changed. The provider MUST document what changes are present in the ProviderVersion.
ProviderVersion
Provider Version
Constraint | Value |
---|---|
Feature level | Optional |
Allows nulls | False |
Data type | STRING |
Value format | <not specified> |
The FOCUS metadata schema column definition provides a list of the columns present in the
FOCUS dataset
along with metadata about the columns.
This metadata MUST be present in the FOCUS metadata schema. This metadata MUST be of type Object and MUST NOT contain null values.
The name of the column provided in the
FOCUS dataset
.
The ColumnName MUST be provided in the FOCUS Metadata schema. ColumnName MUST be of type String and MUST NOT contain null values.
ColumnName
Column Name
Constraint | Value |
---|---|
Feature level | Mandatory |
Allows nulls | False |
Data type | String |
Value format | <not specified> |
The data type of the column provided in the
FOCUS dataset
.
The DataType MUST be provided in the FOCUS Metadata schema. DataType MUST be of type String and MUST NOT contain null values.
DataType
Data Type
Constraint | Value |
---|---|
Feature level | Mandatory |
Allows nulls | False |
Data type | String |
Value format | <not specified> |
Numeric Precision is the maximum number of digits for the values in the column.
NumericPrecision SHOULD be provided in the FOCUS Metadata schema for Numeric Format columns. NumericPrecision MUST be of type Integer and MUST NOT contain null values.
NumericPrecision
Numeric Precision
Constraint | Value |
---|---|
Feature level | Conditional |
Allows nulls | False |
Data type | Integer |
Value format | Numeric Format |
The number scale of the data provides the maximum number of digits after the decimal point in decimal numbers.
NumberScale SHOULD be provided in the FOCUS Metadata schema for Decimal columns. NumberScale MUST be of type Integer and MUST NOT contain null values.
NumberScale
Number Scale
Constraint | Value |
---|---|
Feature level | Conditional |
Allows nulls | False |
Data type | Integer |
Value format | Numeric Format |
The Provider Tag Prefixes defines the list of prefixes used in the tag name of provider-defined tags. This metadata is useful for the consumer to identify which tags are provider-defined vs user-defined.
The ProviderTagPrefixes MUST be provided when ColumnName is equal to Tags. The ProviderTagPrefix MUST be of type Array of Strings. The ProviderTagPrefixes SHOULD be easily associated with the provider who generated the
FOCUS dataset
.
ProviderTagPrefixes
Provider Tag Prefixes
Constraint | Value |
---|---|
Feature level | Conditional |
Allows nulls | False |
Data type | Array |
Value format | STRING datatype values in the array |
The string encoding scheme of the column provided in the
FOCUS dataset
.
StringEncoding SHOULD be provided in the FOCUS Metadata schema when it is required to know this information in order to successfully read the data. StringEncoding MUST be of type String and MUST NOT contain null values.
StringEncoding
StringEncoding
Constraint | Value |
---|---|
Feature level | Conditional |
Allows nulls | False |
Data type | String |
Value format | <not specified> |
The string max length of the data that can be stored in the column.
StringMaxLength SHOULD be provided in the FOCUS Metadata schema for String columns. StringMaxLength MUST be of type Integer and MUST NOT contain null values.
StringMaxLength
String Max Length
Constraint | Value |
---|---|
Feature level | Conditional |
Allows nulls | False |
Data type | Integer |
Value format | Numeric Format |
1.0
This specification is based on a set of common FinOps use cases, which are publicly available at [ https://focus.finops.org/use-cases/](https://focus.finops.org/use-cases/). Developed by FinOps practitioners, these use cases are organized by persona and capability, making it easy to find relevant scenarios. Each use case includes sample SQL queries to help you get started with implementation.
A charge representing a modification to billing data to account for certain events or circumstances not previously captured, or captured incorrectly. Examples include billing errors, service disruptions, or pricing changes.
The distribution of upfront costs over time to accurately reflect the consumption or benefit derived from the associated resources or services. Amortization is valuable when the commitment period (time duration of the cost) extends beyond the granularity of the source report.
A collection of geographically separated locations containing a data center or cluster of data centers. Each availability zone (AZ) should have its own power, cooling, and networking, to provide redundancy and fault tolerance.
A charge that serves as the basis for invoicing. It includes the total amount of fees and discounts, signifying a monetary obligation. Valuable when reconciling cash outlay with incurred expenses is required, such as cost allocation, budgeting, and invoice reconciliation.
A container for resources and/or services that are billed together in an invoice. A billing account may have sub accounts, all of whose costs are consolidated and invoiced to the billing account.
An identifier that represents the currency that a charge for resources and/or services was billed in.
The time window that an organization receives an invoice for, inclusive of the start date and exclusive of the end date. It is independent of the time of usage and consumption of resources and services.
A pricing approach where the cost of a particular resource or service is determined based on predefined quantities or tiers of usage. In these scenarios, the Pricing Unit and the corresponding Pricing Quantity can be different from the Consumed Unit and Consumed Quantity.
A capacity reservation is an agreement that secures a dedicated amount of resources or services for a specified period. This ensures the reserved capacity is always available and accessible, even if it’s not fully utilized. Customers are typically charged for the reserved capacity, regardless of actual consumption.
A row in a FOCUS-compatible cost and usage dataset.
The time window for which a charge is effective, inclusive of the start date and exclusive of the end date. The charge period for continuous usage should match the time granularity of the dataset (e.g., 1 hour for hourly, 1 day for daily). The charge period for a non-usage charge with time boundaries should match the duration of eligibility.
A company or organization that provides remote access to computing resources, infrastructure, or applications for a fee.
A customer’s agreement to consume a specific quantity of a service or resource over a defined period, usually also creating a financial commitment throughout the entirety of the commitment period. Some commitments also hold Providers to certain assurance levels of resource availability.
A billing discount model that offers reduced rates on preselected SKUs in exchange for an obligated usage or spend amount over a predefined term. Commitment discount purchases, made upfront and/or with recurring monthly payments are amortized evenly across predefined charge periods (i.e. hourly), and unused amounts cannot be carried over to subsequent charge periods. Commitment discounts are publicly available to customers without special contract arrangements.
Commitment Discount Flexibility
A feature of
commitment discounts
that may further transform the predetermined amount of usage purchased or consumed based on additional, provider-specific requirements.
The agreed-upon unit price for a single Pricing Unit of the associated SKU, inclusive of negotiated discounts, if present, and exclusive of any other discounts. This price is denominated in the Billing Currency.
A specification-defined categorical attribute that provides context or categorization to billing data.
The amortized cost of the charge after applying all reduced rates, discounts, and the applicable portion of relevant, prepaid purchases (one-time or recurring) that covered this charge.
A Date/Time Format value that is not contained within the ending bound of a time period.
A tag with one tag value chosen from a set of possible tag values after being processed by a set of provider-defined or user-defined rules.
FinOps Cost and Usage Specification (FOCUS)
An open-source specification that defines requirements for billing data.
A structured collection of cost and usage data that meets or exceeds the Basic compliance criteria of FOCUS.
A Date/Time Format value that is contained within the beginning bound of a time period.
A category of compute resources that can be paused or terminated by the CSP within certain criteria, often advertised at reduced unit pricing when compared to the equivalent non-interruptible resource.
The suggested provider-published unit price for a single Pricing Unit of the associated SKU, exclusive of any discounts. This price is denominated in the Billing Currency.
Managed Service Provider (MSP)
A company or organization that provides outsourced management and support of a range of IT services, such as network infrastructure, cybersecurity, cloud computing, and more.
A FOCUS-defined column that provides numeric values, allowing for aggregation operations such as arithmetic operations (sum, multiplication, averaging etc.) and statistical operations.
A contractual agreement where a customer commits to specific spend or usage goals over a
term
in exchange for discounted rates across varying SKUs. Unlike
commitment discounts
, negotiated discounts are typically more customized to customer’s accounts, can be utilized at varying frequencies, and may overlap with commitment discounts.
A term that describes a service that is available and provided immediately or as needed, without requiring a pre-scheduled appointment or prior arrangement. In cloud computing, virtual machines can be created and terminated as needed, i.e. on demand.
Pascal Case (PascalCase, also known as UpperCamelCase) is a format for identifiers which contain one or more words meaning the words are concatenated together with no delimiter and the first letter of each word is capitalized.
A long and often painful conversation had by the FOCUS contributors. Sometimes the name of a thing that we could not yet name. No starchy root vegetables were harmed during the production of this specification. We thank potato for its contribution in the creation of this specification.
An individual who performs FinOps within an organization to maximize the business value of using cloud and cloud-like services.
A comprehensive list of prices offered by a provider.
An entity that made internal or 3rd party resources and/or services available for purchase.
A unique component that incurs a charge.
A row in a FOCUS-compatible cost and usage dataset.
An offering that can be purchased from a provider, and can include many types of usage or other charges; eg., a cloud database service may include compute, storage, and networking charges.
A construct composed of the common properties of a product offering associated with one or many SKU Prices.
The unit price used to calculate a charge that is associated with one SKU. SKU Prices are usually referenced from the provider’s price list and are unique to various providers.
A sub account is an optional provider-supported construct for organizing resources and/or services connected to a billing account. Sub accounts must be associated with a billing account as they do not receive invoices.
A metadata label assigned to a resource to provide information about it or to categorize it for organizational and management purposes.
A Resource or Provider-defined construct for grouping resources and/or other Provider-defined construct that a Tag can be assigned to.
A duration of a contractual agreement like with a
commitment discount
or
negotiated discount
.
This section is non-normative.
A commitment
discount is a billing discount model that offers reduced rates
on preselected SKUs in exchange for
an obligated usage or spend amount over a predefined term. Commitment discounts
typically consist of purchase and usage records within cost and usage
datasets.
Usage-based commitment discounts obligate a customer to a
predetermined amount of usage over a preselected term. In some
cases, usage-based commitment discounts also feature commitment discount
flexibility which may expand the types of resources that a commitment
discount can cover. It is important to note when mixing
commitment discounts with and without commitment discount
flexibility, the CommitmentDiscountUnit should reflect
this difference.
Spend-based commitment discounts obligate a customer to a
predetermined amount of spend over a preselected term. In the
usage examples below, each row
measures the monetary amount of the hourly commit consumed by the
commitment discount, so the CommitmentDiscountUnit chosen is
“USD”, or the billing
currency.
While customers are bound to the term of a commitment
discounts, providers offer some or all of the following payment
options before and/or during the term:
For example, if a customer buys a 1-year, spend-based commitment
discount with a $1.00 hourly commit and pays with the partial
option, the commitment discount’s payment consists of a
one-time purchase in the beginning of the term and
monthly recurring purchases with the following totals:
24 hours * 365 days * $1.00 * 0.5
)24 hours * 365 days * $1.00 / 12 months
)Commitment discounts follow a “use-it-or-lose-it” model where the amortization of a
commitment discount’s purchase applies evenly to eligible
resources over each charge period of the
term.
For example, if a customer buys a spend-based commitment
discount with a $1.00 hourly commit in January (31 days), only
$1.00 is eligible for consumption for each hourly charge
period. If a customer has eligible resources running
during this charge period, an amount of up to $1.00 will be
allocated to these resources. Conversely, if a customer does
have eligible resources running that fully take advantage of
this $1.00 during this charge period, then some or all of this
amount will go to waste.
Within the FOCUS specification, the following examples demonstrate
how a commitment discount appears across various payment and
usage scenarios.
All commitment discount purchases appear with a positive BilledCost, PricingCategory as “Standard”, and with the
commitment discount’s id populating both the ResourceId and CommitmentDiscountId value. One-time
purchases appear as a single record with ChargeCategory as “Purchase”, ChargeFrequency as “One-Time”, and the total
quantity and units for commitment discount’s term
reflected as CommitmentDiscountQuantity and
CommitmentDiscountUnit, respectively.
Recurring purchases are allocated across all corresponding charge
periods of the term when ChargeCategory is “Purchase”,
ChargeFrequency is “Recurring”, and CommitmentDiscountQuantity and
CommitmentDiscountUnit are reflected only for that charge
period.
Using the same commitment discount example as above with a
one-year, spend-based commitment discount with a $1.00 hourly
commit purchased on Jan 1, 2023, various purchase options are
available:
The entire commitment discount is billed once
during the first charge period of the term for $8,670
(derived as 24 hours * 365 days * $1.00
).
[
{
"BillingPeriodStartDate": "2023-01-01T00:00:00Z",
"BillingPeriodEndDate": "2023-02-01T00:00:00Z",
"ChargePeriodStartDate": "2023-01-01T00:00:00Z",
"ChargePeriodEndDate": "2024-01-01T00:00:00Z",
"ChargeCategory": "Purchase",
"ChargeFrequency": "One-Time",
"PricingCategory": "Standard",
"ResourceId": "<commitment-discount-id>",
"BilledCost": 8760.00,
"EffectiveCost": 0.00,
"CommitmentDiscountId": "<commitment-discount-id>",
"CommitmentDiscountQuantity": 8760.00,
"CommitmentDiscountUnit": "USD"
}
]
The commitment discount is billed across all 8,760
(24 hours * 365 days
) charge periods of the
term with $1.00 allocated to each charge period over
the term.
[
{
"BillingPeriodStartDate": "2023-01-01T00:00:00Z",
"BillingPeriodEndDate": "2023-02-01T00:00:00Z",
"ChargePeriodStartDate": "2023-01-01T00:00:00Z",
"ChargePeriodEndDate": "2023-01-01T01:00:00Z",
"ChargeCategory": "Purchase",
"ChargeFrequency": "Recurring",
"PricingCategory": "Standard",
"ResourceId": "<commitment-discount-id>",
"BilledCost": 1.00,
"EffectiveCost": 0.00,
"CommitmentDiscountId": "<commitment-discount-id>",
"CommitmentDiscountQuantity": 1.00,
"CommitmentDiscountUnit": "USD"
},
/* ... 8,759 more recurring purchase records for the *term* ... */
]
With a 50/50 split, half of the commitment is billed once
during the first charge period of the term for $4,380
(derived as 24 hours * 182.5 days * $1.00
), and
the other half is billed across each charge period over the
term, derived as ($1.00 * 8,760 hours * 0.5
).
Amortized costs incur half of the amount (i.e. $0.50) from the one-time
purchase and the other half from the recurring purchase.
[
{
"BillingPeriodStartDate": "2023-01-01T00:00:00Z",
"BillingPeriodEndDate": "2023-02-01T00:00:00Z",
"ChargePeriodStartDate": "2023-01-01T00:00:00Z",
"ChargePeriodEndDate": "2024-01-01T00:00:00Z",
"ChargeCategory": "Purchase",
"ChargeFrequency": "One-Time",
"PricingCategory": "Standard",
"ResourceId": "<commitment-discount-id>",
"BilledCost": 4380.00,
"EffectiveCost": 0.00,
"CommitmentDiscountId": "<commitment-discount-id>",
"CommitmentDiscountQuantity": 4380.00,
"CommitmentDiscountUnit": "USD"
},
{
"BillingPeriodStartDate": "2023-01-01T00:00:00Z",
"BillingPeriodEndDate": "2023-02-01T00:00:00Z",
"ChargePeriodStartDate": "2023-01-01T00:00:00Z",
"ChargePeriodEndDate": "2023-01-01T01:00:00Z",
"ChargeCategory": "Purchase",
"ChargeFrequency": "Recurring",
"PricingCategory": "Standard",
"ResourceId": "<commitment-discount-id>",
"BilledCost": 0.50,
"EffectiveCost": 0.00,
"CommitmentDiscountId": "<commitment-discount-id>",
"CommitmentDiscountQuantity": 0.50,
"CommitmentDiscountUnit": "USD"
},
/* ... 8,759 more recurring purchase records for the *term* ... */
]
Amortization of commitment discounts occur
similarly regardless of how commitment discount purchases are
made. The same usage-based or spend-based amount is applied evenly
across all charge periods and potentially allocated to eligible
resources. Continuing with the same commitment
discount example, a one-year, spend-based commitment
discount with a $1.00 hourly commit and 1 resource (for
simplicity) yields 4 types of scenarios that can occur during a
charge period:
In this scenario, one eligible resource runs for the full
hour and consumes $1.00, so one row allocated to the
resource is produced.
[
{
"BillingPeriodStartDate": "2023-01-01T00:00:00Z",
"BillingPeriodEndDate": "2023-02-01T00:00:00Z",
"ChargePeriodStartDate": "2023-01-01T00:00:00Z",
"ChargePeriodEndDate": "2023-01-01T01:00:00Z",
"ChargeCategory": "Usage",
"ChargeFrequency": "Usage-Based",
"PricingCategory": "Committed",
"ResourceId": "<resource-id>",
"ConsumedQuantity": 1,
"ConsumedUnit": "Hour",
"BilledCost": 0.00,
"EffectiveCost": 1.00,
"CommitmentDiscountId": "<commitment-discount-id>",
"CommitmentDiscountQuantity": 1.00,
"CommitmentDiscountStatus": "Used",
"CommitmentDiscountUnit": "USD"
}
]
In this situation, the full eligible, $1.00 amount remained
unutilized and results in 1 unused row. In this scenario, it is
important to note that while CommitmentDiscountQuantity is not because
$1 was still drawn down by the commitment discount even though,
no resource was allocated, so ConsumedQuantity and ConsumedUnit are null.
[
{
"BillingPeriodStartDate": "2023-01-01T00:00:00Z",
"BillingPeriodEndDate": "2023-02-01T00:00:00Z",
"ChargePeriodStartDate": "2023-01-01T00:00:00Z",
"ChargePeriodEndDate": "2023-01-01T01:00:00Z",
"ChargeCategory": "Usage",
"ChargeFrequency": "Usage-Based",
"PricingCategory": "Committed",
"ResourceId": "<commitment-discount-id>",
"ConsumedQuantity": null,
"ConsumedUnit": null,
"BilledCost": 0.00,
"EffectiveCost": 1.00,
"CommitmentDiscountId": "<commitment-discount-id>",
"CommitmentDiscountQuantity": 1.00,
"CommitmentDiscountStatus": "Unused",
"CommitmentDiscountUnit": "USD"
}
]
In this scenario, one eligible resource runs for the full
hour and consumes $0.75 of the $1.00 allocation. One row shows
$0.75 to a resource, and the other row shows that
$0.25 was unused.
[
{
"BillingPeriodStartDate": "2023-01-01T00:00:00Z",
"BillingPeriodEndDate": "2023-02-01T00:00:00Z",
"ChargePeriodStartDate": "2023-01-01T00:00:00Z",
"ChargePeriodEndDate": "2023-01-01T01:00:00Z",
"ChargeCategory": "Usage",
"ChargeFrequency": "Usage-Based",
"PricingCategory": "Committed",
"ResourceId": "<resource-id>",
"ConsumedQuantity": 1,
"ConsumedUnit": "Hour",
"BilledCost": 0.00,
"EffectiveCost": 0.75,
"CommitmentDiscountId": "<commitment-discount-id>",
"CommitmentDiscountQuantity": 0.75,
"CommitmentDiscountStatus": "Used",
"CommitmentDiscountUnit": "USD"
},
{
"BillingPeriodStartDate": "2023-01-01T00:00:00Z",
"BillingPeriodEndDate": "2023-02-01T00:00:00Z",
"ChargePeriodStartDate": "2023-01-01T00:00:00Z",
"ChargePeriodEndDate": "2023-01-01T01:00:00Z",
"ChargeCategory": "Usage",
"ChargeFrequency": "Usage-Based",
"PricingCategory": "Committed",
"ResourceId": "<commitment-discount-id>",
"ConsumedQuantity": null,
"ConsumedUnit": null,
"BilledCost": 0.00,
"EffectiveCost": 0.25,
"CommitmentDiscountId": "<commitment-discount-id>",
"CommitmentDiscountQuantity": 0.25,
"CommitmentDiscountStatus": "Unused",
"CommitmentDiscountUnit": "USD"
}
]
In this scenario, one eligible resource runs for the full
hour and is charged $1.50. One row shows that $1.00 was
amortized from the commitment discount, and the other
shows that $0.50 was charged as standard, on-demand spend.
[
{
"BillingPeriodStartDate": "2023-01-01T00:00:00Z",
"BillingPeriodEndDate": "2023-02-01T00:00:00Z",
"ChargePeriodStartDate": "2023-01-01T00:00:00Z",
"ChargePeriodEndDate": "2023-01-01T01:00:00Z",
"ChargeCategory": "Usage",
"ChargeFrequency": "Usage-Based",
"PricingCategory": "Committed",
"ResourceId": "<resource-id>",
"ConsumedQuantity": 1,
"ConsumedUnit": "Hour",
"BilledCost": 0.00,
"EffectiveCost": 1.00,
"CommitmentDiscountId": "<commitment-discount-id>",
"CommitmentDiscountQuantity": 1.00,
"CommitmentDiscountStatus": "Used",
"CommitmentDiscountUnit": "USD"
},
{
"BillingPeriodStartDate": "2023-01-01T00:00:00Z",
"BillingPeriodEndDate": "2023-02-01T00:00:00Z",
"ChargePeriodStartDate": "2023-01-01T00:00:00Z",
"ChargePeriodEndDate": "2023-01-01T01:00:00Z",
"ChargeCategory": "Usage",
"ChargeFrequency": "Usage-Based",
"PricingCategory": "Standard",
"ResourceId": "<resource-id>",
"ConsumedQuantity": 1,
"ConsumedUnit": "Hour",
"BilledCost": 0.50,
"EffectiveCost": 0.00
}
]
Providers natively support various constructs for grouping resources or services. These grouping
constructs are often used to mimic organizational structures, technical
architectures, cost attribution/allocation and access management
boundaries, or other customer-specific structures based on
requirements.
Providers may support multiple levels of resource or service grouping
mechanisms. FOCUS supports two distinct levels of groupings that are
commonly needed for FinOps capabilities like chargeback, invoice
reconciliation and cost allocation.
The table below highlights key properties of the two grouping
constructs supported by FOCUS.
Property | Billing account | Sub account |
---|---|---|
Requirement level | Mandatory | Optional |
Receives an invoice? | Yes | No |
Invoiced at | Self | Associated billing account |
Examples | AWS: Management Account* GCP: Billing Account Azure MCA: Billing Profile Snowflake: Organizational Account |
AWS: Member Account GCP: Project Azure MCA: Subscription Snowflake: Account |
* For organizations that have multiple AWS Member Accounts
within an AWS Organization, consolidated billing is enabled by default
and invoices are received at Management Account level. A Member Account
can be removed from AWS consolidated billing whereby the removed account
receives independent invoices and is responsible for payments.
Cost data presented in the billing datasets originates from various
sources depending on the purchasing mechanism. There are at least 3
different pieces of information that are important for understanding
where cost originated from.
The value for each of these may be different depending on the various
purchasing scenarios for resources or services. Use
cases for purchasing direct, via a Managed Service Provider (MSP), via a
cloud marketplace, and from internal service offerings were considered.
The table below presents a few scenarios to show how the value for each
dimension may change based on the purchasing scenario.
# | Scenario | Provider | Publisher | Invoice Issuer |
---|---|---|---|---|
1.1 | Purchasing cloud services directly from cloud provider |
Cloud service provider | Cloud service provider | Cloud service provider |
1.2 | Purchasing cloud services from the cloud provider where the cloud region is operated by a 3rd party |
Cloud service provider | Cloud service provider | Entity operating the region for the cloud service provider |
2.1 | Purchasing cloud services via MSP | Managed Service Provider | Cloud service provider | Managed Service Provider |
2.2 | Purchasing cloud-agnostic resources or services built/sold by an MSP |
Managed Service Provider | Managed Service Provider | Managed Service Provider |
2.3 | Purchasing labor services from managed service provider |
Managed Service Provider | Managed Service Provider | Managed Service Provider |
3.1 | Purchasing a cloud marketplace offering that runs on the cloud provider |
Cloud service provider | Company building the software or services (Cloud service provider OR third-party software or services company) |
Cloud service provider |
3.2 | Purchasing a cloud marketplace offering that is not running directly on your cloud infrastructure (e.g,. SaaS product, Professional Services) |
Cloud service provider | Company producing the SaaS or services product |
Cloud service provider |
3.3 | Purchasing a SaaS product that is not directly running on your cloud infrastructure from a 3rd party reseller managed cloud marketplace |
Cloud service provider | SaaS provider | Reseller |
4.1 | Purchasing SaaS software directly from provider |
SaaS provider | SaaS provider | SaaS provider |
4.2 | Purchasing SaaS software that additionally runs on your cloud resources (in addition to #4.1) |
Cloud service provider | Cloud service provider | Cloud service provider |
5.1 | Purchasing internal infrastructure or services offerings running on-premise |
Internal product name | Internal product name | Internal product name |
5.2 | Purchasing internal infrastructure or services offerings running on cloud |
Internal product name | Internal product name | Internal product name |
5.3 | Associated software license cost for use on an on-premise infrastructure platform (Where license cost is presented separately in cost data) |
Internal product name | Company producing the software | Internal product name |
This section is non-normative.
The following sections contain examples of metadata provided by a
hypothetical FOCUS data provider called ACME to supply the required
reference between the FOCUS
dataset and the schema metadata. Provider implementations will
vary on how the metadata is disseminated; however, the provider’s chosen
metadata delivery approach should be able to support the structure
represented in this example.
In this example, the provider supports delivery of FOCUS data via
file export to a data storage system. It uses JSON as the format for
providing the metadata. The provider delivers data every 12 hours into a
path structure described below:
Type of data | Path |
---|---|
Export location | /FOCUS |
Metadata location | /FOCUS/metadata |
Cost data location | /FOCUS/data |
Here are some metadata examples for various scenarios:
Acme provides metadata about the data generator as a part of their
FOCUS data export. They provide the relevant data via the Data Generator schema object.
Metadata can be provided at a location such as
/FOCUS/metadata/data_generator.json
.
The updated data generator related metadata could look like this:
ACME has only provided one Schema for their
FOCUS data export. ACME provides a directory of schemas and each schema
is a single file. Acme’s provides a file representing the schema for the
data they provide.
Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-1234-abcde-12345-abcde-12345.json
.
The updated schema related metadata could look like this:
{
"SchemaId": "1234-abcde-12345-abcde-12345",
"FocusVersion": "1.0",
"CreationDate": "2024-01-01T12:01:03.083z",
"ColumnDefinition": [
{
"ColumnName": "BillingAccountId",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "BillingAccountName",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "ChargePeriodStart",
"DataType": "DATETIME"
},
{
"ColumnName": "ChargePeriodEnd",
"DataType": "DATETIME"
},
{
"ColumnName": "BilledCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "EffectiveCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "Tags",
"DataType": "JSON",
"ProviderTagPrefixes": ["acme", "ac"]
}
]
}
ACME makes a change to the Schema of their data
exports. For each FOCUS data export, ACME includes a metadata reference
to the schema object. Because multiple files are provided in each
export, Acme has elected to include a metadata file in each export
folder that includes the FOCUS schema reference that applies to the data
export files within that folder. When the schema changes, they include
the new Schema ID in their export metadata file
of the new folder.
Metadata can be provided at a location such as
/FOCUS/data/export1-metadata.json
The export metadata could look like this:
{
"SchemaId":"1234-abcde-12345-abcde-12345",
"data_location":
[
{
"filepath": "/FOCUS/data/export1/export1-part1.csv",
"total_bytes": 9010387,
"total_rows": 4450
},
{
"filepath": "/FOCUS/data/export1/export1-part2.csv",
"total_bytes": 9010387,
"total_rows": 4450
},
{
"filepath": "/FOCUS/data/export1/export1-part3.csv",
"total_bytes": 9010387,
"total_rows": 4450
},
{
"filepath": "/FOCUS/data/export1/export1-part4.csv",
"total_bytes": 9010387,
"total_rows": 4450
}
]
}
New metadata can be provided at a location such as
/FOCUS/data/export2-metadata.json
.
The new export metadata could look like this:
{
"SchemaId":"23456-abcde-23456-abcde-23456",
"data_location":
[
{
"filepath": "/FOCUS/data/export2/export2-part1.csv",
"total_bytes": 9010387,
"total_rows": 4450
},
{
"filepath": "/FOCUS/data/export2/export2-part2.csv",
"total_bytes": 9010387,
"total_rows": 4450
},
{
"filepath": "/FOCUS/data/export2/export2-part3.csv",
"total_bytes": 9010387,
"total_rows": 4450
},
{
"filepath": "/FOCUS/data/export2/export2-part4.csv",
"total_bytes": 9010387,
"total_rows": 4450
}
]
}
ACME has decided add additional columns to their FOCUS data export.
The new columns are x_awesome_column1, x_awesome_column2, and
x_awesome_column3. The provider creates a new Schema object to represent the new schema, this
schema object has a unique SchemaId. The
subsequent data exports that use the new schema include the new schema’s
id as a reference to their corresponding schema object.
Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-23456-abcde-23456-abcde-23456.json
.
The updated schema related metadata could look like this:
{
"SchemaId": "23456-abcde-23456-abcde-23456",
"FocusVersion": "1.0",
"CreationDate": "2024-02-02T12:01:03.083z",
"ColumnDefinition": [
{
"ColumnName": "BillingAccountId",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "BillingAccountName",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "ChargePeriodStart",
"DataType": "DATETIME"
},
{
"ColumnName": "ChargePeriodEnd",
"DataType": "DATETIME"
},
{
"ColumnName": "BilledCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "EffectiveCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "Tags",
"DataType": "JSON",
"ProviderTagPrefixes": ["awecorp", "ac"]
},
{
"ColumnName": "x_awesome_column1",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "x_awesome_column2",
"DataType": "DATETIME"
},
{
"ColumnName": "x_awesome_column3",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
}
]
}
For an example of how ACME ensures the schema metadata reference
requirement is met see: Schema Metadata to FOCUS Data
Reference
ACME has decided to remove columns from their FOCUS data export. The
column removed is x_awesome_column3. The provider creates a new Schema object to represent the new schema, with a
unique SchemaId.
Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-34567-abcde-34567-abcde-34567.json
.
The updated schema related metadata could look like this:
{
"SchemaId": "34567-abcde-34567-abcde-34567",
"FocusVersion": "1.0",
"CreationDate": "2024-03-02T12:01:03.083z",
"ColumnDefinition": [
{
"ColumnName": "BillingAccountId",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "BillingAccountName",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "ChargePeriodStart",
"DataType": "DATETIME"
},
{
"ColumnName": "ChargePeriodEnd",
"DataType": "DATETIME"
},
{
"ColumnName": "BilledCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "EffectiveCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "Tags",
"DataType": "JSON",
"ProviderTagPrefixes": ["acme", "ac"]
},
{
"ColumnName": "x_awesome_column1",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "x_awesome_column2",
"DataType": "DATETIME"
}
]
}
For an example of how ACME ensures the schema metadata reference
requirement is met see: Schema Metadata to FOCUS Data
Reference
ACME has decided to change the datatype of column x_awesome_column1
from a string to a number. ACME creates a new Schema object with the modification to
x_awesome_column2.
Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-67891-abcde-67891-abcde-67891.json
.
The updated schema related metadata could look like this:
{
"SchemaId": "67891-abcde-67891-abcde-67891",
"FocusVersion": "1.0",
"CreationDate": "2024-06-02T12:01:03.083z",
"ColumnDefinition": [
{
"ColumnName": "BillingAccountId",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "BillingAccountName",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "ChargePeriodStart",
"DataType": "DATETIME"
},
{
"ColumnName": "ChargePeriodEnd",
"DataType": "DATETIME"
},
{
"ColumnName": "BilledCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "EffectiveCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "Tags",
"DataType": "JSON",
"ProviderTagPrefixes": ["acme", "ac"]
},
{
"ColumnName": "x_awesome_column1",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "x_awesome_column2",
"DataType": "DATETIME"
}
]
}
For an example of how ACME ensures the schema metadata reference
requirement is met see: Schema Metadata to FOCUS Data
Reference
ACME has discovered that while their export includes the column
x_awesome_column3, the Schema metadata does not
include this column. In this case, the provider fixes the metadata in
the existing schema object and does not need to create a new schema
object. Reference metadata remains the same.
Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-34567-abcde-34567-abcde-34567.json
.
The updated schema related metadata could look like this:
{
"SchemaId": "34567-abcde-34567-abcde-34567",
"FocusVersion": "1.0",
"CreationDate": "2024-03-02T12:01:03.083z",
"ColumnDefinition": [
{
"ColumnName": "BillingAccountId",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "BillingAccountName",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "ChargePeriodStart",
"DataType": "DATETIME"
},
{
"ColumnName": "ChargePeriodEnd",
"DataType": "DATETIME"
},
{
"ColumnName": "BilledCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "EffectiveCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "Tags",
"DataType": "JSON",
"ProviderTagPrefixes": ["acme", "ac"]
},
{
"ColumnName": "x_awesome_column1",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "x_awesome_column2",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
}
]
}
ACME’s previous exports used FOCUS version 1.0. They are now going to
adopt FOCUS version 1.1. It is required that they create a new schema
metadata object which specifies the new FOCUS version via the FOCUS Version property – regardless of schema
changes. In this example, the new FOCUS version adoption doesn’t include
columns changes. This is to illustrate that FOCUS version changes are
independent of column changes, however, this scenario is unlikely.
Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-45678-abcde-45678-abcde-45678.json
.
The updated schema related metadata could look like this:
{
"SchemaId": "45678-abcde-45678-abcde-45678",
"FocusVersion": "1.1",
"CreationDate": "2024-04-02T12:01:03.083z",
"ColumnDefinition": [
{
"ColumnName": "BillingAccountId",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "BillingAccountName",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "ChargePeriodStart",
"DataType": "DATETIME"
},
{
"ColumnName": "ChargePeriodEnd",
"DataType": "DATETIME"
},
{
"ColumnName": "BilledCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "EffectiveCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "Tags",
"DataType": "JSON",
"ProviderTagPrefixes": ["acme", "ac"]
},
{
"ColumnName": "x_awesome_column1",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "x_awesome_column2",
"DataType": "DATETIME"
}
]
}
For an example of how ACME ensures the schema metadata reference
requirement is met see: Schema Metadata to FOCUS Data
Reference
ACME specifies the optional metadata property Provider Version in their Schema object. Their provider version 2.2 supported
FOCUS version 1.0. They are now going to adopt FOCUS Version 1.1 which
requires that they update their Provider Version when updating the FOCUS
Version. They create a new schema object designating that both
properties have changed. In this example, the adoption of the new FOCUS
version doesn’t include additional columns. This is to illustrate that
Provider Version can change independent of column changes; however, this
scenario is unlikely.
The provider creates a new schema object to represent the new schema.
The provider includes both the new FOCUS Version and Provider Version in
the schema object.
Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-45678-abcde-45678-abcde-45678.json
.
The updated schema related metadata could look like this:
{
"SchemaId": "45678-abcde-45678-abcde-45678",
"FocusVersion": "1.1",
"ProviderVersion": "2.3",
"name": "New Columns",
"CreationDate": "2024-04-02T12:01:03.083z",
"ColumnDefinition": [
{
"ColumnName": "BillingAccountId",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "BillingAccountName",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "ChargePeriodStart",
"DataType": "DATETIME"
},
{
"ColumnName": "ChargePeriodEnd",
"DataType": "DATETIME"
},
{
"ColumnName": "BilledCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "EffectiveCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "Tags",
"DataType": "JSON",
"ProviderTagPrefixes": ["acme", "ac"]
},
{
"ColumnName": "x_awesome_column1",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "x_awesome_column2",
"DataType": "DATETIME"
}
]
}
For reference, the prior schema object looked like this:
{
"SchemaId": "34567-abcde-34567-abcde-34567",
"FocusVersion": "1.0",
"ProviderVersion": "2.2",
"CreationDate": "2024-04-02T12:01:03.083z",
"ColumnDefinition": [
{
"ColumnName": "BillingAccountId",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "BillingAccountName",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "ChargePeriodStart",
"DataType": "DATETIME"
},
{
"ColumnName": "ChargePeriodEnd",
"DataType": "DATETIME"
},
{
"ColumnName": "BilledCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "EffectiveCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "Tags",
"DataType": "JSON",
"ProviderTagPrefixes": ["acme", "ac"]
},
{
"ColumnName": "x_awesome_column1",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "x_awesome_column2",
"DataType": "DATETIME"
}
]
}
For an example of how ACME ensures the schema metadata reference
requirement is met see: Schema Metadata to FOCUS Data
Reference
ACME specifies the optional metadata property Provider Version in their Schema object. They made a change to the FOCUS dataset they produce
that does not adopt a new FOCUS Version, nor make a change the included
columns but does impact values in the data. This example illustrates
that Provider Version changes are independent of column changes, however
provider version changes may include column changes.
The provider creates a new schema object to represent the new schema.
The provider includes both the FOCUS Version and Provider Version in the
schema object.
Metadata can be provided at a location such as
/FOCUS/metadata/schemas/schema-56789-abcde-56789-abcde-56789.json
.
The updated schema related metadata could look like this:
{
"SchemaId": "56789-abcde-56789-abcde-56789",
"FocusVersion": "1.1",
"ProviderVersion": "2.4",
"CreationDate": "2024-05-02T12:01:03.083z",
"ColumnDefinition": [
{
"ColumnName": "BillingAccountId",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "BillingAccountName",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "ChargePeriodStart",
"DataType": "DATETIME"
},
{
"ColumnName": "ChargePeriodEnd",
"DataType": "DATETIME"
},
{
"ColumnName": "BilledCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "EffectiveCost",
"DataType": "DECIMAL",
"NumericPrecision": 20,
"NumberScale": 10
},
{
"ColumnName": "Tags",
"DataType": "JSON",
"ProviderTagPrefixes": ["acme", "ac"]
},
{
"ColumnName": "x_awesome_column1",
"DataType": "STRING",
"StringMaxLength": 64,
"StringEncoding": "UTF-8"
},
{
"ColumnName": "x_awesome_column2",
"DataType": "DATETIME"
}
]
}
For an example of how ACME ensures the schema metadata reference
requirement is met see: Schema Metadata to FOCUS Data
Reference
Explore the goals of FOCUS, view sample use cases, and learn about gathering FOCUS conformed datasets.
Take the Free courseAn in-depth understanding of the FOCUS Specification, learn how to use FOCUS datasets to answer real-world business questions.
Learn more