[GCP]Log AnalyticsとLooker StudioでBigQueryのクエリコストをユーザー別に見える化する



先々月～先月（2022年9, 10月）頃、Cloud LoggingシリーズにLog Analyticsの公開プレビュー版が利用可能になったので、使ってみつつ、Looker Studio（旧Google Data Portal）でBigQueryのクエリコストをユーザー別に見える化するところまで実施してみたので、覚書きを残しておきます。

※本記事は、2022年11月1日に執筆しました。

# 用語解説

Log AnalyticsとLooker Studioについて、簡単に解説しておきます。

## Log Analytics

Cloud Loggingシリーズの機能セットのひとつで、BigQueryの機能を活用してログ分析できる。
ログの一元管理ができ、データの重複コピーが不要なため、低コスト。
他、Log Analytics からのクエリ実行は無料だったり、ログ形式を変更しても、スキーマの不一致によるエラーは発生しない、などなど従来版と比べ、いろいろ改善されている様子。

詳細や従来版との比較については、

* [Cloud Logging のご紹介 - BigQuery を活用した Log Analytics | Google Cloud 公式ブログ](https://cloud.google.com/blog/ja/products/devops-sre/introducing-cloud-loggings-log-analytics-powered-by-big-query)
* [BigQuery Export ユーザーの Log Analytics への移行 | Google Cloud 公式ブログ](https://cloud.google.com/blog/ja/products/data-analytics/moving-to-log-analytics-for-bigquery-export-users)

辺りにまとまっているので、そちらをご覧ください。

## Looker Studio

2022年9月頃まで、Data Portalと呼ばれていたもので、レポーティングやデータの可視化に使う。
800以上のデータソースに接続でき、直感的な操作が可能。
通常版（Proじゃないやつ）の利用料は基本無料（ただし、データソース側に課金される場合あり）

詳細は、

* [Looker Studio: ビジネス分析の可視化 | Google Cloud](https://cloud.google.com/looker-studio?hl=ja)

をご覧ください。

# 前提条件

* 使用ユーザーにCloud LoggingやBigQueryに関する適切なロールが付与されていること（今回、オーナー権限のあるユーザーで実施しました）

# 手順

## 1. ログバケットの作成

まず、ログバケットを作成します。

(1) コンソールにて、「ロギング」（①） > 「ログストレージ」（②）の順でクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/80f16ff2-09f9-f63a-b315-32fbc9e6f23b.png)

(2) 「ログストレージ」の画面が開いたら、「ログバケットを作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/54e6a393-2da3-2de3-2d73-209c598b229e.png)

(3) バケットの詳細に必要事項を入力して（①）、「NEXT」をクリック（②）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/b9768c36-9ba7-57da-fcfb-591d466b253c.png)

### ①の入力内容詳細

| 項目名 | 入力内容 | 備考 |
|---|---|---|
| 名前 |任意の名前を入力（必須） |  |
| 説明  |説明を入力  |  |
| Upgrade to use Log Analytics  | チェックを入れる  |  |
|このバケットにリンクする新しいBigQueryデータセットを作成する  | チェックを入れる |「Upgrade to use Log Analytics」にチェックを入れると出現  |
|このバケットにリンクする新しいBigQueryデータセットを作成する  |任意の名前を入力（必須）  |  |

(4) ログデータの保持期間の設定を実施。プレビュー版のためか、30日から変更できず。そのまま「バケットを作成」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/96f3a6b7-3169-3af0-8515-034be4e76530.png)

## 2. ログ ルーティング シンクの作成

手順1で作成したログバケットに保管するログのルーティングを実施します

(1) 左ペインにて、「ログルーター」をクリックし（①）、「シンクの作成」をクリック（②）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/7b39282e-f34f-a1f3-77a1-12231940ad37.png)

(2) 「シンクの詳細」にて、「シンク名」（必須）と「シンクの説明」を入力し（①）、「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/82dddd98-22a7-cb23-2b79-6ff0b16250a3.png)

(3) 「シンクの宛先」にて、必要事項を選択し（①）、「次へ」をクリック（②）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/f340a13a-1f14-69a7-4d66-28c1bc98d6c4.png)

### ①の選択内容詳細

| 項目名 | 選択内容 |
|---|---|
| シンクサービスの選択（必須） | Cloud Loggingバケット  |
| ログバケットの選択（必須） |  手順1で作成したログバケット |

(4) 「シンクに含めるログの選択」にて、BigQueryのログ取得に関する内容を入力し（①）、「シンクを作成」をクリック（②）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/569084b2-e0cb-1300-d34a-b762bf792883.png)

### ①の入力内容詳細

