本記事に入る前の イントロ 部分
※実際のgostenoの内容部分が割と薄いのと、とある人から遊び心が大事なことを思い出させて頂いたので
別の方向に時間をかけてしまいました。
今日の内容は以下からになります!
stenoとはCloud Foundry v2で出力されるログを見やすく整形可能なツールです。
v2コンポーネントのcloud_controller_ng等のログは
以下の様にtimestampが読みにくい形式で出力される為、いつ起きたログかがぱっと判別できません。
"timestamp":1386020857.104917
stenoを使うと以下の様に表示されます
2013-12-03 06:47:37.104917
stenoの実装はrubyで書かれている為、多量のログを変換すると時間がかかってしまいます。
gostenoは名前の通りGo言語で実装されている為、ruby版に比べて高速に変換が可能と推測されます。
今回の『Cloud Foundry Advent Calendar 2013』のネタを考えている際に、
比較的最近のCloud Foundryのコンポーネントの流れが
Go言語に流れつつあるという事でgostenoを選びましたが
以下を参照すると2012年の9月から存在していたようで
実はあまり新しくないのですが、Cloud Foundryにおける
Go言語の利用例という事で紹介させて頂きます。
https://github.com/cloudfoundry/gosteno/graphs/code-frequency
まずはgostenoのバイナリを作成する為に、go環境を整備していきます。
比較的簡単に導入可能なgvm(Go Version Manager)を使用します。
この際に、GroovyやGrailsのバージョン管理ツールのgvm(GVM the Groovy enVironment Manager)が
導入済みの環境ですと「既にgvmは導入です!」と怒られてしまうので注意が必要です。
※私の場合はすべてgo版のgvmをgovmに書き換えて実行可能なようにしましたが、更新追従が大変なのでおすすめできません。
Go Version Manager
https://github.com/moovweb/gvm
GVM the Groovy enVironment Manager
http://gvmtool.net/
事前に以下のパッケージをインストールします。(本手順はubuntu 12.04LTSにて実施しています)
sudo apt-get install curl git mercurial make binutils bison gcc
インストールスクリプトの実行
bash < <(curl -s https://raw.github.com/moovweb/gvm/master/binscripts/gvm-installer)
.bash_profile等に以下の設定を記述します。
export PATH=$PATH:$HOME/.gvm/bin [[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm"
gvmの動作確認としてversion表示が可能かを確認します。
$ gvm version Go Version Manager v1.0.19 installed at /home/morika-t/.gvm
※出力されない場合は、.bash_profile等に追加した状態でコンソールを再ログインします。
gmv listallで利用可能バージョン確認します。
$ gvm listall gvm gos (available) go1 go1.0.1 go1.0.2 go1.0.3 go1.1 go1.1.1 go1.1.2 go1.1rc2 go1.1rc3 go1.2 go1.2rc2 go1.2rc3 go1.2rc4 go1.2rc5 release release.r56 release.r57 release.r57.1 release.r57.2 release.r58 release.r58.1 release.r58.2 release.r59 release.r60 release.r60.1 release.r60.2 release.r60.3
最新版のgo1.2をinstallします。
$ gvm install go1.2 $ gvm use go1.2 Now using version go1.2 $ go version go version go1.2 linux/amd64
go getコマンドでソースを取得します。
$ mkdir gosteno $ cd gosteno $ export GOPATH=$PWD $ go get -u github.com/cloudfoundry/gosteno
go installでバイナリファイルの作成をします。
$ go install ./... $ ls bin pkg src $ ls bin/ gosteno-prettify
PATHを通してgosteno-prettifyを実行します。
$ export PATH=$PATH:~/gosteno/bin $ gosteno-prettify cloud_controller_ng.log
検証用のログファイルとして以下を使用します。
$ ls -lh cloud_controller_ng.log -rw-r--r-- 1 morika-t morika-t 22M 2013-12-04 15:40 cloud_controller_ng.log
比較のためにruby版のstenoも準備します。
$ gem install steno $ rbenv rehash #こちらの手順はrbenvを利用している場合のみ $ steno-prettify -h Usage: steno-prettify [OPTS] [FILE...] Parses json formatted log lines from FILE(s), or stdin, and displays a more human friendly version of each line to stdout. Examples (shamelessly stolen from `man cat`): steno-prettify f - g Prettify f's contents, then standard input, then g's contents. steno-prettify Prettify contents of stdin. Options: -h, --help Display help -a, --align Omit location and data in order to provide well-aligned logs -s, --no-messages Donot complain about errors in parsing logs
$ time steno-prettify cloud_controller_ng.log
real 0m13.417s user 0m10.645s sys 0m1.632s
$ time gosteno-prettify cloud_controller_ng.log
real 0m8.688s user 0m5.508s sys 0m0.488s
$ time steno-prettify cloud_controller_ng.log > cc-steno.log
real 0m10.141s user 0m9.609s sys 0m0.496s
$ time gosteno-prettify cloud_controller_ng.log > cc-gosteno.log
real 0m5.653s user 0m5.436s sys 0m0.232s
ファイルサイズを確認すると、同じログファイルを使用したはずにも関わらずログのファイルサイズが微妙に異なりました。
ls -lha cc-*.log -rw-r--r-- 1 morika-t morika-t 10M 2013-12-07 13:57 cc-gosteno.log -rw-r--r-- 1 morika-t morika-t 14M 2013-12-07 13:55 cc-steno.log
元のログとgosteno及びstenoの出力したログを比較すると以下の様に微妙に異なっている事が判明しました。
{"timestamp":1386020857.104917,"message":"Token received from the UAA nil","log_level":"info","source":"cc.api","data":{"request_guid":"613dfd6d-71a9-444d-a74e-4d9d28c3058f"},"thread_id":37135880,"fiber_id":54926040,"process_id":21068,"file":"/var/vcap/packages/cloud_controller_ng/cloud_controller_ng/lib/cloud_controller.rb","lineno":74,"method":"decode_token"}
gostenoの出力したログ
INFO 2013-12-03 06:47:37 cloud_controller.rb:0:decode_token {"request_guid":"613dfd6d-71a9-444d-a74e-4d9d28c3058f"} Token received from the UAA nil
stenoの出力したログ
2013-12-03 06:47:37.104917 cc.api pid=21068 tid=c6ff fid=ed0c lib/cloud_controller.rb/decode_token:74 request_guid=613dfd6d-71a9-444d-a74e-4d9d28c3058f INFO -- Token received from the UAA nil
- 想定通りgostenoはstenoに比べて高速
- 若干の出力フォーマットの違いも関係しているとは思いますが
- 環境ごとにgemをインストールするよりも1つバイナリを作ってしまえば利用する際に手軽
という事でgosteno-prettifyの紹介を終わります。