→ sters/ltsvq: ltsvq is LTSV Queryer that written in Go
Labeled Tab-separated Values (LTSV) なアクセスログのデータをパースし、少しだけ複雑な条件で集計する必要があった。 ELKStackなんかで集計する仕組みを整えて構築するよりも、さくっとできるソリューションでよかった。 ぱっと調べても便利に使えそうなのはなさそうに見えたので、ぱっとひらめいたアイデアで行けるかどうか、おためし的に作った。
実装は GitHub - Songmu/go-ltsv と GitHub - mattn/go-sqlite3: sqlite3 driver for go using database/sql がほぼすべて。 パースした結果を SQLite にオンメモリで入れて、リクエストされたクエリを実行し、取れたものを再び LTSV になおして出力する。 SQLite でできることはできるので、絞り込みも並び替えも、集計だってできる。
と、まあ作ること自体はすぐだったのだが GitHub - goreleaser/goreleaser: Deliver Go binaries as fast and easily as possible でリリースを作ろうとしたら数時間積んでいた。 色々調べた結果、必要なライブラリが詰まった Docker イメージを準備し、その上でスタティックリンクになるように ldflags を指定してビルドするのが正解らしい CGO も効いているはず、きいてないと mattn/go-sqlite3 が動かんのでは…?
このあたり cmd/go: build: add -static flag · Issue #26492 · golang/go
ストリーミングなデータの tail -f みたいなずっと流れてくるデータをパイプして使うようなものは、どうしたらいいのかわからなかったので諦めてしまった。また今度挑戦してみよう。
追記: ググり方が悪かったようで lltsv なるものがすでにあることを教えてもらった。 GitHub - sonots/lltsv: List specified keys of LTSV (Labeled Tab Separated Values)
追記: trdsql というものもあるよ、と教えてもらった。