ぼちぼち日記

おそらくプロトコルネタを書いていることが多いんじゃないかと思います。

nodetime がローカル環境で使えるようになった

先日の記事で 「 nodetime は、nodetime.com のサーバにデータを送ってしまうのでローカル環境で使えない。パッチを送ったけど断られてしまった。 」と書きましたが、今朝 nodetime をバージョンアップして nodetime.com のサーバに送らずにデータを取得できるようになったとコメントをもらいました。
他にも同様の要望があったようですが、早速対応してもらいありがたいことです。

詳しくは dmelikyan さんのブログ、
"Nodetime 0.2 is out featuring Memcached, PostgreSQL, Cassandra, file system, cluster support and more"
http://nodetime.com/blog/nodetime-0_2-is-out
を参照していただくとして、ローカル環境で使用するには

  1. nodetime.com へデータを送らない headless オプション
  2. パフォーマンスデータを取得する sample イベント

といったところを使えば大丈夫です。(他にも menchached や cassandra fs,cluster といったプローブ機能の充実もバージョンアップで対応してます。) ただ sampleイベントで取得するデータの構造は今後変わる(互換性を維持しない)ということなのでそのへん了承の上使うようにしてください。

ということで、 Hello World のサンプルコードで nodetime のパフォーマンスデータをローカルサーバにアップロードし、サーバ上で標準出力に表示する簡単なサンプルコードを作りました。

https://gist.github.com/2356957

やっていることは単に sample イベントで取得したデータを JSON にして upload サーバ(port 12345でローカル上げている)に POST しているだけです。node.profile() で headless のオプションを true にしないと nodetime.com にデータを送ってしまうので注意してください。

なお nodetime.profile() 後の require() は nodetime の proxy オブジェクトで乗っ取られたものになるので、最初に別の変数で require('http') してます。(まぁクライアントのコードにはまだ何も probe を仕込んでなさそうですが、念のため。)

パフォーマンスデータを取得したいコードの前に以下のコードを仕込めば動作します。

var uphttp = require('http');
var nodetime = require('nodetime');
var upload_port = 12345;
nodetime.on('sample', function(sample) {
  var upload = uphttp.request({ port: upload_port, method: 'POST', path: '/upload'});                             
  upload.end(JSON.stringify(sample));
  upload.on('response', function(res) {
    var data = '';
    res.on('data', function(chunk) {
      data += chunk;
    });
    res.on('end', function() {
      console.log(data);
      data = '';
    });
  });
  upload.on('error', function(e) {
    console.log(e.toString());
  });
});
nodetime.profile({headless: true});

サーバ側は /upload で POST された JSON を出力するだけの簡単なものです。これは gist のサンプルコードを見ていただければよいかと。

後はこれらのパフォーマンスデータをどう保管して奇麗に見せるかということ作業になるでしょう。
どなたかデザインセンスのある方に素晴らしいフロントエンドを用意してもらえないかなぁと願っている次第です。