Fluentdで、コードを書いてみ
ようかなと思った話
perl歴半年くらいですやさしくしてください
@studio3104
Lightning Talk at YAPC::Asia 2012
自己紹介
@studio3104 (Satoshi SUZUKI)
-- Perl歴半年くらい
-- WEB業界2年目
-- 妻、娘、息子います
-- ソシャゲ、公式サイト、パチ(スロ)ンコ
-- こんなのやってます →→→→→→→
-- Perlと心中するらしいです
「IT系のエンジニア」「え、SE?プログラマ?」「違う、インフラ系」「え、インフラ?ガス?」
仕事何してるかって聞かれると
インフラエンジニア
インフラ
「インフラ」「え、インフラ?ガス?」
仕事何してるかって聞かれると
インフラエンジニアのプログラミングへの意識
「インフラのエンジニアなんだ
からプログラムなんて書く必
要ないんだよね。」
23歳 男性
インフラエンジニアのプログラミングへの意識
「とりあえずなんとなくJavaの
入門書買ってひと通りやって
みたけど使い所ないと思って
る。」
24歳 男性
インフラエンジニアのプログラミングへの意識
「運用に必要で自分で作りた
いと思う処理って、結局シェ
ルスクリプトで間に合っちゃう
んだよね。」
25歳 男性
インフラエンジニアのプログラミングへの意識
「やっぱりコード書けるように
なりたいので、サービスの管
理画面作ってみようとしたけ
ど挫折した。」
26歳 男性
全部
過去のワタシが
思ってたことです
・Munin Plugin
・Nagios Plugin
・Ganglia Plugin
・Zabbix Plugin
・fluent-plugin
運用系エンジニアが
自分で書いて有益であろうもの
・Munin Plugin → なんでもok
・Nagios Plugin → なんでもok
・Ganglia Plugin → pythonだけ?
・Zabbix Plugin → よく知らない
・fluent-plugin → ruby
運用系エンジニアが
自分で書いて有益であろうもの
そこで
out_exec_filter
combined+レスポンスタイムなnginxのログフォーマット
log_format main'$remote_addr - $remote_user
[$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent "$request_time';
普通にFluentdの処理を通すとこうなる
{"host":"192.168.1.4","user":"-","method":"GET","path":"/foo/bar/index.psgi?source=ig&hl=ja&rlz=1G1GGLQ_JAJP314&q=td-agent&oq=td-agent&aq=f&aqi=&aql=&gs_l=igoogle.3...0.0.0.387.0.0.0.0.0.0.0.0..0.0...0.0.","code":"200",size":"0","referer":"-","agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5","response":"0.000"}
combined+レスポンスタイムなnginxのログフォーマット
{"host":"192.168.1.4","user":"-","method":"GET","path":"/foo/bar/index.psgi?source=ig&hl=ja&rlz=1G1GGLQ_JAJP314&q=td-agent&oq=td-agent&aq=f&aqi=&aql=&gs_l=igoogle.3...0.0.0.387.0.0.0.0.0.0.0.0..0.0...0.0.","code":"200",size":"0","referer":"-","agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5","response":"0.000"}
combined+レスポンスタイムなnginxのログフォーマット
{"agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5","code":"200","host":"192.168.1.4","method":"GET","path":"/foo/bar/index.psgi","referer":"-","response":"0.000","size":"0","user":"-","query_strings":{"source":"ig","aqi":"","aq":"f","oq":"td-agent","rlz":"1G1GGLQ_JAJP314","hl":"ja","gs_l":"igoogle.3...0.0.0.387.0.0.0.0.0.0.0.0..0.0...0.0.","q":"td-agent","aql":""},}
デ モ
1 #!/usr/bin/env perl$ 2 $ 3 use strict;$ 4 use warnings;$ 5 use Data::Dumper;$ 6 use DBIx::Handler;$ 7 use JSON::XS;$ 8 use Data::MessagePack;$ 9 $ 10 $| = 1;$ 11 $ 12 my $mp = Data::MessagePack->new();$ 13 $ 14 my $db_user = "root";$ 15 my $db_passwd = "";$ 16 my $db_opt = { RaiseError => 0, PrintError => 1 };$ 17 my $handler = DBIx::Handler->new( "DBI:mysql:database=information_schema:1 27.0.0.1", $db_user, $db_passwd, $db_opt );$ 18 $ 19 my $db;$ 20 my $long_query_time = $handler->dbh->selectrow_array($ 21 "SELECT VARIABLE_VALUE FROM GLOBAL_VARIABLES WHERE VARIABLE_NAME = 'LONG_Q UERY_TIME'");$ 22 $handler->dbh->do("SELECT SLEEP($long_query_time)");$ 23 $ 24 while ( my $json = <STDIN> ) {$ 25 my $slowlog = eval { decode_json($json); };$ 26 next if ($@);$
MySQL slow_log
MongoDB
27 $ 28 unless ( defined $slowlog->{sql} ) {$ 29 print $mp->pack($slowlog);$ 30 next;$ 31 }$ 32 $ 33 my $select_statement;$ 34 if ( $slowlog->{sql} =~ /(select[^\;]+)/i ) {$ 35 $select_statement = $1;$ 36 }$ 37 $ 38 if ( $slowlog->{sql} =~ /^use ([^\;]+)/i ) {$ 39 $db = '`' . $1 . '`';$ 40 }$ 41 $ 42 if ( defined $db && defined $select_statement ) {$ 43 $handler->dbh->do("use $db");$ 44 my $explains = eval { $handler->dbh->selectall_arrayref( "EXPLAIN $selec t_statement", +{ Slice => {} } ); };$ 45 if ( ref $explains eq 'ARRAY' ) {$ 46 $slowlog->{explain} = $explains;$ 47 $slowlog->{database} = $db;$ 48 }$ 49 }$ 50 $ 51 print $mp->pack($slowlog);$ 52 }$
tail
EXPLAIN
store
Perl歴
半年未満
Fluentdで、コードを書いてみ
ようかなと思った話
ご清聴ありがとうございました
@studio3104
Lightning Talk at YAPC::Asia 2012