PlanetScale + trocco + Looker Studio で GitHub issues の可視性を向上させる。前編

# 前書き
## 対象読者
* GitHub issues / projects でタスク／プロジェクト管理をおこなっている
* GitHub 上の UI だけでは十分に issues / projects のヴィジュアライズが満足できない
* 以下の後編記事からやって来た人

https://qiita.com/Hi_Noguchi/items/f6b3e49d78b4b1aefaf4

## 自己紹介
* 株式会社きみよりで代表をしています 野口啓之 / Hiroyuki Noguchi / Hi-Noguchi です
* プロジェクト管理に GitHub issues / projects を使うのが好きです

https://kimi-yori.co.jp/

## what ?
### PlanetScale
* MySQL 互換のサーバーレスなクラウドデータベース
* フリーでかなり使えるのがありがたい

https://planetscale.com/

### trocco
* 日本のサービス！
* データのパイプラインツール
* 要は、あっちのサービス内にあるデータを、こっちのサービスへ移動させるために用いられる

https://trocco.io/lp/index.html

### Looker Studio
* 旧称 Google データポータル
* いわゆる BI ツール
* データソースを元にグラフ化したり集計したりすることができる

https://cloud.google.com/looker-studio?hl=ja

# 準備
## PlanetScale
### アカウント作成
* `Get Started` からフォームに入力して作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/93c86ec9-6449-a7a6-f89f-91950b024129.png)

* その後、メール認証を経て完了

### データベース作成
* 分かりづらいですが、下の方に `create` という文字リンクがあるので、そこからデータベースを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/51b9ccdf-2587-9e91-02c8-8b55d4d8f25b.png)

* DB 名とリージョンを選択して進めます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/caf29793-2fce-374f-1688-376a39d26298.png)

* しばらく初期設定中に……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/aac9d748-c53e-63f9-c9fb-7a59a8bd6fda.png)

* `Initializing` の表示が消えたら準備完了。いったんここまで

## trocco
### アカウント作成
* `無料ではじめる` ボタンより進んでアカウント発行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/53a74478-9063-7b83-3a6f-65b009fa91e6.png)

* ただ、その場ですぐに使えるようにならないというのがネック……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/822e7de4-4179-9136-6b45-6bec8d40fbbc.png)

* 私の場合、上記が表示されてから 10 分程度で発行されました。よかった
* パスワードを設定して初回ログイン完了

### 転送元と転送先の設定
* メニューから `転送設定` を選び、まずは `転送先` を選びます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/81d1b2f5-03ee-d45e-405a-d6d15c4a516a.png)

* たくさんの候補がある中から `GitHub GraphQL API` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/a8533508-7c2c-d11e-cf4a-0330689864c1.png)

* 続いて転送先として `MySQL` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/696b629d-f6de-6fe7-9e9e-4927c39ab01a.png)

### 転送元 GitHub の詳細設定
* この転送設定の名前を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/663115fa-dacb-6176-a3da-6a3f097ac3b4.png)

* GitHub 接続情報はまず右にある `接続情報を追加` から `Personal access token` を登録
  * GitHub の `Personal access token` は以下より発行できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/f23db838-22a0-46a8-7902-60d1b132ad26.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/601ca898-d379-46b3-67f2-a8712fc509bd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/476f7658-0d53-0d36-1d09-3afd7aa82264.png)

* 追加した後で `接続情報を読み込む` を押すと、プルダウンで追加したものが選べるようになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/4ba2b425-0bd4-0fec-b2af-b248d33a3a17.png)

* デフォルトでは以下のようなクエリが書かれていて、そのままでも動いてくれるのですが……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/18527e2c-590d-affa-6b12-1ed0fddb343d.png)

* 以下のドキュメントページに、他の例も表記されています。いずれにせよ `organization` と `repository` の値を書き換える必要はあります

https://documents.trocco.io/docs/data-source-github-graphql#%E8%A8%AD%E5%AE%9A%E4%BE%8B

* 今回は以下ドキュメントより `Repository配下の全Issues取得（ページネーション利用）` クエリを拾ってきます

