Exemplo de consultas para exportação de dados do Cloud Billing

Nesta página, apresentamos alguns exemplos de como consultar os dados do Cloud Billing exportados e armazenados no BigQuery.

Como especificar o nome da tabela a ser usado nas consultas

Nestes exemplos, para consultar os dados do Cloud Billing no BigQuery, é preciso especificar o nome da tabela na cláusula FROM. O nome da tabela é determinado usando três valores: project.dataset.BQ_table_name.

Exemplo de consultas por tipo de dados do Cloud Billing

Esta página fornece exemplos de consulta para os dados de detalhes de custo diários e dados de preços.

Dados detalhados de custo diário Dados dos preços
Exemplos de consulta detalhadas de custo diários Exemplos de consulta de dados de preços

Exemplos de consulta detalhadas de custo diários

Nesta seção, apresentamos exemplos diferentes de como consultar os dados detalhados de custos diários do Cloud Billing exportados para o BigQuery.

Valores comuns usados nas consultas detalhadas de custo de exemplo

Os exemplos de consulta nesta seção usam os seguintes valores:

  • Nome da tabela: project.dataset.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX

Retornar os custos totais em uma fatura

Nas consultas a seguir, demonstramos duas maneiras de visualizar valores de custo e crédito usando dados de faturamento exportados.

  • O campo total soma diretamente o custo de ponto flutuante e os valores de crédito, o que pode acarretar erros de arredondamento de ponto flutuante.
  • O campo total_exact converte custos e valores de crédito em micros antes de somar, depois reconverte para dólares após a soma, o que evita o erro de arredondamento de ponto flutuante.

Exemplo 1: soma de todos os custos, por fatura

Essa consulta mostra o total da fatura de cada mês, como uma soma de custos regulares, impostos, ajustes e erros de arredondamento.

SQL padrão

SELECT
  invoice.month,
  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_v1_XXXXXX_XXXXXX_XXXXXX`
GROUP BY 1
ORDER BY 1 ASC
;

Por exemplo, o resultado da consulta anterior pode ser:

Linha mês total total_exact
1 201901 US$ 1005,004832999999984 US$ 1005,00
2 201902 US$ 992,3101739999999717 US$ 992,31
3 201903 US$ 1220,761089999999642 US$ 1220,76

Exemplo 2: retornar detalhes por tipo de custo, por mês da fatura

Nesta consulta, mostramos os totais de cada cost_type para cada mês. Os tipos de custos incluem custos regulares, tributos, ajustes e erros de arredondamento.

SQL padrão

SELECT
  invoice.month,
  cost_type,
  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_v1_XXXXXX_XXXXXX_XXXXXX`
GROUP BY 1, 2
ORDER BY 1 ASC, 2 ASC
;

Por exemplo, o resultado da consulta anterior pode ser:

Linha mês cost_type total total_exact
1 201901 regular US$ 1000,501209987994782 US$ 1000,50
2 201901 rounding_error –US$ 0,500489920049387 –US$ 0,50
3 201901 tax US$ 10,000329958477891 US$ 10,00
4 201901 adjustment –US$ 5,002572999387045 –US$ 5,00

Exemplos de consultas com rótulos

Os exemplos a seguir ilustram outras maneiras de consultar dados com rótulos.

Para os exemplos nesta seção, pressuponha o seguinte:

  • Você tem 2 aplicativos (grapefruit-squeezer e chocolate-masher).
  • Para cada aplicativo, você tem 2 ambientes: desenvolvimento (dev) e produção (prod).
  • O ambiente de desenvolvimento tem uma pequena instância por aplicativo.
  • O ambiente de produção tem uma pequena instância nas Américas e uma pequena instância na Ásia.
  • Cada instância é rotulada com o aplicativo e o ambiente.
  • Você tem 1 instância sem rótulos utilizada para testes.

Sua conta total é de US$ 24, detalhada da seguinte maneira:

