Cloud Billing 데이터를 BigQuery로 내보내는 쿼리 예시

다음은 내보낸 Cloud Billing 데이터에 BigQuery 쿼리를 사용하는 방법의 몇 가지 예시입니다.

인보이스의 총 비용 반환

다음 쿼리에서는 내보낸 결제 데이터를 사용하여 비용과 크레딧 값을 확인할 수 있는 두 가지 방법을 보여줍니다.

  • total 필드는 부동 소수점 비용과 크레딧 값을 직접 합산하므로 부동 소수점 반올림 오차가 발생할 수 있습니다.
  • total_exact 필드는 비용과 크레딧 값을 합산하기 전 micro로 변환한 다음 합산 후에 다시 dollar로 변환하므로, 부동 소수점 반올림 오차가 방지됩니다.

예 1: 인보이스 대상 월별 모든 비용 합계

이 쿼리에서는 일반 비용 합계로 된 각 월의 인보이스 합계, 세금, 조정 및 반올림 오차를 보여줍니다.

표준 SQL

    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
    ;
    

예를 들어 앞의 쿼리에 대한 결과는 다음과 같습니다.

month total total_exact
1 201901 $1005.004832999999984 $1005.00
2 201902 $992.3101739999999717 $992.31
3 201903 $1220.761089999999642 $1220.76

예 2: 인보이스 대상 월당 비용 유형별 세부정보 반환

이 쿼리에서는 월별로 각 cost_type의 합계를 보여줍니다. 비용 유형에는 일반 비용, 세금, 조정 및 반올림 오차가 포함됩니다.

표준 SQL

    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
    ;
    

예를 들어 앞의 쿼리에 대한 결과는 다음과 같습니다.

month cost_type total total_exact
1 201901 regular $1000.501209987994782 $1000.50
2 201901 rounding_error –$0.500489920049387 –$0.50
3 201901 tax $10.000329958477891 $10.00
4 201901 adjustment –$5.002572999387045 –$5.00

추가 쿼리 예제

다음 예에서는 데이터를 쿼리하는 다른 방법들을 보여줍니다.

이 섹션의 예시에서는 다음을 가정합니다.

  • 2가지 앱(grapefruit-squeezer 및 chocolate-masher)이 있습니다.
  • 각 앱에는 2가지 환경(dev 및 prod)이 있습니다.
  • dev 환경의 경우 앱마다 소형 인스턴스 1개가 있습니다.
  • prod 환경의 경우 소형 인스턴스가 미국과 아시아에 각각 1개씩 있습니다.
  • 각 인스턴스에 앱 및 환경 라벨이 지정됩니다.
  • 실험에 사용되며 라벨이 없는 인스턴스가 1개 있습니다.

총 청구 요금은 $24이며 상세 내역은 다음과 같습니다.

인스턴스 라벨 총 비용
소형 인스턴스(VCPU 1개), 미국에서 실행 없음 $4
소형 인스턴스(VCPU 1개), 미국에서 실행 앱: chocolate-masher
환경: dev
$2
소형 인스턴스(VCPU 1개), 미국에서 실행 앱: grapefruit-squeezer
환경: dev
$3
소형 인스턴스(VCPU 1개), 미국에서 실행 앱: chocolate-masher
환경: prod
$3.25
소형 인스턴스(VCPU 1개), 아시아에서 실행 앱: chocolate-masher
환경: prod
$3.75
소형 인스턴스(VCPU 1개), 미국에서 실행 앱: grapefruit-squeezer
환경: prod
$3.50
소형 인스턴스(VCPU 1개), 아시아에서 실행 앱: grapefruit-squeezer
환경: prod
$4.50

그룹화 없이 모든 행 쿼리

이러한 비용을 가장 자세히 확인하려면 그룹화 없이 모든 행을 쿼리해야 합니다. 라벨과 SKU 설명을 제외한 프로젝트, 서비스 등의 모든 필드는 동일하다고 가정합니다.

표준 SQL

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

legacy SQL

    TO_JSON_STRING Not supported.
    
sku.description 라벨 비용
1 소형 인스턴스(VCPU 1개), 미국에서 실행 [] $4
2 소형 인스턴스(VCPU 1개), 미국에서 실행 [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"dev"}] $2
3 소형 인스턴스(VCPU 1개), 미국에서 실행 [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"dev"}] $3
4 소형 인스턴스(VCPU 1개), 미국에서 실행 [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"prod"}] $3.25
5 소형 인스턴스(VCPU 1개), 아시아에서 실행 [{"key":"app","value":"chocolate-masher"},{"key":"environment","value":"prod"}] $3.75
6 소형 인스턴스(VCPU 1개), 미국에서 실행 [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"prod"}] $3.50
7 소형 인스턴스(VCPU 1개), 아시아에서 실행 [{"key":"app","value":"grapefruit-squeezer"},{"key":"environment","value":"prod"}] $4.50
합계 $24

라벨 맵에 따라 JSON 문자열로 그룹화

빠르고 쉽게 비용을 라벨 조합별로 분류하는 방법입니다.

표준 SQL

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

legacy 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
합계 $24

라벨 값의 특정 키에 따라 그룹화

특정 라벨 키의 값에 따라 비용을 분류하는 경우가 많습니다. LEFT JOIN을 사용하고 WHERE가 아닌 JOIN 조건에 키 필터를 넣으면 이 키를 포함하지 않는 비용이 포함되므로 모든 비용을 확인할 수 있습니다.

표준 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;
    

legacy SQL

    SELECT
      labels.value as environment,
      SUM(cost) as cost
    FROM [project:dataset.table]
    WHERE labels.key = "environment" OR labels.key IS NULL
    GROUP BY environment;
    
환경 비용
1 prod $15
2 dev $5
3 null $4
합계 $24

키-값 쌍으로 그룹화

이 결과를 해석하거나 내보낼 때는 주의해야 합니다. 여기에서 개별 행은 중복 합산되지 않은 올바른 합계를 표시하지만 다른 행과 조합돼서는 안 됩니다. 키가 동일한 경우나 키가 같은 리소스에 설정되지 않은 것이 확실한 경우는 제외됩니다.

표준 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;
    

legacy 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

총합이 결제 금액보다 높습니다.