https://documents.trocco.io/docs/data-source-github-graphql#repository%E9%85%8D%E4%B8%8B%E3%81%AE%E5%85%A8issues%E5%8F%96%E5%BE%97%EF%BC%88%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%88%A9%E7%94%A8%EF%BC%89

* 次からの `取り込み対象のパス(JSON Path形式)` についても、上記から拾ってきた値を入れて進めましょう
* ドキュメントでページネーション機能を使うとされているので、そこもドキュメントに記載のパスをそれぞれ拾ってきて埋めます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/3119d6a4-8ff4-aacb-6326-54d47288697c.png)

* ここで厄介なのが、`接続を確認` ボタンを押した時の挙動です。以下のようなエラーが表示される場合がありますが、これは実際にページネーションを必要としない程度しか issues の件数が無い場合に表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/111531fc-fe96-0035-7272-40e4c9118cc7.png)

* このとき、ページネーションを `無効` にすれば正常になります。ページネーションを有効にするのは、件数が増えた後にするのが無難でしょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/39eed403-1206-6ea0-b168-7b6dc1e5c7a8.png)

* また、もしここでページネーションを `無効` にしても何らかのエラーが出る場合、GitHub 側の Personal access tokens で許可しているスコープの範囲が狭い可能性がありますので、そこを見直すとよいでしょう


### 転送先 MySQL の詳細設定
* 続けて MySQL について、同じく右側にある `接続情報を追加` ボタンより

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/10837a0d-06ec-40da-42c0-7aa46beb3ebd.png)

* さて PlanetScale への接続方法ですが PlanetScale 側の管理画面に移動し、画面右側にある `connect` を押してモーダルを表示させます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/30c8cc0e-ba6f-805c-bbe5-592a4cc38579.png)

* するとモーダル内で初回に `username` `password` が表示されるので、特にパスワードについては手元に控えておきます
  * パスワードは以後非表示になります。失念すると、リセットすることでしか対応できませんので要注意
* あとは `Connetct with` で `MySQL CLI` を選ぶと、その下に接続用のコマンドが表示されるので、そこから Fivetran へ登録するために必要な情報を取ってきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/2854ed46-35a6-ab2b-3cbe-6b874ff89d90.png)

* また trocco の画面に戻ってきたら PlanetScale への接続情報を入力して進めます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/5bcf13da-f510-4867-a5e0-94e8aa97ac99.png)

* SSL は `有効` ですが鍵情報などは空欄のままで大丈夫です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/5f581612-f35e-fa21-ec62-fb6c8f3c0c64.png)

*`接続情報を読み込む` を押した後、プルダウンで選べるようになっていればヨシです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/3313e9dd-61b7-b1f1-a86a-a0db4f33f885.png)

* データベースが読み込めていれば接続できたということですね。テーブルは、存在しなければ勝手に作成してくれるということで `github_issues` などとしておきます。転送モードは任意で。ここでは `UPSERT` にしました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/ad6b36db-0a93-2c1f-898d-81db05297f01.png)

* 念のため右下の `接続を確認` ボタンでチェック。問題なし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/5bd6f789-ef8d-3d86-02b5-19b2cdf82a8d.png)

### データプレビュー
* 次へ進むと以下のようにプレビューが用意されようとするのでしばらく待つと……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/a5b3866b-28c5-4c8a-b0e1-c508975cc7d1.png)

* 以下のように表示されます
  * ここで失敗する場合、何らかのエラーメッセージが表示されるので、そのメッセージに従って前の画面に戻って対応されるとよいでしょう
  * 実際、私もエラーに遭遇したことがあるのですが Embulk のエラーメッセージが表示されていたので trocco は内部で Embulk 使ってるんだなーと知りました。実際に公式紹介記事もありました

https://blog.trocco.io/glossary/embulk

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/2d7dfd07-d18d-373b-dfab-e978dcfbfbbe.png)

### カラム定義
* 転送の際に json カラムを個々のカラムへと展開することも設定できるようです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/2210f09b-b01d-8463-9137-7b79d32bfb77.png)

### GitHub GraphQL クエリの作り込み

* せっかくここまでできるなら、GitHub GraphQL API でもう少ししっかり取得する値を選定しておきたいですね。では、どのような値を取ってこられるのでしょうか。以下で一覧が確認できます

