Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id A4078200B9B for ; Wed, 28 Sep 2016 03:19:18 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id A2A82160AE6; Wed, 28 Sep 2016 01:19:18 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id C14ED160AE7 for ; Wed, 28 Sep 2016 03:19:17 +0200 (CEST) Received: (qmail 362 invoked by uid 500); 28 Sep 2016 01:19:17 -0000 Mailing-List: contact commits-help@iota.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@iota.incubator.apache.org Delivered-To: mailing list commits@iota.incubator.apache.org Received: (qmail 353 invoked by uid 99); 28 Sep 2016 01:19:17 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 28 Sep 2016 01:19:17 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id 8FE31C2033 for ; Wed, 28 Sep 2016 01:19:16 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -4.344 X-Spam-Level: X-Spam-Status: No, score=-4.344 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-1.124] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id l_JvnatLOqmj for ; Wed, 28 Sep 2016 01:19:15 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with SMTP id AD43D60D84 for ; Wed, 28 Sep 2016 01:19:12 +0000 (UTC) Received: (qmail 99926 invoked by uid 99); 28 Sep 2016 01:19:11 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 28 Sep 2016 01:19:11 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id ADFA9E0A3F; Wed, 28 Sep 2016 01:19:11 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: tonyfaustini@apache.org To: commits@iota.incubator.apache.org Date: Wed, 28 Sep 2016 01:19:17 -0000 Message-Id: <4bff41ecd25b408fa2146b784e71829d@git.apache.org> In-Reply-To: <21904e761a0b45659bfde365c0fe3e76@git.apache.org> References: <21904e761a0b45659bfde365c0fe3e76@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [07/10] incubator-iota git commit: New feature: Implement simple monitoring: Simple monitoring keeps track only of the latest event for each actor - Reason: Less memory usage, specially when using routers archived-at: Wed, 28 Sep 2016 01:19:18 -0000 New feature: Implement simple monitoring: Simple monitoring keeps track only of the latest event for each actor - Reason: Less memory usage, specially when using routers Project: http://git-wip-us.apache.org/repos/asf/incubator-iota/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-iota/commit/adf71bb1 Tree: http://git-wip-us.apache.org/repos/asf/incubator-iota/tree/adf71bb1 Diff: http://git-wip-us.apache.org/repos/asf/incubator-iota/diff/adf71bb1 Branch: refs/heads/master Commit: adf71bb1d84f6397a315dfc7b042b351201a47ae Parents: 2135e87 Author: Barbara Gomes Authored: Fri Jul 29 12:35:23 2016 -0700 Committer: Barbara Gomes Committed: Fri Jul 29 12:35:23 2016 -0700 ---------------------------------------------------------------------- fey-core/src/main/resources/application.conf | 11 +++++ .../scala/org/apache/iota/fey/Monitor.scala | 48 +++++++++++++++++++- .../scala/org/apache/iota/fey/MyService.scala | 10 +++- .../main/scala/org/apache/iota/fey/Utils.scala | 26 ++++++----- 4 files changed, 81 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-iota/blob/adf71bb1/fey-core/src/main/resources/application.conf ---------------------------------------------------------------------- diff --git a/fey-core/src/main/resources/application.conf b/fey-core/src/main/resources/application.conf index a1193af..a80f13e 100644 --- a/fey-core/src/main/resources/application.conf +++ b/fey-core/src/main/resources/application.conf @@ -83,6 +83,17 @@ fey-global-configuration{ // No default custom implementations } + // Configure monitoring options. If enabled the actors events will be stored + // together with other information, and the user should be able to visualize + // using the rest-api. + // Types: + // COMPLETE: Keeps track of all the events for all of the actors. Backed by a Trie data structure + // SIMPLE: Keeps track only of the latest event for each actor. Backed by HashMap + monitoring{ + enable = true, + type = "COMPLETE" + } + } // Fey akka configuration. Can not be overwritten by user http://git-wip-us.apache.org/repos/asf/incubator-iota/blob/adf71bb1/fey-core/src/main/scala/org/apache/iota/fey/Monitor.scala ---------------------------------------------------------------------- diff --git a/fey-core/src/main/scala/org/apache/iota/fey/Monitor.scala b/fey-core/src/main/scala/org/apache/iota/fey/Monitor.scala index 2de05b9..ded1c9f 100644 --- a/fey-core/src/main/scala/org/apache/iota/fey/Monitor.scala +++ b/fey-core/src/main/scala/org/apache/iota/fey/Monitor.scala @@ -32,12 +32,22 @@ protected class Monitor(eventsStore: Trie) extends Actor { val log: DiagnosticLoggingAdapter = Logging(this) log.mdc(Map("fileName" -> "monitor_events")) + + override def preStart(): Unit = { + if(CONFIG.MONITORING_ENABLED) { + if (CONFIG.MONITORING_TYPE == "SIMPLE") { + context.become(simple) + } else { + context.become(complete) + } + } + } + override def postStop(): Unit = { log.clearMDC() } - override def receive: Receive = { - + private def complete: Receive = { case START(timestamp, info) => logInfo(sender().path.toString, EVENTS.START, timestamp, info) eventsStore.append(sender().path.toString,MonitorEvent(EVENTS.START, timestamp, info)) @@ -53,7 +63,28 @@ protected class Monitor(eventsStore: Trie) extends Actor { case TERMINATE(actorPath, timestamp, info) => logInfo(actorPath, EVENTS.TERMINATE, timestamp, info) eventsStore.append(actorPath,MonitorEvent(EVENTS.TERMINATE, timestamp, info)) + } + + private def simple: Receive = { + case START(timestamp, info) => + logInfo(sender().path.toString, EVENTS.START, timestamp, info) + Monitor.simpleEvents.put(sender().path.toString, ('S',timestamp)) + case STOP(timestamp, info) => + logInfo(sender().path.toString, EVENTS.STOP, timestamp, info) + Monitor.simpleEvents.put(sender().path.toString, ('O',timestamp)) + + case RESTART(reason, timestamp) => + logInfo(sender().path.toString, EVENTS.RESTART, timestamp, "", reason) + Monitor.simpleEvents.put(sender().path.toString, ('R',timestamp)) + + case TERMINATE(actorPath, timestamp, info) => + logInfo(actorPath, EVENTS.TERMINATE, timestamp, info) + Monitor.simpleEvents.put(actorPath, ('T',timestamp)) + } + + override def receive: Receive = { + case _ => } def logInfo(path:String, event:String, timestamp: Long, info:String, reason:Throwable = null) = { @@ -80,6 +111,7 @@ protected object Monitor{ * Contains the lifecycle events for actors in Fey */ val events: Trie = new Trie("FEY-MANAGEMENT-SYSTEM") + val simpleEvents:scala.collection.mutable.HashMap[String,(Char, Long)] = scala.collection.mutable.HashMap.empty //Static HTML content from d3 val html = scala.io.Source.fromInputStream(getClass.getResourceAsStream("/eventsTable.html"), "UTF-8") @@ -100,6 +132,18 @@ protected object Monitor{ }).flatten } + def getSimpleHTMLEvents: String = { + val content = simpleEvents.map(event => { + event._2._1 match { + case 'S' => getTableLine(event._1, event._2._2, "START", "") + case 'O' => getTableLine(event._1, event._2._2, "STOP", "") + case 'R' => getTableLine(event._1, event._2._2, "RESTART", "") + case 'T' => getTableLine(event._1, event._2._2, "TERMINATE", "") + } + }).mkString("\n") + html.replace("$EVENTS_TABLE_CONTENT", content) + } + private def getTableLine(path: String,timestamp: Long, event: String, info: String):String = { s"$path$event$info$timestamp" } http://git-wip-us.apache.org/repos/asf/incubator-iota/blob/adf71bb1/fey-core/src/main/scala/org/apache/iota/fey/MyService.scala ---------------------------------------------------------------------- diff --git a/fey-core/src/main/scala/org/apache/iota/fey/MyService.scala b/fey-core/src/main/scala/org/apache/iota/fey/MyService.scala index 0935c5b..f686321 100644 --- a/fey-core/src/main/scala/org/apache/iota/fey/MyService.scala +++ b/fey-core/src/main/scala/org/apache/iota/fey/MyService.scala @@ -70,7 +70,15 @@ sealed trait MyService extends HttpService { get{ respondWithMediaType(`text/html`) { complete { - Monitor.getHTMLevents + try { + if(CONFIG.MONITORING_TYPE == "COMPLETE") { + Monitor.getHTMLevents + }else{ + Monitor.getSimpleHTMLEvents + } + }catch { + case e: Exception => "" + } } } } http://git-wip-us.apache.org/repos/asf/incubator-iota/blob/adf71bb1/fey-core/src/main/scala/org/apache/iota/fey/Utils.scala ---------------------------------------------------------------------- diff --git a/fey-core/src/main/scala/org/apache/iota/fey/Utils.scala b/fey-core/src/main/scala/org/apache/iota/fey/Utils.scala index 8a0f36d..095785b 100644 --- a/fey-core/src/main/scala/org/apache/iota/fey/Utils.scala +++ b/fey-core/src/main/scala/org/apache/iota/fey/Utils.scala @@ -217,6 +217,8 @@ object CONFIG{ var DYNAMIC_JAR_REPO = "" var DYNAMIC_JAR_FORCE_PULL = false var CUSTOM_DISPATCHERS: ConfigValue = null + var MONITORING_ENABLED: Boolean = true + var MONITORING_TYPE: String = "COMPLETE" def loadUserConfiguration(path: String) : Unit = { @@ -230,17 +232,19 @@ object CONFIG{ } }.getConfig("fey-global-configuration").resolve() - CHECKPOINT_DIR = app.getString("checkpoint-directory") - JSON_REPOSITORY = app.getString("json-repository") - JSON_EXTENSION = app.getString("json-extension") - JAR_REPOSITORY = app.getString("jar-repository") - CHEKPOINT_ENABLED = app.getBoolean("enable-checkpoint") - LOG_LEVEL = app.getString("log-level").toUpperCase() - LOG_APPENDER = app.getString("log-appender").toUpperCase() - MESSAGES_PER_RESIZE = app.getInt("auto-scale.messages-per-resize") - DYNAMIC_JAR_REPO = app.getString("dynamic-jar-population.downloaded-repository") - DYNAMIC_JAR_FORCE_PULL = app.getBoolean("dynamic-jar-population.force-pull") - CUSTOM_DISPATCHERS = app.getValue("custom-dispatchers") + CHECKPOINT_DIR = app.getString("checkpoint-directory") + JSON_REPOSITORY = app.getString("json-repository") + JSON_EXTENSION = app.getString("json-extension") + JAR_REPOSITORY = app.getString("jar-repository") + CHEKPOINT_ENABLED = app.getBoolean("enable-checkpoint") + LOG_LEVEL = app.getString("log-level").toUpperCase() + LOG_APPENDER = app.getString("log-appender").toUpperCase() + MESSAGES_PER_RESIZE = app.getInt("auto-scale.messages-per-resize") + DYNAMIC_JAR_REPO = app.getString("dynamic-jar-population.downloaded-repository") + DYNAMIC_JAR_FORCE_PULL = app.getBoolean("dynamic-jar-population.force-pull") + CUSTOM_DISPATCHERS = app.getValue("custom-dispatchers") + MONITORING_ENABLED = app.getBoolean("monitoring.enable") + MONITORING_TYPE = app.getString("monitoring.type").toUpperCase() setLogbackConfiguration() }