【Hinemos/Perl】性能管理データをWeb上で見る
投稿日: / 更新日:
この記事は2年以上前に書かれたものです。情報が古い可能性があります。
タイトルについて、ふと「Web上で見られたらいいなぁ」と思い立ち、試しに作ってみました。
もちろん汎用的なものではなく、実用にはほど遠いのですが、最近のWeb技術を使ってどれだけ簡単に作れるか確認したかった、というのも理由の一つです。
実装は、お決まりのPerl/CGIといくつかのモジュール、あとはFlotというjQueryのチャートプラグインを使用しています。ソースコードは以下のとおりです。
2012/10/07 修正: ほんの少しだけソースコードをリファクタしました。またTaintモードで動作することを確認しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
#!/path/to/perl -T # getperf.cgi use Modern::Perl; use utf8; use DBI; use CGI qw/ header /; use CGI::Carp qw/ fatalsToBrowser /; use Encode; use JSON::XS; use Time::Local; my $hostname = 'マネージャのIPアドレス'; my $port = 24001; my $username = 'hinemos'; my $password = 'パスワード'; my $dbh = DBI->connect( "dbi:Pg:host=$hostname;port=$port", $username, $password, { AutoCommit => 0, RaiseError => 1, PrintError => 0, pg_enable_utf8 => 1, }, ); my $rows = $dbh->selectall_arrayref(_sql()); $dbh->disconnect; my ($perf, $tmp) = ( [], {} ); for my $cols (@$rows) { if ($cols->[1] =~ /^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})/) { # in milliseconds my $jstime = timegm($6, $5, $4, $3, $2 - 1, $1 - 1900) * 1000; push @{ $tmp->{$cols->[0]} }, [ $jstime, $cols->[2] + 0 ] } } # to fit to Flot data structure push $perf, { label => $_, data => $tmp->{$_} } for sort keys %$tmp; print header( -type => 'text/html', -charset => 'UTF-8', ), encode_utf8( do { local $/; my $html = ; $html =~ s/__PERF__/JSON::XS->new->pretty->encode($perf)/e; $html; }, ); sub _sql { return << "EOSQL"; select c.item_name, c.date_time, c.value from ( select b.item_name, a.date_time, a.value from cc_calculated_data a, cc_collector_item_code_mst b where a.item_code = b.item_code order by a.date_time desc limit 100 ) as c order by c.item_name, c.date_time EOSQL } __END__ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Hinemosグラフ取得テスト</title> <script src="flot/jquery.js"></script> <script src="flot/jquery.flot.js"></script> </head> <body> <h1>Hinemosグラフ取得テスト</h1> <div id="placeholder" style="width:800px; height:400px"></div> <script> $(function() { $.plot( $("#placeholder"), __PERF__, { lines: { show: true }, legend: { position: "nw" }, xaxis: { mode: "time", timezone: "browser", timeformat: "%y/%m/%d %H:%M:%S" } } ) }); </script> </body> </html> |
上記のとおり、SQL文とHTMLテンプレートの部分を除けば、コード量はごくわずかです。また、グラフ描画に関しても、基本的にはFlotにJSONデータを流し込むだけで済むため、非常に短いコードで実現することができました。
なお、サブクエリなしで最新の100件を昇順で取得できれば、さらにSQL文を短くできるのですが、私のSQL力ではこれが限界のようです。
以上、HinemosとPerlに関する簡単な話題をご紹介しました。