Instância Rótulos Custo total
Pequena instância com uma vCPU em execução nas Américas Nenhum US$ 4
Pequena instância com uma vCPU em execução nas Américas app: chocolate-masher
ambiente: dev
US$ 2
Pequena instância com uma vCPU em execução nas Américas app: grapefruit-squeezer
ambiente: dev
US$ 3
Pequena instância com uma vCPU em execução nas Américas app: chocolate-masher
ambiente: prod
US$ 3,25
Pequena instância com uma vCPU em execução na Ásia app: chocolate-masher
ambiente: prod
US$ 3,75
Pequena instância com uma vCPU em execução nas Américas app: grapefruit-squeezer
ambiente: prod
US$ 3,50
Pequena instância com uma vCPU em execução na Ásia app: grapefruit-squeezer
ambiente: prod
US$ 4,50

Consultar cada linha sem agrupar

A visão mais granular desses custos seria consultar cada linha sem agrupar. Suponha que todos os campos, exceto os rótulos e a descrição do SKU, sejam os mesmos (projeto, serviço etc.).

SQL padrão

SELECT
  sku.description,
  TO_JSON_STRING(labels) as labels,
 cost as cost
FROM `project.dataset.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX`;

SQL legado

TO_JSON_STRING not supported.
Linha sku.description rótulos custo
1 Pequena instância com uma vCPU em execução nas Américas [] US$ 4
2 Pequena instância com uma vCPU em execução nas Américas [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"dev"}] US$ 2
3 Pequena instância com uma vCPU em execução nas Américas [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"dev"}] US$ 3
4 Pequena instância com uma vCPU em execução nas Américas [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"prod"}] US$ 3,25
5 Pequena instância com uma vCPU em execução na Ásia [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"prod"}] US$ 3,75
6 Pequena instância com uma vCPU em execução nas Américas [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"prod"}] US$ 3,50
7 Pequena instância com uma vCPU em execução na Ásia [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"prod"}] US$ 4,50
TOTAL US$ 24

Agrupar por mapa de rótulos como uma string JSON

Esta é uma maneira rápida e fácil de detalhar os custos por combinação de rótulos.

SQL padrão

SELECT
  TO_JSON_STRING(labels) as labels,
  sum(cost) as cost
FROM `project.dataset.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX`
GROUP BY labels;

SQL legado

TO_JSON_STRING not supported.
Linha rótulos custo
1 [] US$ 4
2 [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"dev"}] US$ 2
3 [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"dev"}] US$ 3
4 [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"prod"}] US$ 7
5 [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"prod"}] US$ 8
TOTAL US$ 24

Agrupar pelo valor do rótulo de uma chave específica

Detalhar custos para valores de uma chave de rótulo específica é um caso de uso comum. Usando um LEFT JOIN e colocando o filtro de chave na condição JOIN (em vez de WHERE), você inclui um custo que não contém essa chave e, assim, recebe uma visão completa dos custos.

SQL padrão

SELECT
  labels.value as environment,
  SUM(cost) as cost
FROM `project.dataset.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX`
LEFT JOIN UNNEST(labels) as labels
  ON labels.key = "environment"
GROUP BY environment;

SQL legado

SELECT
  labels.value as environment,
  SUM(cost) as cost
FROM [project:dataset.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX]
WHERE labels.key = "environment" OR labels.key IS NULL
GROUP BY environment;
Linha ambiente custo
1 prod US$ 15
2 dev US$ 5
3 null US$ 4
TOTAL US$ 24

Agrupar por pares de chave/valor

Tenha cuidado ao interpretar ou exportar esses resultados. Uma linha individual neste caso mostra uma soma válida sem contagem dupla, mas não deve ser combinada com outras linhas (exceto, possivelmente, se a chave for a mesma ou se você estiver certo de que as chaves nunca são definidas no mesmo recurso).

SQL padrão

SELECT
  labels.key as key,
  labels.value as value,
  SUM(cost) as cost
FROM `project.dataset.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX`
LEFT JOIN UNNEST(labels) as labels
GROUP BY key, value;