https://docs.github.com/ja/graphql/reference/objects

https://docs.github.com/ja/graphql/reference/interfaces

* さらにこれを、エクスプローラーで叩きながら探り当てるということもできます

https://docs.github.com/ja/graphql/overview/explorer

* このあたりを参考にしつつ GraphQL のクエリを以下のように組んでみます。最初に取り込んだ後で現実的に日々回すのは `last: 20` 程度で十分でしょう

```graphql
query($__trocco__githubEndCursor__:String){
  repository(owner: "org name", name: "repo name") {
    issues(last: 20, after:$__trocco__githubEndCursor__) {
      edges {
        node {
          number
          title
          author {
            login
          }
          assignees(first: 10) {
            nodes {
              login
            }
          }
          labels(orderBy: { direction:ASC, field: NAME }, first: 10) {
            nodes {
              name
            }
          }
          milestone {
            title
            dueOn
          }
          projectsV2(first:10) {
            edges {
              node {
                title
              }
            }
          }
          repository {
            owner {
              login
            }
            name
          }
          state
          url
          createdAt
          updatedAt
          closedAt
        }
      }
      pageInfo {
        endCursor
        hasNextPage
      }
    }
  }
}
```

### ふたたびのデータプレビュー
* 以下のような感じで、設定したものが取得できるようになりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/f93ab402-68ef-8b36-ada9-850ac8987a91.png)


### ふたたびのカラム定義
* ということで転送先の MySQL に格納されて欲しいカラム定義をしていきます。以下のように

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/c3561310-8680-5c92-9014-7bcc22aa9d95.png)

* 日付フォーマットの要注意点として、デフォルトでは `%Y-%m-%d %H:%M:%S` が選択できるようになっているのですが、GitHub から渡されるのが `%Y-%m-%dT%H:%M:%SZ` であるため、このようにします。タイムゾーンも `Asia/Tokyo` にするとよいでしょう

* 以下のように最後まで設定を終えたら `変更をプレビュー` ボタンを押します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/2dbe3ed1-7abd-0b90-435b-a911418239d2.png)

* すると先ほどは json 形式で読みづらかったプレビューのところが、おこなったカラム定義に基づいた表形式として表示されてくれます
  * label のところが空なのは、何もラベルを貼っていないため……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/10f74b06-0bd7-657e-3624-50d4486e2836.png)

* 基本的にはこれだけで大丈夫ですが、他にも細かい転送設定ができます。たとえば転送日時を格納させるとか。設定する場合は以下のように

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/a3ebfea9-39e8-7343-753c-134e35f547c7.png)

* あとは確認画面を経て保存して完了となります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/e7bc83d8-3d8d-f7e7-4bf4-8d9ce99b7c3c.png)

### trocco 側で実行テスト
* それではこれがうまく動作するかテストしてみましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/0d474beb-6e0e-64d7-19d8-c24ec4f897bb.png)

* 実行ログがリアルタイムに表示されるので、それをしばらく見守っていると、完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/0ea007f7-60a1-e01f-0070-d36f977cdce3.png)

### PlanetScale 側で確認
* 本当にカラムが作成されてレコードが転送されたかどうか PlanetScale 側で確認してみます
* console からまずは `show tables;` でテーブルを見てみると、確かにテーブルが作成されているようです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/bbcf1cea-fcc5-3563-edc9-30cc99840c38.png)

* `select * from github_issues;` で中身を確認してみると、確かにレコードが格納されていますね。最後に追加した転送日時 `transferred_at` もカラムとして存在しています
  * 時刻がズレてるのは PlanetScale 側の設定ですね……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/1692f0b0-90f7-9151-3c39-7424518355d6.png)

* ということで、GitHub issues のデータが trocco を介して PlanetScale MySQL テーブルに入ってきました！　あとはこれを Looker Studio で読むようにします！

## Looker Studio
* ……が、こちらは以下の後編記事に回します！

https://qiita.com/Hi_Noguchi/items/f6b3e49d78b4b1aefaf4

