Yapc -asia 2012 lt @studio3104

Post on 30-Jun-2015

6,304 views 0 download

description

LT at YAPC::Asia 2012

transcript

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