SQL legado

SELECT
  labels.key as key,
  labels.value as value,
  SUM(cost)
FROM [project:dataset.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX]
GROUP BY key, value;
Linha chave valor custo
1 null null US$ 4
2 app chocolate-masher US$ 9
3 app grapefruit-squeezer US$ 11
4 environment dev US$ 5
5 environment prod US$ 15
TOTAL US$ 44

Observe que a soma total é maior que sua fatura.

Consultas de desconto por uso contínuo

As consultas a seguir demonstram maneiras de visualizar as taxas e os créditos associados aos descontos por uso contínuo nos dados de faturamento exportados.

Como visualizar taxas de compromisso

Para visualizar as taxas de compromisso dos descontos por uso contínuo na exportação de dados de faturamento, use a consulta de amostra a seguir.

SQL padrão

SELECT
    invoice.month AS invoice_month,
    SUM(cost) as commitment_fees
FROM `project.dataset.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX`
WHERE LOWER(sku.description) LIKE "commitment%"
GROUP BY 1

Como visualizar créditos de compromisso

Para visualizar créditos de desconto por uso contínuo na exportação dos dados de faturamento, use a seguinte consulta de amostra.

SQL padrão

SELECT
    invoice.month AS invoice_month,
    SUM(credits.amount) as CUD_credits
FROM `project.dataset.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX`
LEFT JOIN UNNEST(credits) AS credits
WHERE LOWER(credits.name) LIKE "committed use discount%"
GROUP BY 1

Outros exemplos de consulta

Consultar custos e créditos por projeto de um mês específico da fatura

Se você fornecer o mês de fatura específico de junho de 2020 (no formato AAAAMM), essa consulta retornará uma visualização dos custos e créditos agrupados por projeto, além de mostrar rótulos de projeto.

SQL padrão

SELECT
  project.name,
  TO_JSON_STRING(project.labels) as project_labels,
  sum(cost) as total_cost,
  SUM(creds.amount) as total_credits
FROM `project.dataset.gcp_billing_export_v1_XXXXXX_XXXXXX_XXXXXX`
  LEFT JOIN UNNEST(credits) as creds
WHERE invoice.month = "202006"
GROUP BY 1, 2
ORDER BY 1;

SQL legado

TO_JSON_STRING not supported.
Row name project_labels total_cost total_credits
1 CTG: Dev [{"key":"ctg_p_env","value":"dev"}] 79.140979 -4.763796
2 CTG - Prod [{"key":"ctg_p_env","value":"prod"},{"key":"ctg_team","value":"eng"}] 32.466272 -3.073356
3 CTG: Sandbox [{"key":"ctg_p_env","value":"dev"}] 0 0
4 CTG - Storage [{"key":"ctg_p_env","value":"prod"},{"key":"ctg_team","value":"data"}] 7.645793 -0.003761

Exemplos de consulta de dados de preços

Nesta seção, apresentamos exemplos diferentes de como consultar os dados de preços do Cloud Billing exportados para o BigQuery.

Valores comuns usados nas consultas de preços de exemplo

Os exemplos de consulta nesta seção usam os seguintes valores:

  • Nome da tabela: project.dataset.cloud_pricing_export
  • ID da SKU: 2DA5-55D3-E679 (Cloud Run - Solicitações)

Ver os preços de tabela de uma SKU específica

Neste exemplo, demonstramos uma consulta simples que retorna o list_price para cada nível de preços de uma SKU especificada.

SQL padrão

SELECT sku.id,  sku.description, list_price.*
FROM `project.dataset.cloud_pricing_export`
WHERE DATE(_PARTITIONTIME) = "2020-07-20"
      AND sku.id = "2DA5-55D3-E679"
;

_PARTITIONTIME é um campo gerado automaticamente pelo BigQuery e representa a data referente aos dados. Em vez de _PARTITIONTIME, é possível usar um campo que a exportação do Cloud Billing gera explicitamente, como pricing_as_of_time.