# 後書き
## 雑感
* 本当は前後編に分けるつもりはなかったのですが、 trocco / Fivetran で苦戦して準備編に時間がかかりすぎましたので、分けます

## 後編へ
* いかきじへ続く……！

https://qiita.com/Hi_Noguchi/items/f6b3e49d78b4b1aefaf4

# おまけ
## 前置き
* はじめは trocco でなく Fivetran で試そうとしてみたのですが、撃沈しました
* 撃沈した記録を、後世のために書き残しておきます

### Fivetran とは
* データのパイプラインツール
* 要は、あっちのサービス内にあるデータを、こっちのサービスへ移動させるために用いられる

https://www.fivetran.com/

## Fivetran
### アカウント作成
* `Start free` というボタンからおこないます
* Google アカウントを用いるか、フォームに従って入力を進めてアカウント作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/6ddc4bc7-63ba-69e4-e664-f314d9239acb.png)

### GitHub を利用
* はじめにデータソースを選ぶことになるので GitHub を選んで進めます
* GitHub との連携方法には `OAuth` を選んでおくのが無難でしょう
* GitHub 側の認証画面では Fivetran からのアクセスを受け付ける organization を選んで `Grant`
* 認証に成功すると以下のような画面になります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/72367b41-ca63-eee7-e9b4-32ea8e4d2087.png)

* 同期するリポジトリの範囲や `Webhook` の利用、デプロイ先のロケーションとクラウドベンダーをどれにするかなどはお好みで
  * ここでのロケーション／クラウドベンダーは、自前の環境とは関係なく、クラウドサービスとしての Fivetran がどこにデプロイされるかを選ぶだけのもよう
  * なので、連携させたいサービスのロケーションに近いところを選ぶとよいでしょう
  * 普段は AWS 使っているけれどここでは GCP を選ぶ……みたいなことをしても、特に問題はない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/8daaa4da-0f2b-0200-9fe8-37e25d560dce.png)

* 先へ進むとしばし待ちになり……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/d3bb383f-2639-2b51-aa4a-5244c233b91b.png)

* こんな感じで全部通過したらさらに先へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/b22c8b0d-271b-15d3-2fdf-d5f7c361daf8.png)


### PlanetScale へ接続
* データの転送先として `MySQL` を選びます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/4df41834-0ae1-fa44-8c62-70b37c51b6b4.png)

* 赤字で注意書きが出ていますね……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/781c2a04-ae13-f1b2-0a1b-178350dd71ac.png)

* DeepL さんによると、以下とのこと。それはそうですね、はい

> MySQLデータベースは、中程度のデータ量でも基本的なクエリを実行できないことがあり、データウェアハウスとして適切ではありません。弊社では、MySQLをテスト環境としてサポートしています。これらの制限に遭遇した場合、サポートされているデータウェアハウスに移行する必要があります。

* さて PlanetScale への接続方法ですが PlanetScale 側の管理画面に移動し、画面右側にある `connect` を押してモーダルを表示させます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/30c8cc0e-ba6f-805c-bbe5-592a4cc38579.png)

* するとモーダル内で初回に `username` `password` が表示されるので、特にパスワードについては手元に控えておきます
  * パスワードは以後非表示になります。失念すると、リセットすることでしか対応できませんので要注意
* あとは `Connetct with` で `MySQL CLI` を選ぶと、その下に接続用のコマンドが表示されるので、そこから Fivetran へ登録するために必要な情報を取ってきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/2854ed46-35a6-ab2b-3cbe-6b874ff89d90.png)

* また Fivetran の画面に戻ってきたら PlanetScale への接続情報を入力して進めます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/781c2a04-ae13-f1b2-0a1b-178350dd71ac.png)

* ……怒られました。PlanetScale の `innodb_buffer_pool_size` デフォルト値が小さいからダメとのこと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/b8ad74bb-782d-1a8d-f014-33ba06a35145.png)

* PlanetScale 側で確認してみると、確かにその値

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/1d48ba7f-5788-7153-7efa-46ca6a6b3506.png)

* 変更を試みるも……そもそも割り当ての総容量が低い free プランなのでダメだった……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/9572670d-6615-c322-060c-b0e65e5cfd9b.png)