モニカジ#2でモヒカンに会ってきた話とプログラミング初心者がMzcsつくったという話

本エントリーはアルコール度数高めでまとめております。
不備など多々あるかと思いますが、アルコール感を感じて頂ければと思います。

Monitoring Casual Talk#2 に行ってきました。

膝に矢を受けてではないですが、先週末に会社のフットサルに参加して
よくわからないダメージを右足に受けて、家の近くの接骨院(初)に行って
観てもらったら、うーんと何回か首を傾げていて、
とても丁寧で人は良いんだけど腕はない人っぽい可能性があって、
まぁ動かさないより動かした方がいいとか言われたので、じゃあいいか
ってなもんで気にせず渋谷まで行ってきたわけなんですけど

渋谷駅でfujiwaraさんとsongmuさんが足痛いの知ってるのに颯爽と歩いて行って、
「ちょっと待ってたけど来なかったから」とか言われて
待ってたとか言ってるけど振り返った程度だろうな、と思ったりして

で、帰りには歩けなくなるぐらい痛くなって、酒呑んだからかな〜
なんだかなあ〜(阿藤快)と思い、ヤブ医者だろうがなんだろうがオレの精神はこの困難を乗り越えるッッ!!
みたいな感じで帰りつつ、いやはや、やっぱり楽しかったなと。

サーバのお守りしてる人って、基本社内にあまり人数はいなくて
社内で話し相手があんまりいない人たちが集まって
日頃の悩みとかをあーだこーだ言うのはいいなって。

Yappoさんが買ってきてくれたビールがバキバキだったり(ありがとうございました!)
Yappoさんが発表しようとしたらモニターに何も映らなくて
開口一番「何か質問ありますか?」とか言ってたり
Yappoさんとmyfinderさん、#monitoring-casual@freebitにbot仕込んで遊んでたり
myfinderさんは懇親会前にビール4本開けてるし
tagomorisさんは懇親会から参加してモヒカンっぷりを発揮していたし

やれやれと思うこともあったけど、全体的に楽しかった!
最初の方時間あまってるんでーとかユルユルやってて、ユルユルやりすぎて
最後の方時間なくなってたので、時間はタイムキーパー必須ですね。うける。

懇親会ではわたしのoranieを返してよ!!!っておじさんたちが嘆いていて
とりあえずkuwa_twさんを囲もうとか言ってて、やれやれって思って

nakashii_先生とfujiwaraさんと3人でZabbixの素晴らしさを
studio3104さんに話してたんだけど、全く使う気になれない!!って言われて
本当にそうだよなって思いながら話していた。

riywoさんがアメリカに行く前にお会いできたのはよかった。
今自分がこうやって色々活動的に動いてるの、riywoさんに刺激受けたところが大くて
オレも何かやりたいなーと思ったりして今があったりとかするので。
アメリカに行っても元気に活躍してほしいです。


モニタリングツールといえば、

この古橋さんのPOSTがなんとも胸アツですよね。
わたしも微力ながら貢献できるところで貢献できればなーと思いふけております。


あ、それと今回

とか考えてたんですけど、
結局Mzcsつくったのみんなに見て欲しい!って思ってなしにしたんですが
ume3_さんの発表がまさにそれで「自分はこうしているんだけどみなさんはどうしていますか?」
という質問形式で進めてくことによって、みんながどういう基準で障害に対してエスカレーションしているか、
どういうところに重きを置いているのか活発的な議論が起こってすごい良かったです!!!
次あったら完全にパクりたい!!!

ume3_さんで思い出したけどペパボの
「元々うちはホスティング屋だから全員IRCは見てる」っていうスタイル
めちゃくちゃかっこよくて、サーバサイドの人間だけがアラート受けとるのではなく
ディレクターとかデザイナーとかマークアッパーとか関係なしに
みんながアラート受け取って、みんなでIRCで確認しあうというスタイル
多分2012年の日本のウェブ関係の会社で、理想に限りなく近い状態だと思う。
全員がサービスの状態を意識するというか、担当者がやればとかではなく
全員が全員でサービスを守っているというか、そういうの本当に意識高いし
素晴らしいと思う。


ということでMzcsについて話してきたのですが、中身についてちゃんと話しきれてなかったのと
githubにあげてはいたんですが、ドキュメント書いてなかったので書いたりしました。

Morning Zabbix (Graph) Check Script

https://github.com/kenjiskywalker/Mzcs


ということで、
毎朝プルダウン引っ張ってスクリーン移動するのが面倒くさかったので、
全てのグラフを

  1. 今日(09:00)までの24時間
  2. 昨日(09:00)までの24時間
  3. 今日までの2週間