| 項目名 | 入力内容 |
|---|---|
|包含フィルタの作成|resource.type = ("bigquery_project" OR "bigquery_dataset")|

### 補足事項

BigQueryの監査ログとして、「AuditData」と「BigQueryAuditMetadata」を使う方法とがありますが、前者のほうが古く、後者を使うことが推奨されているようです。
今回は上記に則り、「BigQueryAuditMetadata」を用いてログ収集することとしました。

### 3. BigQueryの確認

(1) ここで、「BigQuery」も見てみます。コンソールの左ペインにて、「BigQuery」（①） > 「SQLワークスペース」をクリック（②）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/e8ac1c4e-4d98-6d29-44c1-0638d7f259ef.png)


(2) 以下、対象プロジェクト下のデータセット一覧を表示した状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/5dcf5afb-0f7c-2ab1-24f5-fc547ed940b2.png)

①が従来版（監査ログとしては、「AuditData」を用いています）で、②が今回の手順で作成されたものです。
②のほうが構造も随分シンプルになっていますね。
そして、②は実体はログバケット上に存在するviewなので、リンクマークが付いています。



## 4. Log Analyticsからのクエリ発行

手順2までで、ログ収集の設定が一通り完了しました！
これによって、「Log Analytics」からログの分析クエリを発行できるようになります。なお、「Log Analytics」からのクエリ発行は無料とのこと！

簡単にですが、操作方法を書いておきます。

(1) 「Log Analytics」（①）> 作成したログをクリック（②）すると、デフォルトでクエリが出現するので編集し（③）、「クエリの発行」をクリック（④）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/b53733a9-9da6-de17-5bfa-297f1d226668.png)

いくつかコスト分析クエリも載せておきます。

### ①日別・ユーザー別でコストとクエリ実行回数を求める

以下、日別・ユーザー別でコストとクエリ実行回数を求めるです。
FROM句には、(1)にてデフォルトで出現したテーブル名を用いています。

```sql:
WITH logs AS(
 SELECT
  DATE(TIMESTAMP(JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata,"$.jobChange.job.jobStats.endTime")),"Asia/Tokyo") AS day,
  proto_payload.audit_log.authentication_info.principal_email AS email,
  cast(JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata, "$.jobChange.job.jobStats.queryStats.totalBilledBytes") AS int64) AS total_billed_bytes
 FROM
  `logs_test_log_analytics_2_US_000._AllLogs`
 WHERE
  JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata,"$.jobChange.job.jobConfig.type") = "QUERY"
  AND DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 6 day) <= DATE(TIMESTAMP(JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata,"$.jobChange.job.jobStats.endTime")),"Asia/Tokyo" -- 6日前以降（クエリ実行日を含め7日間）を対象)

)
SELECT
  L.day,
  SUBSTR(L.email,1,STRPOS(L.email,'@')-1) AS user,  -- emailだと長いので@移行をカット
  FORMAT('%9.2f',5.0 * (SUM(L.total_billed_bytes)/POWER(2, 40))) AS estimated_usd_cost,-- USリージョンの場合
  count(L.email) AS query_count
FROM
  logs L
GROUP BY
 L.day, L.email
ORDER BY
 L.day, L.email;
```

日付は日本時間（Asia/Tokyo）で算出しています
今回は6日前以降（クエリ実行日を含め7日間）を対象という条件も入れてみました

