メトリクス ========== XitrumはあなたのアプリケーションのJVMのヒープメモリーとCPUの使用量、 そしてアクションの実行ステータスをAkkaクラスタ上の各ノードから収集します。 それらのデータはメトリクスとしてJSONデータで配信する事ができます。 またメトリクスをカスタマイズすることも可能です。 この機能は `Coda Hale Metrics `_ を使用しています。 メトリクスの収集 ---------------- ヒープメモリとCPU ~~~~~~~~~~~~~~~~~ JVMのヒープメモリとCPUはAkkaのactor systemの各ノードから `NodeMetrics `_ として収集されます。 ヒープメモリ: .. image:: ../img/metrics_heapmemory.png CPU: プロセッサ数とロードアベレージ .. image:: ../img/metrics_cpu.png アクションの実行ステータス ~~~~~~~~~~~~~~~~~~~~~~~~~~ Xitrumは各ノードにおける各アクションの実行ステータスを `Histogram `_ として収集します。 アクションの実行回数や実行時間についてをここから知ることができます。 .. image:: ../img/metrics_action_count.png 特定のアクションの最新の実行時間: .. image:: ../img/metrics_action_time.png カスタムメトリクスの収集 ~~~~~~~~~~~~~~~~~~~~~~~~ 上記のメトリクスに加えて収集するメトリクスをカスタムすることができます。 ``xitrum.Metrics`` は ``gauge``, ``counter``, ``meter``, ``timer`` そして ``histogram`` にアクセスするためのショートカットです。 これらの使い方は `Coda Hale Metrics `_ と `そのScala実装 `_ を参照ください。 例 Timer: :: import xitrum.{Action, Metrics} import xitrum.annotation.GET object MyAction { lazy val myTimer = Metrics.timer("myTimer") } @GET("my/action") class MyAction extends Action { import MyAction._ def execute() { myTimer.time { // Something that you want to measure execution time ... } ... } } メトリクスの配信 ---------------- Xitrumは最新のメトリクスをJSONフォーマットで定期的に配信します。 収集されたデータは揮発性であり、永続的に保存はされません。 ヒープメモリー: :: { "TYPE" : "heapMemory", "SYSTEM" : akka.actor.Address.system, "HOST" : akka.actor.Address.host, "PORT" : akka.actor.Address.port, "HASH" : akka.actor.Address.hashCode, "TIMESTAMP" : akka.cluster.NodeMetrics.timestamp, "USED" : Number as byte, "COMMITTED" : Number as byte, "MAX" : Number as byte } CPU: :: { "TYPE" : "cpu", "SYSTEM" : akka.actor.Address.system, "HOST" : akka.actor.Address.host, "PORT" : akka.actor.Address.port, "HASH" : akka.actor.Address.hashCode, "TIMESTAMP" : akka.cluster.NodeMetrics.timestamp "SYSTEMLOADAVERAGE" : Number, "CPUCOMBINED" : Number, "PROCESSORS" : Number } メトリクスレジストリは `metrics-json `_ によってパースされます。. Xitrumデフォルトビューア ~~~~~~~~~~~~~~~~~~~~~~~~ Xitrumはデフォルトで次のURLにメトリクスビューアを提供します。``/xitrum/metrics/viewer?api_key=`` このURLでは上記のような `D3.js `_ によって生成されたグラフを参照することができます。 URLが動的に算出できます: :: import xitrum.Config import xitrum.metrics.XitrumMetricsViewer url[XitrumMetricsViewer]("api_key" -> Config.xitrum.metrics.get.apiKey) Jconsoleビューア ~~~~~~~~~~~~~~~~ `JVM Reporter `_ を使用することも可能です。 .. image:: ../img/metrics_jconsole.png JVM Reporterの開始方法: :: import com.codahale.metrics.JmxReporter object Boot { def main(args: Array[String]) { Server.start() JmxReporter.forRegistry(xitrum.Metrics.registry).build().start() } } アプリケーション起動後 `jconsole `_ コマンドをターミナルから実行します。 カスタムビューア ~~~~~~~~~~~~~~~~ メトリクスはJSONとしてSockJS URL ``xitrum/metrics/channel`` から取得する事ができます。 ``jsAddMetricsNameSpace`` はそのURLへ接続するためのJavaScriptスニペットをビューに出力します。 JavaScriptでJSONハンドラを実装し、``initMetricsChannel`` を呼び出してください。 例: :: import xitrum.annotation.GET import xitrum.metrics.MetricsViewer @GET("my/metrics/viewer") class MySubscriber extends MetricsViewer { def execute() { jsAddMetricsNameSpace("window") jsAddToView(""" function onValue(json) { console.log(json); } function onClose(){ console.log("channel closed"); } window.initMetricsChannel(onValue, onClose); """) respondView() } } メトリクスの保存 ~~~~~~~~~~~~~~~~ メモリ消費を抑制するため、Xitrumは過去のメトリクス情報について保持することはありません。 データベースやファイルへの書き出しが必要な場合、独自のサブスクライバーを実装する必要があります。 例: :: import akka.actor.Actor import xitrum.metrics.PublisherLookUp class MySubscriber extends Actor with PublisherLookUp { override def preStart() { lookUpPublisher() } def receive = { case _ => } override def doWithPublisher(globalPublisher: ActorRef) = { context.become { // When run in multinode environment case multinodeMetrics: Set[NodeMetrics] => // Save to DB or write to file. // When run in single node environment case nodeMetrics: NodeMetrics => // Save to DB or write to file. case Publish(registryAsJson) => // Save to DB or write to file. case _ => } } }