Glide Note

glidenote's blog

git filter-branchで過去commitのAuthorとメールアドレスを一括変更

社内SubversionからGitHubに移行するのにあたって、git-svnで移行処理を進めたんですが、 Subversion時代の

  • Author名
  • Authorのメールアドレス

をGitHubのものに合わせたくて修正方法を調べていたらgit filter-branchを利用すると良いとのこと。

私は下記のような形で一括変更。(Subversion時代のAuthor名はmaedaです)

Subversion時代の遺産も活用出来るようになりました。

参考

ワンランク上のGit使いになるために手元に置いておきたい「Gitポケットリファレンス」

下記3つはいずれもcommitの修正ですが、違いが分からない人は Gitポケットリファレンスを読むことをオススメします。(答えはGitポケットリファレンスに書いてあります。)

1
2
3
git reset --hard HEAD^
git commit --amend
git revert

以前書いたとおり社内SubversionリポジトリをGitHubへの移行中で GitHubへの本格移行する前に、「運用ルール決め」と「意識合わせ」の意味で 社内のインフラ系エンジニア向けに「Git、GitHub講習会」と銘打って勉強会を開催。

個人的にはGitHubも活用してて、Git自体も理解しているつもりだったんですが、 人に説明していると、理解があやふやな点が結構あることがわかったので、 先日発売されて、周りの評判も上々なGitポケットリファレンスを購入。

Gitの概念について説明している書籍は多数発売されていますが、本書はGitの一つ一つのコマンドについて 見やすく説明されているので、普段からGitをガンガン使っている人ほど手元に置いておくのが良いんじゃないかなーと思ったり。

特に複数人でのGit運用時に遭遇するであろうエラーとその対処方法について、 一つ一つ書いてあるので、GitHubに移行完了した後にかなり役に立ちそうな予感。

またgit-svnについても書いてあるので、いろいろ事情があってSubversionを使わざるを得ない人も 読むとある程度ストレスから解放されるんじゃないかと思います。(私がそうだったように)

Gitポケットリファレンスを手元に置いてワンランク上のエンジニアを目指しましょう!!1

fluentdのformat(正規表現)の作り方について試行錯誤中 #fluentd

Fluentdを触るようになって、いろんなログをfluentdに 渡すように試行錯誤している最中。

td-agent.conffluent.confを用意するときに任意のjson形式にするために 正規表現を用いてformatを書く必要があるんですが、formatの作り方というかデバック方法について どういう手順に作ると良いのか情報がネット上に見当たらず試行錯誤中。

もっと良い方法を教えてもらいたいので、今やっている方法を晒してみる。

そもそもの疑問、どうやってformatを作るのか

たとえばfluentd関連の情報を調べてると、

1
format /^(?<date>[^ ]+) (?<host>[^ ]+) (?<process>[^:]+): (?<message>((?<key>[^ :]+)[ :])? ?((to|from)=<(?<address>[^>]+)>)?.*)$/
1
format /^[^ ]+ [^ ]+ [^ ]+ [^ ]+ \[(?<time>[^\]]+)\] "(?<method>[^ ]+) (?<path>[^ ]+) [^"]+" (?<status>[^ ]+) [^ ]+ [^ ]+ "[^"]+" "[^"]+" (?<response_time>[^ ]+)$/

という感じで、formatの正規表現がサラッと書いてあって、 当然作れるでしょ的な感じでformatの作り方については言及されてない。 でも実際に作ろうとすると、どういう方法でやればいいのかよく分からない。

やりたいこと、squidのaccess.logをjson形式に

たとえば下記のようなsquidのaccess.log(squidのログ形式)をfluentdに渡して

1
1342297357.149    440 192.168.11.3 TCP_MISS/302 627 GET http://glidenote.disqus.com/count.js - HIER_DIRECT/75.126.109.204 text/javascript

下記のようにシリアライズしたい。

1
2
3
4
5
6
7
8
9
10
11
12
{
  "date"           : "1342297357.149",
  "duration"       : "440",
  "client address" : "192.168.11.3",
  "result code"    : "TCP_MISS/302",
  "bytes"          : "627",
  "request method" : "GET",
  "url"            : "http://glidenote.disqus.com/count.js",
  "rfc931"         : "-",
  "hierarchy code" : "HIER_DIRECT/75.126.109.204",
  "type"           : "text/javascript"
}

でもこれを実現するためのformatの作り方の手順を解説しているところが無い。(調べ方が悪いだけかもしれないですが)

最初にformat作成のためにやっていたこと(非効率な方法)

最初は

  1. confを修正
  2. 設定ファイル再読込
  3. 確認