コスト（estimated_usd_cost）はUSリージョンベースとなっているため、データセットが他リージョンにある場合は、[BigQuery の料金 | BigQuery - Google Cloud](https://cloud.google.com/bigquery/pricing?hl=ja)を参照の上、数値の5.0（USリージョンの場合、クエリ実行料金は、5.00USD/TB）を適切な値に変更してください

### ②月別・ユーザー別でコストを求める

以下、月別・ユーザー別でコストを求めるクエリです。

```sql:
WITH logs AS(
  SELECT
   FORMAT_DATE('%Y/%m',DATE(TIMESTAMP(JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata,"$.jobChange.job.jobStats.endTime")),"Asia/Tokyo")) AS year_month,
   proto_payload.audit_log.authentication_info.principal_email AS email,
   cast(JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata, "$.jobChange.job.jobStats.queryStats.totalBilledBytes") AS int64) AS total_billed_bytes,
  FROM
   `logs_test_log_analytics_2_US_000._AllLogs`
  WHERE
   JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata,"$.jobChange.job.jobConfig.type") = "QUERY"
   AND DATE_TRUNC(DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 12 MONTH), MONTH) <= DATE(TIMESTAMP(JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata,"$.jobChange.job.jobStats.endTime")),"Asia/Tokyo") -- 過去12ヶ月前以降（当月含め過去13か月）
 )
 SELECT
   L.year_month,
   SUBSTR(L.email,1,STRPOS(L.email,'@')-1) AS user,
   FORMAT('%9.2f',5.0 * (SUM(L.total_billed_bytes)/POWER(2, 40))) AS estimated_usd_cost
 FROM
   logs L
GROUP BY
 L.year_month, L.email
ORDER BY
 L.year_month, L.email;
```

月別・ユーザー別でコストを求めるクエリです。
12ヶ月前以降（当月含め過去13か月）を対象としました。


## 5. Looker Studioでクエリコストをグラフ化

最後に、Looker Studioでクエリコストをグラフ化していきます。
Looker Studioは最近（2022年9月頃）まで、Google Data Portalと呼ばれていたものになります。

### 5-1. 月別・ユーザー別でクエリコストをグラフ化

まずは、月別・ユーザー別でクエリコストをグラフ化します。
今回は、12ヶ月前以降＋当月（当月含む13か月間）のコストをグラフ化する想定で進めます。
（手順4とは記載順序が逆ですが、ご容赦を）

(1) [Looker Studio](https://datastudio.google.com/u/0/?hl=ja)を開き、「空のレポート」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/b1d48ce9-35a9-e369-56f7-bcc1d60dcfc3.png)

(2) 「データのレポートへの追加」が開いたら、「BigQuery」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/eaf76631-451b-e934-e5d9-5ab0dc839b4b.png)

(3) 「カスタムクエリ」（①） > 対象プロジェクト と選択し（②）、「カスタムクエリを入力」にクエリを入力したら（③）、「追加」をクリック（④）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/1bd012f5-8065-b14e-ea56-7505264729f1.png)

#### ③の「カスタムクエリを入力」欄で入力するクエリ

以下、「カスタムクエリを入力」に入力するクエリです。

```sql:
WITH logs AS(
SELECT
  DATE(TIMESTAMP(JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata,"$.jobChange.job.jobStats.endTime")),"Asia/Tokyo") AS day,
  proto_payload.audit_log.authentication_info.principal_email AS email,
  cast(JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata, "$.jobChange.job.jobStats.queryStats.totalBilledBytes") AS int64) AS total_billed_bytes,
 FROM
  `test_log_analytics_2._AllLogs`
 WHERE
  JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata,"$.jobChange.job.jobConfig.type") = "QUERY"
  AND DATE_TRUNC(DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 12 MONTH), MONTH) <= DATE(TIMESTAMP(JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata,"$.jobChange.job.jobStats.endTime")),"Asia/Tokyo")
)
SELECT
  FORMAT_DATE('%Y/%m', L.day) AS year_month,
  SUBSTR(L.email,1,STRPOS(L.email,'@')-1) AS user,
  5.0 * (L.total_billed_bytes/POWER(2, 40)) AS estimated_usd_cost
FROM
  logs L;
```

ここで、

* FROM句には、BigQuery上でのデータセット＋テーブル名を入れる（手順1-(3)で入力、3-(2)で確認したものです）
* 集計、ソートは実施しない（GROUP BY＋SUM, ORDER BYはしない） → Looker Studio側で操作するため
* Looker Studio側で集計するため、estimated_usd_costのフォーマットは実施しない → フォーマットすると、string型になり、集計できなくなる

点、注意してください。

(4) レポート編集画面が開き、初期状態でひとつグラフが作成＆選択された状態になるので、そのまま右側の「グラフ」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/0a693d5a-933b-0075-750b-8480ab6ed001.png)


(5) 「積み上げ縦棒グラフ」を選択し（①）、その下「SETUP」タブを以下の通り編集します（②）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/c5f76ab8-7a4a-c9b9-4ba8-1725d8629048.png)

### ②SETUPタブの編集内容

| 項目名 | 選択内容 | 備考 |
|---|---|---|
| ディメンション | year_month |  |
| 内訳ディメンション |  user |  |
| 指標 |  estimated_usd_cost| デフォルトでSUMが選択される（はずな）ので、そのままにする |
| 並べ替え |  year_month / 昇順 | グラフ横軸のソート順 |
| 予備の並べ替え |  estimated_usd_cost / 降順 | グラフ棒内（?）の並べ替え。<br?>左記の設定で使用料の高いユーザーが下に来る |

(6) (5)で選択した内容はデフォルトで、カスタムクエリのカラム名になっているので、必要に応じて編集するとよいでしょう。
カラム名左側のデータタイプ（?）の部分にカーソルを合わせると鉛筆マークが出るので、クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/5b42cec5-7db5-08b2-ac57-a4c32487691b.png)

