Skip to content

Instantly share code, notes, and snippets.

@morika-t
Last active December 30, 2015 13:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save morika-t/7837810 to your computer and use it in GitHub Desktop.
Save morika-t/7837810 to your computer and use it in GitHub Desktop.
Cloud Foundry Advent Calendar 2013 12月7日(土) gosteno-prettifyをためす

本記事に入る前の イントロ 部分
※実際のgostenoの内容部分が割と薄いのと、とある人から遊び心が大事なことを思い出させて頂いたので
別の方向に時間をかけてしまいました。

今日の内容は以下からになります!

gosteno-prettifyをためす

stenoとは

stenoとはCloud Foundry v2で出力されるログを見やすく整形可能なツールです。

v2コンポーネントのcloud_controller_ng等のログは
以下の様にtimestampが読みにくい形式で出力される為、いつ起きたログかがぱっと判別できません。

"timestamp":1386020857.104917

stenoを使うと以下の様に表示されます

2013-12-03 06:47:37.104917

gostenoとは

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

go環境の準備

まずは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/

gvmのセットアップ

事前に以下のパッケージをインストールします。(本手順は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等に追加した状態でコンソールを再ログインします。

goのセットアップ

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

gostenoの準備

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

ruby版との速度比較その1(画面出力)

ruby版

$ time steno-prettify cloud_controller_ng.log

real    0m13.417s
user    0m10.645s
sys     0m1.632s

go版

$ time gosteno-prettify cloud_controller_ng.log

real    0m8.688s
user    0m5.508s
sys     0m0.488s

ruby版との速度比較その2(ファイル出力)

ruby版

$ time steno-prettify cloud_controller_ng.log > cc-steno.log

real    0m10.141s
user    0m9.609s
sys     0m0.496s

go版

$ 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の紹介を終わります。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment