BigQuery クエリへの請求のエクスポート例

エクスポートされた課金データに対して BigQuery クエリを使用する方法の例をいくつか紹介します。

これらの例では、以下のことを想定します。

  • アプリを 2 つ(grapefruit-squeezer と chocolate-masher)持っている。
  • アプリごとに、2 つの環境(開発と本番)がある。
  • アプリごとに、開発環境に 1 つの小さいインスタンスがある。
  • 本番環境では、アメリカに 1 つの小さいインスタンス、アジアに 1 つの小さいインスタンスがある。
  • 各インスタンスには、アプリと環境のラベルが付けられている。
  • 実験に使用するラベルのないインスタンスが 1 つある。

請求額合計は 25 ドルで、内訳は次のとおりです。

インスタンス ラベル 合計費用
1 つの VCPU がアメリカで稼働している小規模インスタンス なし $4
1 つの VCPU がアメリカで稼働している小規模インスタンス アプリ: chocolate-masher
環境: 開発
$2
1 つの VCPU がアメリカで稼働している小規模インスタンス アプリ: grapefruit-squeezer
環境: 開発
$3
1 つの VCPU がアメリカで稼働している小規模インスタンス アプリ: chocolate-masher
環境: 本番
$3.25
1 つの VCPU がアジアで稼働している小規模インスタンス アプリ: chocolate-masher
環境: 本番
$3.75
1 つの VCPU がアメリカで稼働している小規模インスタンス アプリ: grapefruit-squeezer
環境: 本番
$3.50
1 つの VCPU がアジアで稼働している小規模インスタンス アプリ: grapefruit-squeezer
環境: 本番
$4.50

以下の例は、データのクエリを実行する方法を示しています。

グループ化せずにすべての行に対してクエリを発行

上記の費用を最も詳細に確認する方法は、グループ化せずにすべての行に対してクエリを実行することです。ラベルとリソースタイプを除き、すべてのフィールド(プロジェクト、プロダクトなど)が同じであるとします。

標準 SQL

SELECT
  resource_type,
  TO_JSON_STRING(labels) as labels,
 cost as cost
FROM `project.dataset.table`;

レガシー SQL

TO_JSON_STRING Not supported.
resource_type ラベル 費用
1 1 つの VCPU がアメリカで稼働している小規模インスタンス [] $4
2 1 つの VCPU がアメリカで稼働している小規模インスタンス [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"dev"}] $2
3 1 つの VCPU がアメリカで稼働している小規模インスタンス [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"dev"}] $3
4 1 つの VCPU がアメリカで稼働している小規模インスタンス [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"prod"}] $3.25
5 1 つの VCPU がアジアで稼働している小規模インスタンス [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"prod"}] $3.75
6 1 つの VCPU がアメリカで稼働している小規模インスタンス [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"prod"}] $3.50
7 1 つの VCPU がアジアで稼働している小規模インスタンス [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"prod"}] $4.50
合計 $25

ラベルマップ別に JSON 文字列としてグループ化

これは、ラベルの組み合わせごとに費用を素早く簡単に割り出す方法です。

標準 SQL

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

レガシー SQL

TO_JSON_STRING Not supported.
ラベル 費用
1 [] $4
2 [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"dev"}] $2
3 [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"dev"}] $3
4 [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"prod"}] $7
5 [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"prod"}] $8
合計 $25

ラベル値を基準に特定のキーについてグループ化

特定のラベルキーの値についての費用を割り出すのは、一般的な使用例です。LEFT JOIN を使用し、JOIN 条件(WHERE ではなく)としてキーフィルタを設定すると、このキーを含まない費用が含まれるため、費用の全体像を把握することができます。

標準 SQL

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

レガシー SQL

SELECT
  labels.value as environment,
  SUM(cost) as cost
FROM [project:dataset.table]
WHERE labels.key = "environment" OR labels.key IS NULL;
環境 費用
1 本番 $15
2 開発 $6
3 null $4
合計 $25

キー / 値のペア別にグループ化

これらの結果を解釈またはエクスポートするときは注意してください。ここでは各行が、二重カウントなしの有効な合計を示していますが、他の行と組み合わせることはできません(ただし、キーが同じである場合や、同じリソースに複数のキーが設定されていない場合などは除きます)。

標準 SQL

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

レガシー SQL

SELECT
  labels.key as key,
  labels.value as value,
  SUM(cost)
FROM [project:dataset.table]
GROUP BY key, value;
キー 費用
1 null null $4
2 app chocolate-masher $9
3 app grapefruit-squeezer $11
4 environment dev $5
5 environment prod $15
合計 $44

合計が請求額より大きいことに注意してください。