(7) 「名前」欄に表示させたい名前を入力します。また、「集計方法」を変更したい場合もここを編集すればOKです。
今回は後続の手順で、グラフのY軸を「推定コスト（USD）」としたいので、そのように編集しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/0867c88e-6b2f-a573-4636-3e4c94976b94.png)

(8) 「スタイル」タブをクリックし、「左Y軸」の「軸タイトルを表示」をクリック。
すると、(7)で編集した内容がY軸に表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/7f78e9fe-32b8-33ad-d294-ad0b71773b47.png)



(9) 一通り編集した後の画面です。グラフタイトルも編集して、「ユーザー別BigQueryコスト」としてみました。
作成直後でデータ量が少ないため、不格好になってしまっていますが、月が変わればもう1本右隣に縦棒が出るはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/9ebe7f7c-bedb-382a-3d57-5cd89df98e93.png)

### 補足事項

2022年11月1日現在では、手順1-(4)の通りログの保持期間が30日から動かせないので、表示されたとしても2か月分までになります（しかも、日がたつと期限を向かえ、前月分がどんどん減っていく可能性あり）。
それ以上のログを取りたい場合は別途データを保持する仕組みを構築するか、後続のリリースを待つかどちらかでしょうか。
なお、ログの保持期間が30日を超える場合には0.01USD/GiBのストレージ料金がかかるので注意しましょう。


### 5-2. 日別・ユーザー別でクエリコストをグラフ化

続いて、日別・ユーザー別でクエリコストをグラフ化します
今回、当日を含む過去7日間（6日前以降）のデータを表示することとします

(1) Looker Studioの編集画面にて、「データを追加」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/5fb495fe-c3a3-f328-eaae-5cec42cf1f97.png)

(2) 「データのレポートへの追加」が開くので、「BigQuery」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/25a97fc9-a1ec-bce6-0730-35070f10f551.png)


(3) 「カスタムクエリ」（①） > 対象プロジェクト と選択し（②）、「カスタムクエリを入力」にクエリを入力したら（③）、「追加」をクリック（④）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/e80683d9-457b-9028-fc45-ef7d97d42c22.png)


#### ③の「カスタムクエリを入力」欄で入力するクエリ

以下、「カスタムクエリを入力」に入力するクエリです。

```sql:
WITH logs AS(
  SELECT
   DATE(TIMESTAMP(JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata,"$.jobChange.job.jobStats.endTime")),"Asia/Tokyo") AS day,
   proto_payload.audit_log.authentication_info.principal_email AS email,
   cast(JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata, "$.jobChange.job.jobStats.queryStats.totalBilledBytes") AS int64) AS total_billed_bytes,
  FROM
   `test_log_analytics_2._AllLogs`
  WHERE
   JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata,"$.jobChange.job.jobConfig.type") = "QUERY"
   AND DATE_SUB(CURRENT_DATE('Asia/Tokyo'), INTERVAL 6 day) <= DATE(TIMESTAMP(JSON_EXTRACT_SCALAR(proto_payload.audit_log.metadata,"$.jobChange.job.jobStats.endTime")),"Asia/Tokyo")
 )
 SELECT
   L.day,
   SUBSTR(L.email,1,STRPOS(L.email,'@')-1) AS user,
   5.0 * (L.total_billed_bytes/POWER(2, 40)) AS estimated_usd_cost
 FROM
   logs L;
```

(4) レポート編集画面に戻ったら、「グラフを追加」をクリックし（①）、「積み上げ縦棒グラフ」を選択（②）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/e39fd83b-211d-be2b-f7fe-fb577e83a97e.png)

(5) 初期状態だと想定の内容でないので、編集していきます。画面右方の「グラフ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/bf1d7da0-2481-c841-3499-e3a87d470304.png)


(6) 「SETUP」タブにて、以下の通り項目の編集を行い（①）、必要に応じて、選択内容の名前変更や、グラフの軸の表示設定も実施しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/6a4bb2a6-f6a1-f411-6115-db0630936d5d.png)

### ①SETUPタブの編集内容

| 項目名 | 選択内容 | 備考 |
|---|---|---|
| 期間のディメンション | day | 月別のグラフと違いフォーマット(string型になる）していないからか、この項目も出現する |
| ディメンション | day |  |
| 内訳ディメンション |  user |  |
| 指標 |  estimated_usd_cost| デフォルトでSUMが選択される（はずな）ので、そのままにする |
| 並べ替え |  day / 昇順 | グラフ横軸のソート順 |
| 予備の並べ替え |  estimated_usd_cost / 降順 | グラフ棒内（?）の並べ替え。<br/>左記の設定で使用料の高いユーザーが下に来る |

(7) データの更新頻度も編集してみます。画面いちばん右側の「データ」欄にて、「BigQueryカスタムSQL」（日別のほう: カラム名に「day」があるのですぐわかると思います）の左側のマークをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/0e341f1d-a5b1-194f-569e-e4c7a6c27ee1.png)

