[Looker] Looker Blocks™のGoogle Analytics 360で複数プロパティに挑戦 #looker

IZone関係
2020.10.01

Looker Blocks™のGoogle Analytics 360で複数のプロパティを使えるようにしようとしたところドロ沼にハマったので、調べて分かったことをまとめます。

Looker Blocks™のカスタマイズ

Looker Blocks™をインストールすると、read-onlyプロジェクトとwritableプロジェクトの2つのプロジェクトがインストールされます。この2つのプロジェクトは互いに依存関係にあり、何かしらユーザー側で手を加えたい場合にはwritableプロジェクトの方で書き換える必要があります。

これら2つのプロジェクトの存在や依存関係について知っていないと、カスタマイズする際にエラー地獄にハマってしまいます。(もうガッツリどハマりです・・・。)
今回は私がどハマりしたGoogle Analytics 360のLooker Blocks™で複数プロパティを設定する方法をご紹介します。

Google Analytics 360

インストール

Marketplaceからインポートすれば導入できます。

インストールする前に接続情報やスキーマ情報を記載すると、

2つのプロジェクトがインストールされます。

片方はread-onlyのためView LookMLと表示されています。また、メニューバーのDevelopのドロップダウンにはwritableのプロジェクトだけが表示されます。(最初はBlocksをインストールした際に2つのプロジェクトが作られることを知らなかったので、ものすごく混乱というか、、、混乱しました。)

また、インストール前に入力した接続情報などはread-onlyプロジェクトの方に記載されるため、GitHub上にread-onlyプロジェクトと、writableプロジェクトの両方が公開されていますが、gitからクローンする方法だとプロジェクトに必要な情報が書き込めなくなってしまいます。

複数プロパティに修正

インストール後のデフォルトの設定では1つのプロパティしか表示できないようになっているので、複数プロパティを表示できるようにga_sessions.viewを修正します。

コメントアウトしてあるsql_table_name(上画像21〜30行目)のコメントを外して、34行目のsql_table_nameをコメントアウトします。(command + /でコメントアウトできます。)

21〜30行目は何をしているかというと、manifest fileに記載している@{SCHEMA_NAME}.@{GA360_TABLE_NAME}を呼び出してUNIONしています。

ということは、manifestファイルに追加のスキーマ(プロパティ)を定義して、UNIONする箇所を書き換えればいいことになります。

例えば、最初に登録していたのがAndroidのプロパティで、iOSのプロパティを追加したい場合、manifestファイルにiOSのスキーマ情報を追記して、ga_sessions.viewファイルのsql_table_nameのUNIONする @{SCHEMA_NAME}をmanifestファイルに記載したものに変更します。

# manifest.lkml

##### 追記 #####
constant: SCHEMA_NAME_iOS {
  value: "bigquery-public-data.iOS"
}
# ga_sessions.view.lkml

sql_table_name:
  (
    SELECT *, 'Property1' as property
    FROM `@{SCHEMA_NAME}.@{GA360_TABLE_NAME}`
    WHERE *****)
    UNION ALL
    SELECT *, 'Property2' as property
    FROM `@{SCHEMA_NAME_iOS}.@{GA360_TABLE_NAME}`
    WHERE *****)
  );;
  
  dimension: property {
    hidden: yes
    suggestions: ["Android","iOS"]
    sql: CASE
          WHEN ${TABLE}.property = "Property1" THEN "Android"
          WHEN ${TABLE}.property = "Property2" THEN "iOS"
          ELSE NULL
        END
        ;;
  }

さらに、property dimensionのsuggestionssql"Website1","Website2""Android","iOS"にすれば完了です。

シンプルですね。

・・・とはならなかったんです。ここまでくるのに時間をジャブジャブ使ってしまいました。

どこで、何に躓いたのか?

read-onlyプロジェクトの存在を知らなかった

最初に混乱したのは、ga_sessions_config viewがextendしているga_sessions_core viewがプロジェクト内に存在しないことでした。(下画像4〜6行目)ga_sessions_core viewは、read-onlyプロジェクトの方に存在していたのですが、最初は2つプロジェクトが作成されていることを知らなかったので、このプロジェクトはどうやって動いているのだろうかと不思議に思いました。

(さらにwritableプロジェクトの方のmodelファイルには、extension: requiredと書かれたexploreしかなく、connectionパラメータも書かれていなかったので、さらに混乱してしまいました。)

manifestファイルのSCHEMA_NAME定数を書き換えてしまっていた

writableプロジェクトのmanifestファイルには予め2つの定数が定義されていました。

この定義を見て、SCHEMA_NAMEconstantのvalueを元のスキーマ情報に書き換えて、同じように追加したいgaプロパティのスキーマ情報をconstantで定義すればいいと思い、以下のように定義してしまいました。

このmanifestファイルに合わせてga_sessions.vewを書き換えて完成! と思ってExploreを開いたら...

エラーです。しかも3つも文句を言われています。

上の2つは同じようなことを言われていて、依存関係にあるmarketplace_new_google_analytics_360_configに定数をprovideせよというもの。ここで自分が触っていたプロジェクトと違う名前のプロジェクトが登場して、「むむむ」となりread-onlyプロジェクトの発見につながりました。

そしてこのエラーの原因は定数の定義にexport: orverride_requiredをつけてしまっていたことでした。

追加のスキーマ情報は、依存関係にあるプロジェクト(read-only)には定義されていないので、オーバーライドを要求されても優先させるものがないですよというエラーが出てしまうというわけです。

また、一番下のエラーは逆にread-onlyでexport: orverride_requiredとなっている定数SCHEMA_NAMEがwritableプロジェクトの方にオーバーライドさせるものがないというエラーです。

ようやくread-onlyプロジェクトの存在に気づいた私は、両者の複雑に入り組んだ依存関係を解明し、writableプロジェクトのmanifestファイルに元々定義されていた2つの定数を修正してはいけないのだと知りました。

また、追加のプロパティのスキーマ情報の定数にはexportサブパラメーターが不要だったことも気付きました。(コピペが大好きなもので、ドツボにはまりました。)

まとめ

今回は大変な思いをしたLooker Blocks™ですが、便利なのでまた別のBlocksを試してみようと思っています。