Cloud Bigtable用のインタラクティブCLI btcli を書きました

Posted on

これは Google Cloud Platform その2 Advent Calendar 2018 21日目の記事です。

作ったもの

インタラクティブUIを備えたcbtベースのBigtable用CLI btcli を作りました。

モチベーション

GoでClean Architecture導入とDual WriteによるDB移行をした話 にある通り、現在はBigtableをメインに使っているプロダクトで開発を行っています。Bigtableはチョッパヤでめちゃくちゃスケールするので非常に便利で僕も大好きなプロダクトです。 手元でBigtableのデータを読み書きするには公式で cbt というものが用意されていて、最低限必要なものは揃っています。 先の記事でも言及していますが、Bigtableのincrement関数を使うためには8byteビッグエンディアンにエンコードした値を使う必要があります。ところがcbtでは文字列としてでしか値を表示することが出来ません。内部的にはデータはbyteで保存されていて、型による区別がないため当然といえば当然ですが、人間が扱うときには少し困ります。

当初はビッグエンディアンのデコード機能をcbtにモンキーパッチを当てて使っていましたが、もう少しリッチなクライアントが欲しくなり作ったのが btcli です。ちなみに名前はmycliからインスパイアしました。

出来ること

インタラクティブな補完

ほぼ全て go-prompt のおかげで実装出来ています。

豊富なフィルタオプション

現在 read サブコマンドで以下のオプションが使用可能です。

read <table> [args ...]
        start          Start reading at this row
        end            Stop reading before this row
        prefix         Read rows with this prefix
        value          Read rows with has value
        family         Read only columns family with <columns_family>
        version        Read only latest <n> columns
        from           Read cells whose version is newer than or equal to this unixtime
        to             Read cells whose version is older than this unixtime
        decode         Decode big-endian value
        decode-columns Decode big-endian value with columns. <column_name:<string|int|float>[,<column_name:...>]

これだけあると大体の場合において事足りない感じがしています。全てのフィルタは網羅出来ていませんが、需要ベースで追加しているので、ここにないフィルタや機能があったらカジュアルに追加しています。もし欲しいものがあればissues, PRお待ちしております。

また冒頭に書いていたdecodeオプションもここに用意しています。 decode が全体設定、 decode-columns が個別設定でこちらのほうが優先度高い感じです。環境変数 BTCLI_DECODE_TYPE を設定することでデフォルトの decode オプションを指定することも出来ます。

出来ないこと

write系のコマンドは自分自身あまり使ったことが無いので実装していません。

インストール方法

go get で入ります。調子に乗ってmodule化したので環境変数 GO111MODULE が必須です。

go get -u github.com/takashabe/btcli/cmd/btcli

まとめ

インタラクティブUIを備えたcbtベースのBigtable用CLI btcli を作りました。

実際に仕事でも使っていて、チームでも好評なので作ってよかった感があります。まだまだやりたいことがあるので時間を見つけては開発を続けていきたいと思っています。 ユースケースが合致する方はぜひ使ってみてください!