の3つのグラフを並べることによって、メトリクスの変化に気付けるようになる。
という代物でございます。

使い方に関しては大体ドキュメントに書いていて、
もしお使いになる場合には

https://github.com/kenjiskywalker/Mzcs#how-to-use

この辺をいじくって頂ければと。
わたくしはこの子を毎日 09:01 に走らせて確認しております。

仕組みとしては

1. ZabbixにMechanizeでログイン
my $mech = WWW::Mechanize->new(ssl_opts => { verify_hostname => 0 }, timeout => 180);

$mech->get($url);
$mech->field(name     => "$username");
$mech->field(password => "$password");
$mech->click('enter');
2. DBIで指定したグラフカテゴリのグラフIDを取得
sub input_graphid {
    my @recs = ();
    my $graph_category = shift;

    eval {
       my $dbh = DBI->connect($data_source, $db_username, $db_password,
               {RaiseError => 1, PrintError => 0});

       my $sql = "SELECT graphid FROM graphs WHERE name = ?";
           my $sth = $dbh->prepare($sql);
           $sth->execute($graph_category);

       while (my $rec = $sth->fetchrow_arrayref) {
                push(@recs, $rec->[0]);
       }
       $sth->finish;
       $dbh->disconnect;
   };
   die "Error : $@\n" if ($@);
   return @recs;
}

my @graph_category = (
    "CPU Utilization",
    "DiskUsage",
    "Load Average",
    "Memory Utilization",
    "Swap Utilization",
    "Network Traffic (eth0)",
    "Network Traffic (eth1)",
    "MySQL queries",
    "MySQL slave delay"
);

my %filepath = (
    cpu    => "CPU Utilization",
    disk   => "DiskUsage",
    memory => "Memory Utilization",
    swap   => "Swap Utilization",
    loa    => "Load Average",
    netone => "Network Traffic (eth0)",
    nettwo => "Network Traffic (eth1)",
    query  => "MySQL queries",
    slave  => "MySQL slave delay",
);
3. LWP(getstore)で指定した画像をローカルに保存
for my $key (keys(%filepath)) {
    my $graph_name = $filepath{$key};

    my @graphid = input_graphid($graph_name);

    # graph uniq number in $graph
    for my $graph (@graphid) {            # => graphid(100, 101, 102)

        for my $day (keys(%days)) {       # => day(today, yesterday)
            $pm->start and next;
            my $graphurl = "$url/chart2.php?graphid=$graph&width=$width&period=$since{$day}&stime=$days{$day}";

            # main system get png image 
            # $mech->get("$graphurl",":content_file" => "png/${graph}_${day}.png");
            print "$graphurl\n";
            $pm->finish;
        }
        $pm->wait_all_children;
    }
}
4. hisaichi5518先生に教えてもらったspliceで1ページに表示するグラフの数を30で分ける
 my @graphid = input_graphid($graph_name);
 my @one   = splice(@graphid, 0, 30);
 my @two   = splice(@graphid, 0, 30);
 my @three = splice(@graphid, 0, 30);
 my @four  = splice(@graphid, 0, 30);
 my @five  = splice(@graphid, 0, 30);
 my @six   = splice(@graphid, 0, 30);
 my @seven = splice(@graphid, 0, 30);
 my @eight = splice(@graphid, 0, 30);
 my @nine  = splice(@graphid, 0, 30);
 my @ten   = splice(@graphid, 0, 30);

 my @num = (\@one, \@two, \@three, \@four, \@five, \@six, \@seven, \@eight, \@nine, \@ten);

 my %number = (
     one   => \@one,
     two   => \@two,
     three => \@three,
     four  => \@four,
     five  => \@five,
     six   => \@six,
     seven => \@seven,
     eight => \@eight,
     nine  => \@nine,
     ten   => \@ten,
 );

この辺もっとエレガントにできる...

5. XslateでHTMLページを生成(Data::Section::Simple便利や!)
    for my $num (keys(%number)) {

        my $graphid_ref = $number{$num};
        $graph_data = $tx->render("template.tx",
            {
                graph_name => $graph_name,
                list       => $graphid_ref, #list -> \@one => graphid
                graph_cate => $key,         #key
                number     => $num,
            }
        );
        open(my $fh, '>', $key."_".$num.".html"); # open ex) $key(cpu)_$num(one).html
        print $fh $graph_data;
        close($fh);
    }

という感じでやってます。
プログラミングは本当にベーシックなことぐらいしかわからなかったので
オブジェクト指向とかメソッドとかクラスとか最近なんとなくわかってきたような気がするので
捗るようなものをつくっていきたいと思う。

コード、情弱っぷり発揮しているかと思いますので、ご指南お待ちしておりまする!