Esta é a mesma consulta configurada para usar o campo pricing_as_of_time:

SELECT sku.id,  sku.description, list_price.*
FROM `project.dataset.cloud_pricing_export`
WHERE DATE(pricing_as_of_time) = "2020-07-20"
      AND sku.id = "2DA5-55D3-E679"
;

Resultados da consulta

Row id descrição pricing_unit aggregation_info.
aggregation_level
aggregation_info.
aggregation_interval
tiered_rates.
pricing_unit_quantity
tiered_rates.
start_usage_amount
tiered_rates.
usd_amount
tiered_rates.
account_currency_amount
1 2DA5-55D3-E679 Solicitações COUNT CONTA MONTHLY 1000000 0 0 0
          1000000 2000000 0.4 0.4

Ver os preços de tabela de uma SKU específica e incluir a descrição do serviço

Os dois exemplos nesta seção demonstram consultas que retornam o list_price para cada nível de preços de uma SKU especificada, além de incluir a descrição da SKU e do serviço.

  • O exemplo 1 retorna uma SKU por linha, com os níveis de preços exibidos como dados aninhados.
  • O exemplo 2 demonstra como desaninhar os dados para retornar uma linha por SKU por nível de preço.

Exemplo 1: retorna dados aninhados

Este exemplo consulta uma única SKU para retornar os dados do list_price. Essa SKU tem vários níveis de preços. Os valores do campo de preço de tabela são exibidos em linhas individuais aninhadas na linha do ID da SKU.

SQL padrão

SELECT sku.id AS sku_id,
       sku.description AS sku_description,
       service.id AS service_id,
       service.description as service_description,
       list_price.*
FROM my-billing-admin-project.my_billing_dataset.cloud_pricing_export
WHERE DATE(_PARTITIONTIME) = "2020-07-20"
      AND sku.id = "2DA5-55D3-E679"
;

Resultados da consulta:

Row sku_id sku_description service_id service_description aggregation_info.
aggregation_level
aggregation_info.
aggregation_interval
tiered_rates.
pricing_unit_quantity
tiered_rates.
start_usage_amount
tiered_rates.
usd_amount
tiered_rates.
account_currency_amount
1 2DA5-55D3-E679 Solicitações 152E-C115-5142 Cloud Run CONTA MONTHLY 1000000 0 0 0
            1000000 2000000 0.4 0.4

Exemplo 2: retorna dados não aninhados que foram mesclados com a mesma tabela

Neste exemplo, consultamos uma única SKU para retornar o list price. A SKU tem vários níveis de preços. A consulta demonstra o uso do operador UNNEST para nivelar a matriz de tiered_rates e mesclar os campos com o mesma tabela, o que resulta em uma linha por nível de preço.

SQL padrão

SELECT sku.id AS sku_id,
       sku.description AS sku_description,
       service.id AS service_id,
       service.description as service_description,
       tier.*
FROM `my-billing-admin-project.my_billing_dataset.cloud_pricing_export`, UNNEST (sku_pricing.list_price.tiered_rates) as tier
WHERE DATE(_PARTITIONTIME) = "2020-07-20"
      AND sku.id = "2DA5-55D3-E679"
;

Resultados da consulta:

Row sku_id sku_description service_id service_description pricing_unit_quantity start_usage_amount usd_amount account_currency_amount
1 2DA5-55D3-E679 Solicitações 152E-C115-5142 Cloud Run 1000000.0 0.0 0.0 0.0
2 2DA5-55D3-E679 Solicitações 152E-C115-5142 Cloud Run 1000000.0 2000000.0 0.4 0.4

Usar a taxonomia do produto e taxonomia geográfica para consultar SKUs

  • Taxonomia do produto é uma lista de categorias de produtos que se aplicam à SKU, como sem servidor, Cloud Run ou VMs sob demanda.
  • Taxonomia geográfica são os metadados geográficos que se aplicam a uma SKU, e consiste em valores de tipo e região.