というのを繰り返しやっていたんですが、非効率過ぎてこれだとformatを作る気にならず途中で断念。 というのが数ヶ月前の話。

今回format作成のためにやってみたこと

今回再チャレンジでいろいろ調べてみると有益な情報が。

fluent/parserの"RegexpParser"クラスを利用すればformat作成のデバッグが出来るらしい。

デバッグ用スクリプトの用意

上記サイトを参考に、下記のようなデバッグ用スクリプトを用意してlog,format,time_formatの部分を調整していく。 vim+quickrunとかの環境だと書きながらテストが出来るのでオススメです。 (外部ファイルを読み込ませる形より、log,formatを直接修正しながらテストしたほうが効率的でした)

いきなり全部のformatを書くのは無理なので、下記のような感じでログの一部ずつやっていく。 (今回の例だとtime_formatは利用していないので空のままです)

下記のような形でdateの項目だけ記載してシリアライズしてみる

意図した形式で出力された。

1
{"date"=>"1342297357.149"}

上手くいったら、durationなど1個ずつ項目を増やしてやっていく。

これを繰り返していくと、下記のような形で出来上がる。

これをconfに反映。とりあえずfile書き出しで様子見。(td-agent.confには=は必要無いので消す)

1
2
3
4
5
6
7
8
9
10
11
12
13
<source>
  type tail
  path /var/log/squid/access.log
  tag squid
  format /^(?<date>[^ ]+)\s+(?<duration>.*) (?<client address>.*) (?<result code>.*) (?<bytes>.*) (?<request method>.*) (?<url>.*) (?<rfc931>.*) (?<hierarchy code>.*) (?
<type>.*)$/
  pos_file /var/log/fluent/squid.pos
</source>

<match squid.**>
  type file
  path /var/log/fluent/squid.log
</match>

これでやりたいことが実現出来た。

もっと上手いやり方ありそうなんだけど、「こうすると良い」とか誰かもっと良い方法を教えて欲しい。

追記 2012年7月16日

@tagomorisさんがirbを利用する方法を教えてくれました。感謝です

追記 2012年10月01日

今だとこういう便利なものがあるようです!!

参考

GrowthForecast導入&Supervisorで起動を管理

社内にGrowthForecastブームが 来ているので、乗り遅れないように導入。

@do_akiさんのブログ記事にSupervisorでの起動方法を追加した内容です。 何回もググっているので自分の作業用メモも兼ねて。同じ事を2回ググったらブログに書く精神で。

導入環境はSL6.2です。作業の流れとしては

  1. Perlbrewの導入
  2. GrowthForecastの導入
  3. SupervisordでGrowthForecastを管理

という感じです。

GrowthForecastは下記のように管理します。

必要パッケージの導入

1
2
sudo yum -y groupinstall "Development Tools"
sudo yum -y install pkgconfig glib2-devel gettext libxml2-devel pango-devel cairo-devel

GrowthForecast用のユーザの作成

Perlbrewを導入するのでGrowthForecast用にユーザーを作成。パスワードも設定

1
2
sudo useradd growthforecast
sudo passwd growthforecast

Perlbrewとcpanmの導入

GrowthForecastの利用にはPerlbrewの利用が推奨されているので、perlbrewを導入。 growthforecastユーザのホームディレクトリ内に導入。

1
2
3
4
sudo su - growthforecast
curl -kL http://install.perlbrew.pl | bash
echo '[[ -s "$HOME/perl5/perlbrew/etc/bashrc" ]] && source "$HOME/perl5/perlbrew/etc/bashrc"' >> .bash_profile
source $HOME/perl5/perlbrew/etc/bashrc

続いてperl-5.16.0とcpanmの導入。結構時間がかかります。

1
2
3
perlbrew install perl-5.16.0
perlbrew switch perl-5.16.0
perlbrew install-cpanm

RRDtoolのインストール

2012年7月5日 10:00 追記

antipopさんに教えてもらい、現在はもう不要な手順です。 Makefile.plに含まれているので別途導入する必要はありません。

GrowthForecast/Makefile.PL at master · kazeburo/GrowthForecast https://github.com/kazeburo/GrowthForecast/blob/master/Makefile.PL

1
cpanm http://search.cpan.org/CPAN/authors/id/G/GF/GFUJI/Alien-RRDtool-0.03.tar.gz

GrowthForecastのインストール

引き続き作業はgrowthforecastユーザで。

cpanmでの方法に修正 2012年7月5日 13:00

@oranieさんからの指摘でcpanmの方法に修正。

1
cpanm -n http://cloud.github.com/downloads/kazeburo/GrowthForecast/GrowthForecast-0.30.tar.gz

GrowthForecastの動作確認

