This document provides reference information for the schema of Cloud Billing detailed usage cost data that's exported to each table in BigQuery.
The detailed usage cost data provides all of the information included in the standard usage cost data, along with additional fields that provide granular, resource-level cost data, like a virtual machine or SSD that generates usage. The detailed export includes granular cost information about the following services:
|
|
|
To analyze granular cost information in a detailed export, use the following table to identify the column that contains information about specific resources.
| Service description | Column | How to identify resources |
|---|---|---|
| AlloyDB for PostgreSQL | service.description and resource.name or
resource.global_name |
The |
| App Engine | service.description and resource.name, or
resource.global_name |
The |
| BigQuery | service.description and resource.name, or
resource.global_name
|
The |
| Bigtable | service.description and resource.global_name |
The |
| Cloud Data Fusion | service.description and resource.name or
resource.global_name |
The |
| Cloud Deploy | service.description and resource.name or
resource.global_name |
The |
| Cloud Run functions | service.description and resource.name or
resource.global_name |
The |
| Cloud Logging | service.description and resource.global_name |
The |
| Cloud Run | service.description and resource.name or
resource.global_name |
The |
| Cloud SQL | service.description and resource.global_name |
The |
| Cloud Storage | service.description and resource.global_name |
The |
| Compute Engine | service.description and resource.name or
resource.global_name |
The |
| Dataflow | service.description and resource.name, or
resource.global_name
|
The |
| Managed Service for Apache Spark Metastore | service.description and resource.name or
resource.global_name |
The |
| Firestore and Datastore | service.description and resource.name, or
resource.global_name |
The |
| Google Kubernetes Engine (GKE) | labels.key |
Use the following label keys to filter the resources:
To view granular GKE cluster costs in your detailed cost data export, you must also enable cost allocation for GKE. See example queries for filtering GKE data in BigQuery exports. |
| Managed Microsoft AD | service.description and resource.name or
resource.global_name |
The |
| Memorystore for Redis | service.description and resource.global_name |
The |
| Pub/Sub | service.description and resource.name or
resource.global_name |
The |
| Secret Manager | service.description, resource.name, and
resource.global_name |
The |
| Spanner | service.description and resource.global_name |
The |
See examples of querying granular data for your resources.
In your BigQuery dataset, your detailed Google Cloud
usage cost data is loaded into a data table named
gcp_billing_export_resource_v1_<BILLING_ACCOUNT_ID>.
When you use the detailed usage cost data in BigQuery, note the following:
billing_account_idThe Cloud Billing account ID that the usage is associated with.
For resellers: For usage costs generated by a Cloud Billing subaccount, this is the ID of the subaccount, not the ID of the parent reseller Cloud Billing account.
invoice.monthThe year and month (YYYYMM) of the invoice that includes the cost line items. For example: "201901" is equivalent to January, 2019.
You can use this field to get the total charges on the invoice. See Cloud Billing Export to BigQuery Query Examples.
invoice.publisher_typeIndicates the publisher associated with the transaction. This field supports the splitting of invoices between transactions made directly with Google (first party), and transactions made with a partner (third party), which also signals what regulations might apply to the transaction.
The possible values are:GOOGLE: First-party, unregulated transaction by Google Cloud.PARTNER: A third-party, regulated or unregulated transaction by a partner.cost_typeThe type of cost this line item represents: regular, tax, adjustment, or rounding error.
service.idservice.descriptionsku.idsku.descriptionusage_start_timeFor more information, see the BigQuery documentation on timestamp data types. See also, Differences between exported data and invoices.
usage_end_timeFor more information, see the BigQuery documentation on timestamp data types. See also, Differences between exported data and invoices.
projectproject contains fields that describe the
Cloud Billing project, such as ID, number, name, ancestry_numbers,
and labels.
project.idproject.numberproject.nameproject.ancestry_numbersproject.id (for example, my-project-123).
For example: /ParentOrgNumber/ParentFolderNumber/. Learn more about the Resource Hierarchy.
project.ancestorsThis field describes the structure and value of the resource hierarchy of a cost line item, including projects, folders, and organizations. Ancestors are ordered from node to root (project, folder, then organization).
project.ancestors.resource_nameproject.ancestors.resource_name will offer a more complete view of
project.ancestry_numbers. project.ancestors.display_nameproject.labelsproject.labels.keyproject.labels.valuelabelslabels.keylabels.valuesystem_labelssystem_labels.keysystem_labels.valuelocation.locationglobal for
resources don't have a specific location.
For more information, see
Geography and regions and
Google Cloud locations.
location.countrylocation.location is a country, region, or zone, this
field is the country of usage, e.g. US.
For more information, see
Geography and regions and
Google Cloud locations.
location.regionlocation.location is a region or zone, this field is
the region of usage, e.g. us-central1.
For more information, see
Geography and regions and
Google Cloud locations.
location.zonelocation.location is a zone, this field is the zone of
usage, e.g. us-central1-a.
For more information, see
Geography and regions and
Google Cloud locations.
costCost per the applicable consumption model inclusive of any negotiated discounts reflected in the custom pricing in the contract linked to your Cloud Billing account (if applicable).
currencycurrency_conversion_ratecost ÷ currency_conversion_rate
is the cost in US dollars.usage.amountusage.unit used.usage.unitusage.amount_in_pricing_units
usage.pricing_unit used.
usage.pricing_unit
creditscredits contains fields that describe the structure and
value of the credits associated with Google Cloud and Google Maps
Platform SKUs.credits.idcredits.id values are either an alphanumeric unique identifier
(for example, 12-b34-c56-d78), or a description of the credit type
(such as
Committed Usage Discount: CPU).
If the credits.id field is empty, then the product SKU isn't
associated with a credit.
credits.full_namecredits.id.
Examples include
Free trial credit or
Spend-based committed use discount.
credits.full_name values are only present for SKUs with an
alphanumeric credits.id. If the value of the
credits.id is a description of the credit type (such as
Committed Usage Discount: CPU), then the
credits.full_name field is empty.
credits.typecredits.id.
Credit types include:
FEE_UTILIZATION_OFFSET
For the new Spend-based CUD discounts,
this credit is used to offset the fees paid to purchase CUDs. With the
new model, you purchase commitments at a discounted price. As you use
the SKUs covered by the CUD, this credit offsets the fee. When you fully
utilize your commitment, the offset reduces the fee to zero, with your
eligible SKU usage charged at the discounted price.COMMITTED_USAGE_DISCOUNT_DOLLAR_BASE:
For legacy spend-based committed use discounts (CUDs) that aren't part
of the
new pricing model,
this is the credit earned in exchange for your commitment to spend a
minimum amount for a service in a particular region.COMMITTED_USAGE_DISCOUNT:
Resource-based committed use contracts purchased for
Compute Engine in return for deeply discounted prices for VM
usage.
DISCOUNT: The discount credit type is used for credits
earned after a contractual spending threshold is reached. Note that in
the Cloud Billing reports available in the
Google Cloud console, the discount credit type is listed as
Spending-based discounts.FREE_TIER: Some services offer
free resource usage up to specified limits. For these services,
credits are applied to implement the free tier usage.PROMOTION: The promotion credit type includes
spend-based milestone credits,
Google Cloud Free Trial and marketing campaign credits, or other
grants to use Google Cloud. When available, promotional credits
are considered a form of payment and are automatically applied to reduce
your total bill.RESELLER_MARGIN: If you're a reseller, the reseller
margin credit type indicates the Reseller Program Discounts
earned on every eligible line item.SUBSCRIPTION_BENEFIT: Credits earned by purchasing
long-term subscriptions to services in exchange for discounts.SUSTAINED_USAGE_DISCOUNT: The sustained use discounts
credit type is an automatic discount that you receive for running
eligible Compute Engine resources for a significant portion of
the billing month, with no commitment required.
credits.namecredits.amountadjustment_infoadjustment_info contains fields that describe the structure and
value of an adjustment to cost line items associated with a
Cloud Billing account.
adjustment_info values are only present if the cost line item
was generated for a Cloud Billing modification. A modification can
happen for correction or non-correction reasons. The
adjustment_info type contains details about the adjustment,
whether it was issued for correcting an error or other reasons.
adjustment_info.idadjustment_info.id is the unique ID for all
the adjustments associated with an issue.
adjustment_info.descriptionadjustment_info.typeThe type of adjustment.
Types include:
USAGE_CORRECTION: A correction due to incorrect reported
usage.PRICE_CORRECTION: A correction due to incorrect pricing
rules.METADATA_CORRECTION: A correction to fix metadata without
changing the cost.GOODWILL: A credit issued to the customer for goodwill.SALES_BASED_GOODWILL: A credit issued to the customer for
goodwill, as part of a contract.SLA_VIOLATION: A credit issued to the customer due to a
service-level objective (SLO) violation.BALANCE_TRANSFER: An adjustment to transfer funds from one
payment account to another.ACCOUNT_CLOSURE: An adjustment to bring a closed account
to a zero balance.GENERAL_ADJUSTMENT: A general billing account
modification.adjustment_info.modeHow the adjustment was issued.
Modes include:
PARTIAL_CORRECTION: The correction partially negates the
original usage and cost.COMPLETE_NEGATION_WITH_REMONETIZATION: The correction
fully negates the original usage and cost, and issues corrected line
items with updated usage and cost.COMPLETE_NEGATION: The correction fully negates the
original usage and cost, and no further usage is remonetized.MANUAL_ADJUSTMENT: The adjustment is allocated to cost
and usage manually.export_timetagsFields that describe the tag, such as key, value, and namespace.
tags.keyThe short name or display name of the key associated with this particular tag.
tags.valueThe resources attached to a tags.key. At any given time, exactly one
value can be attached to a resource for a given key.
tags.inheritedIndicates whether a tag binding is inherited (Tags Inherited = True) or direct/non-inherited (Tags Inherited = False). You can create a tag binding to a parent resource in the resource hierarchy.
tags.namespaceRepresents the resource hierarchy that define tag key and values. Namespace can be combined with tag key and tag value short names to create a globally unique, fully qualified name for the tag key or tag value.
cost_at_listCost at list price per the default consumption model.
transaction_typeGOOGLE = 1: Services sold by Google Cloud.THIRD_PARTY_RESELLER = 2: Third party services resold by Google Cloud.THIRD_PARTY_AGENCY = 3: Third party services sold by a partner, with Google Cloud
acting as the agent.cost_type =
regular and it can be missing for other cost_types.
seller_nameThe legal name of the seller.
This field is populated for Marketplace-related cost line items, which is set for countries where Google or an affiliate can act as the vendor's agent. For more information, see Agency Jurisdictions.
priceFields that describe the structure and values related to the prices charged for usage.
price.list_priceSKU list price per the default consumption model.
price.effective_price_defaultSKU price per the default consumption model inclusive of any negotiated discounts reflected in the custom pricing in the contract linked to your Cloud Billing account (if applicable).
price.list_price_consumption_modelSKU list price per the applicable consumption model before any negotiated discounts reflected in the custom pricing in the contract linked to your Cloud Billing account (if applicable).
price.effective_priceSKU price per the applicable consumption model inclusive of any negotiated discounts reflected in the custom pricing in the contract linked to your Cloud Billing account (if applicable).
price.tier_start_amountThe lower bound number of units for a SKU's pricing tier. For more information, see About pricing tiers.
price.unitThe unit of usage in which the pricing is specified and resource usage is measured.
price.pricing_unit_quantityThe SKU's pricing unit quantity. For example, if the price is $1 per 1000000 Bytes, then this column shows 1000000.
cost_at_effective_price_defaultCost per the default consumption model inclusive of any negotiated discounts reflected in the custom pricing in the contract linked to your Cloud Billing account (if applicable).
cost_at_list_consumption_modelCost per the applicable consumption model before any negotiated discounts reflected in the custom pricing in the contract linked to your Cloud Billing account (if applicable).
consumption_modelFields that describe the applicable consumption model.
consumption_model.idThe ID of the consumption model.
consumption_model.descriptionThe description of the consumption model.
resourceThe fields that describe the structure and value of information relevant to service resources (like a virtual machine or a SSD) that generate usage.
resource.global_nameA globally unique service identifier for the resource that generated relevant usage.
resource.nameA service-specific identifier for the resource that generated relevant usage. This can be input generated by the user.
subscriptionFields that describe your spend-based or resource-based commitments. You can use these fields to analyze your fees for specific commitments.
subscription.instance_idThe subscription ID linked to a commitment.
The following sections describe the standard and detailed usage cost data exported to BigQuery.
The cost data for a specific label only shows usage from the date that the label
was applied to a resource. For example, if you add the label environment:dev
to a Compute Engine VM on January 15, 2024, any analysis for
environment:dev includes only the usage for that VM since January 15.
You might also see label data at different times for different services, depending on when each service provides it.
System labels are key-value pairs for important metadata about the resource that generated the usage. The following system labels are automatically included on applicable usage.
system_labels.key |
Example system_labels.value |
Description |
|---|---|---|
compute.googleapis.com/machine_spec |
n1-standard-1, custom-2-2048 | Configuration of the virtual machine. See Machine Types for more information. |
compute.googleapis.com/cores |
for n1-standard-4 this is 4; for custom-2-2048 this is 2 | The number of vCPUs available to the virtual machine. |
compute.googleapis.com/memory |
for n1-standard-4 this is 15360 (i.e. 15 GB * 1024 MB/GB); for custom-2-2048 this is 2048 | The amount of memory (in MB) available to the virtual machine. |
compute.googleapis.com/is_unused_reservation |
true; false | Indicates usage that was reserved through Zonal Reservations but not used. |
compute.googleapis.com/reservation_name |
my-a2-reservation | The short name of the Compute Engine reservation. For first-party (1P)
scenarios, this also includes shared reservations consumed by instances created
by Google Cloud services, such as Vertex AI. For more information
about how to share reservations with first-parties (1P) in Vertex AI, see the following: |
compute.googleapis.com/reservation_project_id |
my-gcp-project | The Project ID owning the Compute Engine reservation. For first-party (1P)
scenarios, this also includes shared reservations consumed by instances created
by Google Cloud services, such as Vertex AI. For more information
about how to share reservations with first-parties (1P) in Vertex AI, see the following: |
storage.googleapis.com/object_state |
live; noncurrent; soft_deleted; multipart | The state of the storage object being charged. |
Google Cloud and billing-eligible products such as Google Maps Platform, Google AI Studio, and Firebase report usage data to Cloud Billing at varying intervals. Due to the complexity of our billing and processing systems, you might see a delay between your use of services, the usage charges being applied to your Google payments accounts, and the usage and costs being available to view in the various cost reports and dashboards.
At the end of a calendar month, late-reported usage might not be included on that month's invoice and instead might roll over to the next month's invoice.
When you query your costs using timestamp fields, your returned data might pick up late-reported usage that wasn't originally included on the invoice that was generated for the same usage month. As a result, the Cloud Billing data returned might not map directly to that invoice.
Timestamp fields include:
usage_start_timeusage_end_timeexport_timeTo return Cloud Billing data that maps directly to an invoice, query on
invoice.month
instead of timestamp fields.
As of September 1, 2020, your usage cost data shows your tax liability for each of your projects, instead of as a single line item. If you have queries or visualizations that depend on tax data, you might need to update the queries to account for these changes.
For example, for costs recorded before September 1, your usage cost data looks similar to the following example, which shows a total tax liability of $10.
billing_account_id |
project.id |
cost_type |
cost |
|---|---|---|---|
| 123456-ABCDEF-123456 | example-project | Regular | $60 |
| 123456-ABCDEF-123456 | test-project | Regular | $40 |
| 123456-ABCDEF-123456 | [empty] | Tax | $10 |
For costs recorded after September 1, the $10 is broken down to $6 for
example-project, and $4 for test-project:
billing_account_id |
project.id |
cost_type |
cost |
|---|---|---|---|
| 123456-ABCDEF-123456 | example-project | Regular | $60 |
| 123456-ABCDEF-123456 | test-project | Regular | $40 |
| 123456-ABCDEF-123456 | example-project | Tax | $6 |
| 123456-ABCDEF-123456 | test-project | Tax | $4 |
In the rare event that your Cloud Billing data contains an error or requires an adjustment, it's appended with corrective data. These adjustments fall under one of two categories: billing modifications or corrections.
Billing modifications appear as separate line items. If you received a billing modification, a new line item in your Cloud Billing export to BigQuery shows the change. The adjustments shown correspond to the invoice, credit memo, and debit memo documents available in the Documents area of the Billing section in the Google Cloud console.
For more information on billing modifications and how they're applied, see Understand memos and adjustments.
Corrections appear as new data that negates incorrect data on the source SKUs. In some cases, new data replaces the incorrect charge. All columns in the billing data export will match the original data, except for the following columns:
costcreditusage.amountexport_timeFor example, imagine that you're charged $10 for your usage of SKU A on
January 1. On your January invoice (issued in early February), you'll see a
charge of $10 for SKU A. However, on February 2, Google Cloud issued a
correction against SKU A, reducing the usage cost to $5. You'll receive two
additional line items on your February invoice (issued in early March):
These new items have an adjustment_info column in the billing data export. The
original January invoice, showing the overcharge, won't be adjusted. You can
verify your charges in your billing data export by viewing your costs by
usage_start_time and grouping by Day. In these views, any corrections or
charges for late-monetized usage are accumulated, and you don't need to worry
about any temporarily incorrect data.
If you want more detailed information on your corrections, view all charges in an invoice month, and look for charges where the usage date occurred before the invoice month. These charges are the results of corrections or late-monetized usage.
The following code sample shows how to create a basic query that returns the total cost of corrections or late-monetized usage:
SELECT
SUM(cost)
+ SUM(IFNULL((SELECT SUM(c.amount)
FROM UNNEST(credits) c), 0))
AS total
FROM `project.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX`
WHERE
invoice.month = '202311' AND
DATE(TIMESTAMP_TRUNC(usage_start_time, Day, 'US</Pacific')) '2023-11-01';
For a query example that returns a cost breakdown by service, for invoice charges, where the usage date occurred before the invoice month, see Query cost details to view corrections or late-monetized usage by service for a specified invoice month in "Example queries for Cloud Billing data export."
If you have a custom pricing contract, you might receive promotional credits to use on Google Cloud as part of the contract. For example, you might receive $1,000 to use on Compute Engine resources. Promotional credits are typically considered a form of payment. When available, promotional credits are automatically applied to reduce your total bill.
The terms of your contract specify whether the promotional credits apply to your costs calculated at the list price of a SKU, or the net price (after discounts).
If your promotional credits apply to costs that are calculated at the list
price, in the Cost table report, there's a service called Invoice, with a
SKU called Contract billing adjustment. This SKU adjusts your credits so that
they apply to the costs at list price. To see the usage that the adjustment is
for, query the system.labels columns. The key in system.labels.key is
cloud-invoice.googleapis.com/sku_id, and the value in system.labels.value
contains the SKU ID that the credit and the adjustment applied to.
Tags are resources in the form of key-value pairs that can be attached to resources directly or through inheritance. You can use tags to perform chargebacks, audits, and other cost allocation analysis. You can also use tags and conditional enforcement of policies for fine-grained control across your resource hierarchy.
Tags have a robust permissions model and can support inheritance, centralized management, nomenclature standardization, and policy engine integration, while labels are a separate tool that allow you to annotate resources.
Tags data appears in BigQuery exports for Resources, Projects, Folders, and Organizations.
The Standard costs and Detailed costs exports for Resources, Projects, Folders, and Organizations include these fields for tags data: Tags Key, Tags Value, Tags Inherited, and Tags Namespace.
Resource-level tags in the Cloud Billing data export are available for the following resources:
This section provides examples of how to query the Cloud Billing detailed usage cost data exported to BigQuery.
Because the detailed usage cost schema includes all of the fields from the standard usage cost schema, the query examples provided for the standard data exported to BigQuery also work with the detailed data that's exported. The standard query examples aren't written to retrieve any of the resource-level information that's provided with the detailed usage cost export option. When creating queries for the detailed data, you can use a standard query example as a template, update the Table name, and add any of the fields that are available in the detailed usage cost schema.
The query examples in this section use the following value for Table name:
project.dataset.gcp_billing_export_resource_v1_XXXXXX_XXXXXX_XXXXXX
The following queries demonstrate two ways of viewing resource-level cost and credit values on an invoice using exported billing data.
total field directly sums the floating point cost and credit values,
which can result in floating point rounding errors.total_exact field converts costs and credit values to micros before
summing, then converts back to dollars after summing, avoiding the
floating point rounding error.This query shows the invoice total for each resource.name per month, as a sum
of regular costs, taxes, adjustments, and rounding errors. Any costs not
associated with a resource-level item are aggregated under the name null
for the month.
Standard SQL
SELECT invoice.month, resource.name, SUM(cost) + SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0)) AS total, (SUM(CAST(cost * 1000000 AS int64)) + SUM(IFNULL((SELECT SUM(CAST(c.amount * 1000000 as int64)) FROM UNNEST(credits) c), 0))) / 1000000 AS total_exact FROM `project.dataset.gcp_billing_export_resource_v1_XXXXXX_XXXXXX_XXXXXX` GROUP BY 1, 2 ORDER BY 1 ASC, 2 ASC ;
For example, the result of the preceding query might be:
| Row | month | name | total | total_exact |
|---|---|---|---|---|
| 1 | 201901 | null | $1005.004832999999984 | $1005.00 |
| 2 | 201901 | backend1 | $781.8499760000028 | $781.85 |
| 3 | 201902 | null | $953.0034923645475983 | $953.03 |
| 4 | 201902 | backend1 | $992.3101739999999717 | $992.31 |
| 5 | 201902 | bitnami-launchpad-wordpress-1-wordpress | $1.2817819999999998 | $1.28 |
This query shows the totals for each cost_type for each resource.name per
month. Cost types include regular costs, taxes, adjustments, and rounding
errors. Any costs not associated with a resource-level item are aggregated
under the name null for the month.
Standard SQL
SELECT invoice.month, cost_type, resource.name, SUM(cost) + SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0)) AS total, (SUM(CAST(cost * 1000000 AS int64)) + SUM(IFNULL((SELECT SUM(CAST(c.amount * 1000000 as int64)) FROM UNNEST(credits) c), 0))) / 1000000 AS total_exact FROM `project.dataset.gcp_billing_export_resource_v1_XXXXXX_XXXXXX_XXXXXX` GROUP BY 1, 2, 3 ORDER BY 1 ASC, 2 ASC, 3 ASC ;
For example, the result of the preceding query might be:
| Row | month | cost_type | name | total | total_exact |
|---|---|---|---|---|---|
| 1 | 201901 | regular | null | $1000.501209987994782 | $1000.50 |
| 2 | 201901 | rounding_error | null | –$0.500489920049387 | –$0.50 |
| 3 | 201901 | tax | null | $10.000329958477891 | $10.00 |
| 4 | 201901 | adjustment | null | –$5.002572999387045 | –$5.00 |
| 5 | 201901 | regular | backend1 | $410.998795012082947 | $411.00 |
| 2 | 201901 | rounding_error | backend1 | –$0.2404900489920378 | –$0.24 |
| 3 | 201901 | tax | backend1 | $4.105840329977189 | $4.11 |
This section provides examples of filtering GKE cluster costs in your BigQuery export reports. To learn more about GKE cluster costs, visit View breakdown of cluster costs.
The following example queries show you how to filter and group your GKE costs for supported resource types by cluster name, namespace, and label.
GKE cluster costs before credits
SELECT SUM(cost) AS cost_before_credits, labels.value AS cluster_name FROM `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX` LEFT JOIN UNNEST(labels) as labels ON labels.key = "goog-k8s-cluster-name" GROUP BY labels.value ;
GKE costs after credits by namespace
SELECT labels.value as namespace, SUM(cost) + SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0)) AS cost_after_credits, FROM `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX` LEFT JOIN UNNEST(labels) as labels ON labels.key = "k8s-namespace" GROUP BY namespace ;
GKE costs by SKU
SELECT project.id AS project_id, labels.value AS cluster_name, sku.id AS sku_id, sku.description AS sku_description, SUM(cost) AS cost FROM `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX` JOIN UNNEST(labels) AS labels ON labels.key = "goog-k8s-cluster-name" GROUP BY cluster_name, project_id, sku_description, sku_id ;
The following examples illustrate ways to query your data with tags.
The following query demonstrates how you can use return costs by invoice month
for the cost_center tag.
SELECT invoice.month AS invoice_month, tag.value AS cost_center, ROUND((SUM(CAST(cost AS NUMERIC)) + SUM(IFNULL((SELECT SUM (CAST(c.amount AS NUMERIC)) FROM UNNEST(credits) AS c), 0))), 2) AS net_cost FROM `project-ID.dataset.gcp_billing_export_resource_v1_XXXXXX-XXXXXX-XXXXXX`, UNNEST(tags) AS tag WHERE tag.key = "cost_center" AND tag.namespace = "821092389413" GROUP BY invoice.month, tag.value ORDER BY invoice.month, tag.value;
For example, the result of the preceding query might be:
| Row | invoice_month | cost_center | net_cost |
|---|---|---|---|
| 1 | 202208 | android_mobile_apps | 9.93 |
| 2 | 202208 | ios_mobile_apps | 9.93 |
| 3 | 202209 | android_mobile_apps | 25.42 |
| 4 | 202209 | ios_mobile_apps | 25.4 |
| 5 | 202209 | personalization | 16.08 |
This query shows the invoice total for untagged resources, grouped by invoice month.
SELECT invoice.month AS invoice_month, ROUND((SUM(CAST(cost AS NUMERIC)) + SUM(IFNULL((SELECT SUM(CAST(c.amount AS NUMERIC)) FROM UNNEST(credits) AS c), 0))), 2) AS net_cost FROM `project-ID.dataset.gcp_billing_export_v1_XXXXXX-XXXXXX-XXXXXX` WHERE "color" NOT IN (SELECT key FROM UNNEST(tags)) GROUP BY invoice_month ORDER BY invoice_month;
For example, the result of the preceding query might be:
| Row | invoice_month | net_cost |
|---|---|---|
| 1 | 202202 | 0 |
| 2 | 202203 | 16.81 |
| 3 | 202204 | 54.09 |
| 4 | 202205 | 55.82 |
| 5 | 202206 | 54.09 |
| 6 | 202207 | 55.83 |
| 7 | 202208 | 31.49 |
System labels for Google Cloud reservations provide enhanced visibility into your reservation usage. They allow you to track which instances are consuming which reservations, and analyze the costs associated with both used and unused capacity directly within BigQuery.
These examples use two system labels:
compute.googleapis.com/reservation_namecompute.googleapis.com/reservation_project_idThese labels are present on Cloud Billing records from both instances consuming a reservation and the unused portion of a reservation.
The following examples demonstrate how to query the BigQuery billing export to analyze reservation consumption using system labels.
To query using system labels, you must have Cloud Billing export to BigQuery enabled, specifically the Detailed usage cost data export. This export contains the resource-level information, including system labels, necessary to see the new reservation labels.
To set up or verify your BigQuery export, see the following documentation:
Ensure your BigQuery dataset is configured to receive the
detailed export. The table name will typically be in the format
gcp_billing_export_resource_v1_<BILLING_ACCOUNT_ID>.
This query lets you check if a given instance utilized a reservation during a particular period and, if so, which reservation it was.
SELECT
t.usage_start_time,
sl_reservation.value AS reservation_name,
t.sku.description AS sku_description,
SUM(t.usage.amount) AS total_usage_amount
FROM
project-ID.dataset.gcp_billing_export_resource_v1_X AS t
LEFT JOIN
UNNEST(t.system_labels) AS sl_reservation
ON sl_reservation.key = 'compute.googleapis.com/reservation_name'
WHERE
t.service.id = '6F81-5844-456A' AND DATE(TIMESTAMP_TRUNC(t._PARTITIONTIME, DAY)) = '2025-09-16' AND t.sku.description LIKE '%Core%' AND
t.resource.name LIKE '%tc-billing-case1-instance-1757983787%'
GROUP BY t.usage_start_time, reservation_name, t.sku.description
ORDER BY t.usage_start_time, reservation_name, t.sku.description;
Sample Result:
| usage_start_time | reservation_name | sku_description | total_usage_amount |
|---|---|---|---|
| 2025-09-16 00:00:00.000000 UTC | E2 Instance Core running in Americas | 597 | |
| 2025-09-16 01:00:00.000000 UTC | E2 Instance Core running in Americas | 3009 | |
| 2025-09-16 01:00:00.000000 UTC | tc-billing-case1-res0-1757983787 | E2 Instance Core running in Americas | 591 |
| 2025-09-16 02:00:00.000000 UTC | E2 Instance Core running in Americas | 10 | |
| 2025-09-16 02:00:00.000000 UTC | tc-billing-case1-res0-1757983787 | E2 Instance Core running in Americas | 3054 |
| 2025-09-16 02:00:00.000000 UTC | tc-billing-case1-res1-1757983787 | E2 Instance Core running in Americas | 37 |
Note:
When multiple rows with differing reservation_name and reservation_project_id correspond to a specific instance within a given timeframe, it indicates that the instance's consumed reservation changed during that period. The usage portion will detail the consumption.
This query helps you understand the distribution of usage for a given shared reservation, showing how much capacity was used or unused among different Google Cloud projects that can consume the given reservation.
SELECT
t.project.id AS consumer_project_id,
t.sku.description AS sku_description,
CASE
WHEN t.resource.global_name NOT LIKE '%instances/%' THEN 'Unused Capacity'
WHEN t.resource.name IS NOT NULL AND t.resource.name != '' THEN 'Instance Usage'
ELSE 'Other Reservation Cost'
END AS usage_category,
SUM(t.usage.amount) AS total_usage_amount,
t.usage.unit AS usage_unit,
SUM(t.cost) AS total_cost_usd
FROM
project-ID.dataset.gcp_billing_export_resource_v1_X AS t
LEFT JOIN
UNNEST(t.system_labels) AS sl_reservation
ON sl_reservation.key = 'compute.googleapis.com/reservation_name'
LEFT JOIN
UNNEST(t.system_labels) AS sl_project_id
ON sl_project_id.key = 'compute.googleapis.com/reservation_project_id'
WHERE
t.service.id = '6F81-5844-456A' AND DATE(TIMESTAMP_TRUNC(t._PARTITIONTIME, DAY)) = '2025-09-16' AND t.sku.description LIKE '%Core%' AND
sl_reservation.value LIKE '%tc-billing-case2-res-1757983801%'
GROUP BY consumer_project_id, t.sku.description, usage_category,
usage_unit
ORDER BY consumer_project_id, usage_category;
Sample Results:
| consumer_project_id | sku_description | usage_category | total_usage_amount | usage_unit | total_cost_usd |
|---|---|---|---|---|---|
| disco-sector-292704 | E2 Instance Core running in Americas | Instance Usage | 14551 | seconds | 0.088158 |
| flash-freehold-292704 | E2 Instance Core running in Americas | Instance Usage | 7347 | seconds | 0.044512 |
| united-sandbox-303721 | E2 Instance Core running in Americas | Unused Capacity | 7936 | seconds | 0.04808 |
Similarly, we can write a query to understand all the instances, including first-party (1P) instances, that have consumed a given reservation during a given time period.
SELECT
t.usage_start_time,
t.usage_end_time,
t.project.id AS consumer_project_id,
t.resource.name AS instance_name,
t.usage.amount AS usage_amount
FROM
project-ID.dataset.gcp_billing_export_resource_v1_X AS t
LEFT JOIN
UNNEST(t.system_labels) AS sl_reservation
ON sl_reservation.key = 'compute.googleapis.com/reservation_name'
WHERE
t.service.id = '6F81-5844-456A' AND DATE(TIMESTAMP_TRUNC(t._PARTITIONTIME, DAY)) = '2025-09-16' AND t.sku.description LIKE '%Core%' AND
sl_reservation.value LIKE '%tc-billing-case2-res-1757983801%' AND t.resource.global_name NOT LIKE '%allocation/%' AND
t.resource.name IS NOT NULL AND t.resource.name != ''
ORDER BY t.usage_start_time, t.project.id, t.resource.name;
Sample results:
| usage_start_time | usage_end_time | consumer_project_id | instance_name | usage_amount |
|---|---|---|---|---|
| 2025-09-16 00:00:00.000000 UTC | 2025-09-16 01:00:00.000000 UTC | disco-sector-292704 | projects/204187533293/instances/tc-billing-case2-ins0-1757983801 | 552 |
| 2025-09-16 00:00:00.000000 UTC | 2025-09-16 01:00:00.000000 UTC | disco-sector-292704 | projects/204187533293/instances/tc-billing-case2-ins1-1757983801 | 533 |
| 2025-09-16 00:00:00.000000 UTC | 2025-09-16 01:00:00.000000 UTC | flash-freehold-292704 | projects/978655420110/instances/tc-billing-case2-ins2-1757983801 | 517 |
| 2025-09-16 01:00:00.000000 UTC | 2025-09-16 02:00:00.000000 UTC | disco-sector-292704 | projects/204187533293/instances/tc-billing-case2-ins0-1757983801 | 3600 |
| 2025-09-16 01:00:00.000000 UTC | 2025-09-16 02:00:00.000000 UTC | disco-sector-292704 | projects/204187533293/instances/tc-billing-case2-ins1-1757983801 | 3600 |
| 2025-09-16 01:00:00.000000 UTC | 2025-09-16 02:00:00.000000 UTC | flash-freehold-292704 | projects/978655420110/instances/tc-billing-case2-ins2-1757983801 | 3600 |
| 2025-09-16 02:00:00.000000 UTC | 2025-09-16 03:00:00.000000 UTC | disco-sector-292704 | projects/204187533293/instances/tc-billing-case2-ins0-1757983801 | 3022 |
| 2025-09-16 02:00:00.000000 UTC | 2025-09-16 03:00:00.000000 UTC | disco-sector-292704 | projects/204187533293/instances/tc-billing-case2-ins0-1757983801 | 79 |
| 2025-09-16 02:00:00.000000 UTC | 2025-09-16 03:00:00.000000 UTC | disco-sector-292704 | projects/204187533293/instances/tc-billing-case2-ins1-1757983801 | 79 |
| 2025-09-16 02:00:00.000000 UTC | 2025-09-16 03:00:00.000000 UTC | disco-sector-292704 | projects/204187533293/instances/tc-billing-case2-ins1-1757983801 | 3086 |
| 2025-09-16 02:00:00.000000 UTC | 2025-09-16 03:00:00.000000 UTC | flash-freehold-292704 | projects/978655420110/instances/tc-billing-case2-ins2-1757983801 | 3151 |
| 2025-09-16 02:00:00.000000 UTC | 2025-09-16 03:00:00.000000 UTC | flash-freehold-292704 | projects/978655420110/instances/tc-billing-case2-ins2-1757983801 | 79 |
To analyze how first-party (1P) products, such as Vertex AI, consume your shared reservations across projects where Vertex AI jobs are active, use the following system labels in BigQuery:
compute.googleapis.com/reservation_namecompute.googleapis.com/reservation_project_idFor more information about how to share reservations with first-party (1P) products in Vertex AI, see the following:
The following example queries show how to use these labels to get detailed visibility into your reservation usage, monitor how instances consume these reservations, and perform in-depth cost analysis.
If you create and share a reservation with Vertex AI for a training job, the following query returns the list of SKU types for the current date.
SELECT DISTINCT
t.sku.description AS sku_description
FROM
project-ID.dataset.gcp_billing_export_resource_v1_X AS t
LEFT JOIN
UNNEST(t.system_labels) AS sl_reservation
ON sl_reservation.key = 'compute.googleapis.com/reservation_name'
WHERE
TRUE
AND t.service.id = '6F81-5844-456A'
AND DATE(t.usage_start_time) = CURRENT_DATE()
AND EXISTS(
SELECT 1
FROM UNNEST(t.Tags) AS tag
WHERE
tag.key = 'gcp-product'
AND tag.value = 'vertex_ai'
AND tag.inherited = TRUE
)
AND sl_reservation.value = 'RESERVATION_NAME'
AND t.resource.name IS NOT NULL
AND t.resource.name != ''
ORDER BY sku_description ASC;
Sample results
The results show that the training job uses three SKU types within the Vertex AI service.
| sku_description |
|---|
| N1 Predefined Instance Core running in Americas |
| N1 Predefined Instance Ram running in Americas |
| Nvidia Tesla T4 GPU running in Americas |
The following query helps you understand the distribution of instances and their usage costs associated with a reservation for a first-party (1P) product in the current month.
SELECT
t.sku.description AS sku_description,
t.usage_start_time AS usage_start_time,
t.usage_end_time AS usage_end_time,
SUM(t.usage.amount) AS total_usage_amount
FROM
project-ID.dataset.gcp_billing_export_resource_v1_X AS t
LEFT JOIN
UNNEST(t.system_labels) AS sl_reservation
ON sl_reservation.key = 'compute.googleapis.com/reservation_name'
LEFT JOIN
UNNEST(t.system_labels) AS sl_project_id
ON sl_project_id.key = 'compute.googleapis.com/reservation_project_id'
WHERE
TRUE
AND t.service.id = '6F81-5844-456A'
AND t.invoice.month = '202602'
AND EXISTS(
SELECT 1
FROM UNNEST(t.Tags) AS tag
WHERE
tag.key = 'gcp-product'
AND tag.value = 'vertex_ai'
AND tag.inherited = TRUE
)
AND sl_reservation.value = 'RESERVATION_NAME'
AND sl_project_id.value = 'PROJECT_ID'
AND t.resource.name IS NOT NULL
AND t.resource.name != ''
GROUP BY sku_description, usage_start_time, usage_end_time;
Sample results
The following output shows how SKUs use the reservation and provides a breakdown of the corresponding usage costs.
| sku_description | usage_start_time | usage_end_time | total_usage_amount |
|---|---|---|---|
| N1 Predefined Instance Core running in Americas | 2026-02-10 05:00:00.000000 UTC | 2026-02-10 06:00:00.000000 UTC | 5040 |
| N1 Predefined Instance Ram running in Americas | 2026-02-10 05:00:00.000000 UTC | 2026-02-10 06:00:00.000000 UTC | 20293720473600 |
| Nvidia Tesla T4 GPU running in Americas | 2026-02-10 05:00:00.000000 UTC | 2026-02-10 06:00:00.000000 UTC | 1260 |
| N1 Predefined Instance Core running in Americas | 2026-02-10 04:00:00.000000 UTC | 2026-02-10 05:00:00.000000 UTC | 14400 |
| N1 Predefined Instance Ram running in Americas | 2026-02-10 04:00:00.000000 UTC | 2026-02-10 05:00:00.000000 UTC | 57982058496000 |
| Nvidia Tesla T4 GPU running in Americas | 2026-02-10 04:00:00.000000 UTC | 2026-02-10 05:00:00.000000 UTC | 3600 |
If you use a reservation shared across multiple owner projects where Vertex AI jobs are active, you can use the following query to analyze and break down your usage costs by individual project.
SELECT
t.project.id AS consumer_project_id,
t.sku.description AS sku_description,
t.usage.unit AS usage_unit,
SUM(t.usage.amount) AS total_usage_amount
FROM
project-ID.dataset.gcp_billing_export_resource_v1_X AS t
LEFT JOIN
UNNEST(t.system_labels) AS sl_reservation
ON sl_reservation.key = 'compute.googleapis.com/reservation_name'
LEFT JOIN
UNNEST(t.system_labels) AS sl_project_id
ON sl_project_id.key = 'compute.googleapis.com/reservation_project_id'
WHERE
TRUE
AND t.service.id = '6F81-5844-456A'
AND EXISTS(
SELECT 1
FROM UNNEST(t.Tags) AS tag
WHERE
tag.key = 'gcp-product'
AND tag.value = 'vertex_ai'
AND tag.inherited = TRUE
)
AND sl_reservation.value = 'RESERVATION_NAME'
AND sl_project_id.value = 'PROJECT_ID'
GROUP BY
consumer_project_id, sku_description, usage_unit
ORDER BY consumer_project_id, sku_description, usage_unit;
Sample results
The following output shows the contribution of each project to total usage costs while consuming the reservation.
| consumer_project_id | sku_description | usage_unit | total_usage_amount |
|---|---|---|---|
| project1 | N1 Predefined Instance Core running in Americas | seconds | 4221572 |
| project1 | N1 Predefined Instance Ram running in Americas | byte-seconds | 16998309356466500 |
| project1 | Nvidia Tesla T4 GPU running in Americas | seconds | 1057391 |
| project2 | N1 Predefined Instance Core running in Americas | seconds | 3996192 |
| project2 | N1 Predefined Instance Ram running in Americas | byte-seconds | 16009292257431300 |
| project2 | Nvidia Tesla T4 GPU running in Americas | seconds | 993985 |
For information related to exported Cloud Billing data, see the following:
For details of the cost and pricing reports available in the Google Cloud console, see the following:
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2026-06-09 UTC.