Ver a taxonomia do produto de uma SKU

Este exemplo demonstra uma consulta que retorna a lista product_taxonomy para uma SKU especificada, em que o ID da SKU = 2DA5-55D3-E679 (Cloud Run - solicitações).

SQL padrão

SELECT sku.id AS sku_id,
       sku.description AS sku_description,
       service.id AS service_id,
       service.description as service_description,
       product_taxonomy
FROM `project.dataset.cloud_pricing_export`
WHERE DATE(_PARTITIONTIME) = "2020-07-20"
      AND sku.id = "2DA5-55D3-E679"
;

Resultados da consulta:

Row sku_id sku_description service_id service_description product_taxonomy
1 2DA5-55D3-E679 Solicitações 152E-C115-5142 Cloud Run GCP
        Sem servidor
        Cloud Run
        Outro

Ver todas as SKUs para uma taxonomia de produto específica

Este exemplo demonstra uma consulta que retorna todas as SKUs que correspondem a um product_taxonomy especificado. Nessa consulta, especificamos Sem servidor como o valor de product taxonomy.

SQL padrão

SELECT sku.id AS sku_id,
       sku.description AS sku_description,
       service.id AS service_id,
       service.description as service_description,
       product_taxonomy
FROM `project.dataset.cloud_pricing_export`
WHERE DATE(_PARTITIONTIME) = "2020-07-20"
     AND "Serverless" in UNNEST(product_taxonomy)
LIMIT 10
;

Resultados da consulta:

Row sku_id sku_description service_id service_description product_taxonomy
1 0160-BD7B-4C40 Saída de intraregião da rede do Cloud Tasks F3A6-D7B7-9BDA Cloud Tasks GCP
        Sem servidor
        Cloud Tasks
        Outro
2 FE08-0A74-7AFD Saída da API GOOGLE do Cloud Tasks F3A6-D7B7-9BDA Cloud Tasks GCP
        Sem servidor
        Cloud Tasks
        Outro
3 A81A-32A2-B46D Armazenamento de fila de tarefas de Salt Lake City F17B-412E-CB64 App Engine GCP
        Sem servidor
        GAE
        Outro
        Fila de tarefas

Ver todas as SKUs de uma taxonomia geográfica e uma taxonomia de produtos específicas

Este exemplo demonstra uma consulta que retorna todas as SKUs correspondentes a uma região geo_taxonomy especificada e um product_taxonomy especificado, em que region = us-east4 e product_taxonomy = VMs sob demanda.

SQL padrão

SELECT sku.id AS sku_id,
       sku.description AS sku_description,
       service.id AS service_id,
       service.description as service_description,
       geo_taxonomy,
       product_taxonomy
FROM `project.dataset.cloud_pricing_export`
WHERE DATE(_PARTITIONTIME) = "2020-07-20"
      AND "VMs On Demand" in UNNEST(product_taxonomy)
      AND geo_taxonomy.type = "REGIONAL"
      AND "us-east4" in UNNEST (geo_taxonomy.regions)
;

Resultados da consulta:

Row sku_id sku_description service_id service_description geo_taxonomy.type geo_taxonomy.regions product_taxonomy
1 9174-81EE-425B Premium de locatário única para instância de locatário única em execução na Virgínia 6F81-5844-456A Compute Engine REGIONAL us-east4 GCP
            Compute
            GCE
            VMs sob demanda
            Memória: por GB
2 C3B9-E891-85ED RAM da instância de locatário individual em execução na Virgínia 6F81-5844-456A Compute Engine REGIONAL us-east4 GCP
            Compute
            GCE
            VMs sob demanda
            Memória: por GB
3 6E2A-DCD9-87ED RAM da instância pré-definida N1 em execução na Virgínia 6F81-5844-456A Compute Engine REGIONAL us-east4 GCP
            Compute
            GCE
            VMs sob demanda
            Memória: por GB

Relatórios de custos e preços disponíveis no Console do Google Cloud