とりあえず起動確認。

1
growthforecast.pl --port=5125

hostname:5125にアクセスして表示されるか確認。 ちゃんと動いていたらctrl+cで終了。

Supervisordで管理

過去の記事を参考にsupervisord経由で GrowthForecastを起動する。

ここからはrootかsudoで作業します。

Supervisordの導入

1
2
3
sudo yum -y install python-setuptools
sudo easy_install pip
sudo pip install supervisor

supervisord用のlogとconfディレクトリの用意

1
2
sudo mkdir /var/log/supervisor
sudo mkdir /etc/supervisord.d

/etc/supervisord.conf の用意

Upstart経由でSupervisorを起動

supervisordが落ちたら元も子もないのでUpstart経由で起動。 /etc/init/supervisord.confを用意

1
sudo initctl start supervisord

/etc/supervisord.d/growthforecast.ini の用意

GrowthForecast用の設定を用意。(commandのところもっと上手い書き方知ってる人いたら教えてください!)

GrowthForecastのデータ用ディレクトリの作成

GrowthForecastデータ用ディレクトリも用意

1
2
sudo mkdir /var/run/growthforecast
sudo chown -R growthforecast:growthforecast /var/run/growthforecast

必要ディレクトリの権限設定

/tmp/.xslate_cache/に書き込み権限がないとエラーが出たので設定

1
sudo chown -R growthforecast:growthforecast /tmp/.xslate_cache/

Supervisord経由でGrowthForecastを起動

1
2
3
sudo supervisorctl add growthforecast
sudo supervisorctl start growthforecast
sudo supervisorctl status growthforecast

動作ログでエラーを吐いてないか確認。

1
tail /var/log/supervisor/supervisord.log  /var/log/supervisor/growthforecast.log

正常に動作していれば、GrowthForecastをkillしてみる。

1
sudo pkill -u growthforecast

を実行して、再度起動してくるか確認。
GrowthForecastがSupervisord経由で管理出来るように。

一通り作業を終えた後に@kazeburoさんがProcletというsupervisorを出していたことに気づいた。

とりあえず常駐化出来たので、fluentdを組み合わせてガンガン使っていこう。

Node.jsで書かれてwebベースのlog streamer「Supergrep」を試してみた

EtsyからNode.jsで書かれた、ブラウザから利用するlogs streamerのSupergrepが リリースされたので早速試してみました。

ツールとしては任意のログが、任意の不要なログを除いた形式で出力され、 そこからさらにブラウザ上で自分でフィルタをかけるようなツールです。

公式の説明としても、

1
tail -f {log filename} | grep -v {stuff you'd expect to see in log lines}

という感じの説明をしていて、解析に必要無いログは排除する設定が任意で出来て、表示されています。

導入環境はSL6.2です。

Node.jsの導入

SupergrepはNode.jsで書かれているので、Node.jsとnpmを導入。 2012年6月29日現在の最新版v0.8.0を導入

1
2
3
4
5
6
7
8
mkdir ~/src
cd ~/src
wget http://nodejs.org/dist/v0.8.0/node-v0.8.0.tar.gz
tar zxvf node-v0.8.0.tar.gz
cd node-v0.8.0
./configure
make
sudo make install

npmの導入

1
2
3
sudo -s
curl http://npmjs.org/install.sh | sh
exit

Supergrepの導入と起動

とりあえずデフォルトのまま起動。

1
2
3
4
5
6
mkdir ~/repos
cd ~/repos
git clone git://github.com/etsy/supergrep.git
cd supergrep
npm install
./runlocal

http://hostname:3000にアクセスしてみると下記のような感じのガイドが表示される

と説明が続く。

Supergrepの設定

Supergrepの設定は同梱されているlocalConfig.jsに記載。 私は下記のように修正。当然ですが、apache以外のlogにも使えます。

Supergrepがlogを読み取れないといけないので、権限を修正

1
sudo chmod 755 /var/log/httpd/

Supergrepを動作

設定が済んだら、再度Supergrepを起動してみる。

1
./runlocal

apache_log403でハイライトした感じ

ログサイズがでかい場合は、どのくらいの負荷になるのかなど検証しないといけないですが、

  • サポートの人とかサーバに入らずブラウザからログを閲覧
  • デプロイ直後のログ確認

とかに向いてるかなという印象。 不要なログが排除されててログの見通しがよく、ターミナル上で見るより見やすい。

でも今だとfluentd+mongodbとかで、そういう環境を整えるのが良いかなーと思ったりも。

Etsyはサイトの見た目とは対照的に、SolrのIndexレプリケーションにBitTorrentを使っていたり、 技術的に尖ったことをやっていて面白い会社ですね。