(8) 画面下方から、以下のようなモーダルが出現するので、「データの更新頻度」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/f7c1518c-17d0-4f7b-023d-98c5247a321e.png)

(9) 「デフォルトの更新頻度」は12時間なのですが、日別かつ当日分もできるだけリアルタイムで表示させたいので、もう少し頻繁に更新されるようにします。
今回は「時間ごと」を選択しましたが、状況に応じてそのまま（12時間）、あるいは、15分毎や4時間ごと、でもよいでしょう。
（手順: お好みの更新頻度のラジオボタンにチェックを入れ（①）、「データの更新頻度を設定」をクリック（②））

ただし、**更新頻度が高いほどBigQueryに対してクエリコストが発生する** 点は注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/f87f7581-703f-eb11-f31e-1d6d5a00ee37.png)

(10) 完成です！こちらもまだ1日分しかデータがなく、不格好な感じですが、日がたつと縦棒が増え、らしくなっていくはずです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/0d129783-2009-7ccd-e99e-dc7f4c36a9cb.png)

### 5-3. オマケ: 3日経過後

以下、作成から3日経過後のグラフです。随分それっぽくなりました（笑）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/88f17856-3d3d-89dc-70c2-e98d92ee340c.png)

# 終わりに

Log Analyticsの使い方としては、従来版と大きな違いはない印象でした。
低コストでエラーが発生しにくい点、魅力的ですね（個人的には、Log Analyticsのワークスペースからクエリ発行し放題なのが嬉しい！）

早くGAになってほしいです♪

※2023年1月17日追記:
　ページ:[ログ分析 | Cloud Logging | Google Cloud](https://cloud.google.com/logging/docs/log-analytics)によれば2023年1月17日現在も公開プレビュー版のままのようです。
　[Cloud Logging の料金概要| オペレーションスイート | Google Cloud](https://cloud.google.com/stackdriver/pricing#logging-pricing-summary)に「2023 年 3 月 1 日までは、ログの保持期間は 30 日間」とあるので、2023年3月あたりにGAにならないかなと期待。


# 参考

## Log Analyticsとは
* [Cloud Logging のご紹介 - BigQuery を活用した Log Analytics | Google Cloud 公式ブログ](https://cloud.google.com/blog/ja/products/devops-sre/introducing-cloud-loggings-log-analytics-powered-by-big-query)
* [BigQuery Export ユーザーの Log Analytics への移行 | Google Cloud 公式ブログ](https://cloud.google.com/blog/ja/products/data-analytics/moving-to-log-analytics-for-bigquery-export-users)
* [GoogleCloud のオペレーション スイートの料金 | オペレーションスイート - Google Cloud](https://cloud.google.com/stackdriver/pricing)
* [Looker Studio: ビジネス分析の可視化 | Google Cloud](https://cloud.google.com/looker-studio?hl=ja)

## 手順
### 2. ログ ルーティング シンクの作成
* [BigQuery audit logs overview | BigQuery - Google Cloud](https://cloud.google.com/bigquery/docs/reference/auditlogs)
* [Audit logs migration guide | BigQuery - Google Cloud](https://cloud.google.com/bigquery/docs/reference/auditlogs/migration)
* [Support the newer BigQueryAuditMetadata format #8 | teamdatatonic/looker-gcp-control](https://github.com/teamdatatonic/looker-gcp-control/issues/8)

### 5. Looker Studioでクエリコストをグラフ化

* [Looker Studio を使用したクイックスタート | BigQuery - Google Cloud](https://cloud.google.com/bigquery/docs/bi-engine-looker-studio?hl=ja)
* [Looker Studio を使用してデータを可視化する | BigQuery - Google Cloud](https://cloud.google.com/bigquery/docs/visualize-looker-studio?hl=ja)
* [GoogleCloud のオペレーション スイートの料金 | オペレーション スイート - Google Cloud](https://cloud.google.com/stackdriver/pricing)
* [データの更新頻度を管理する | データポータルのヘルプ](https://support.google.com/looker-studio/answer/7020039?hl=ja)
* [BigQueryのコスト可視化ダッシュボードを10分で作る | 下町柚子黄昏記 by @yuzutas0](https://yuzutas0.hatenablog.com/entry/2018/12/18/160000)