diff --git a/pom.xml b/pom.xml index cc7f82b5b..661d3d727 100644 --- a/pom.xml +++ b/pom.xml @@ -153,6 +153,11 @@ net.liftmodules amqp_2.6_${scala.version} 1.3 + + + com.tesobe + OBP-Mongo-Metrics + 1.0-SNAPSHOT diff --git a/src/main/scala/bootstrap/liftweb/Boot.scala b/src/main/scala/bootstrap/liftweb/Boot.scala index 6a0c1c499..e1f066eae 100755 --- a/src/main/scala/bootstrap/liftweb/Boot.scala +++ b/src/main/scala/bootstrap/liftweb/Boot.scala @@ -54,6 +54,9 @@ import javax.mail.{ Authenticator, PasswordAuthentication } import java.io.FileInputStream import java.io.File import code.model.dataAccess.BankAccountCreationListener +import code.metrics.Metrics +import code.metrics.MongoMetric +import code.metrics.MongoMetrics /** * A class that's instantiated early and run. It allows the application * to modify lift's environment @@ -233,5 +236,6 @@ class Boot extends Loggable{ val useMessageQueue = Props.getBool("messageQueue.createBankAccounts", false) if(useMessageQueue) BankAccountCreationListener.startListen + } } diff --git a/src/main/scala/code/api/OBPAPI1.0.scala b/src/main/scala/code/api/OBPAPI1.0.scala index 56bd636e5..ad8b05008 100644 --- a/src/main/scala/code/api/OBPAPI1.0.scala +++ b/src/main/scala/code/api/OBPAPI1.0.scala @@ -63,7 +63,7 @@ import net.liftweb.mongodb.{ Skip, Limit } import _root_.net.liftweb.http.S._ import _root_.net.liftweb.mapper.view._ import com.mongodb._ -import code.model.dataAccess.{ Account, OBPEnvelope, OBPUser,APIMetric, HostedAccount, LocalStorage} +import code.model.dataAccess.{ Account, OBPEnvelope, OBPUser, HostedAccount, LocalStorage} import code.model.{ModeratedTransaction, ModeratedBankAccount, View, BankAccount, Bank, User} import code.model.dataAccess.OBPEnvelope._ import java.util.Date @@ -73,6 +73,7 @@ import net.liftweb.json.Extraction import _root_.net.liftweb.json.Serialization import net.liftweb.json.NoTypeHints import code.api.OAuthHandshake.getUser +import code.injections.MetricsInjector object OBPAPI1_0 extends RestHelper with Loggable { @@ -80,12 +81,10 @@ object OBPAPI1_0 extends RestHelper with Loggable { val dateFormat = ModeratedTransaction.dateFormat - private def logAPICall = - APIMetric.createRecord. - url(S.uriAndQueryString.getOrElse("")). - date((now: TimeSpan)). - save - + private def logAPICall = { + MetricsInjector.m.vend.logAPICall(S.uriAndQueryString.getOrElse(""), now) + } + serve("obp" / "v1.0" prefix { case Nil JsonGet json => { diff --git a/src/main/scala/code/api/OBPAPI1.1.scala b/src/main/scala/code/api/OBPAPI1.1.scala index 03342ec5c..adf9bf1be 100644 --- a/src/main/scala/code/api/OBPAPI1.1.scala +++ b/src/main/scala/code/api/OBPAPI1.1.scala @@ -59,9 +59,9 @@ import com.mongodb._ import code.model._ import java.util.Date import code.api.OAuthHandshake._ -import code.model.dataAccess.APIMetric import code.model.dataAccess.OBPEnvelope.{OBPOrder, OBPLimit, OBPOffset, OBPOrdering, OBPFromDate, OBPToDate, OBPQueryParam} import java.net.URL +import code.injections.MetricsInjector case class TagJSON( value : String, @@ -162,11 +162,9 @@ object OBPAPI1_1 extends RestHelper with Loggable { } } - private def logAPICall = - APIMetric.createRecord. - url(S.uriAndQueryString.getOrElse("")). - date((now: TimeSpan)). - save + private def logAPICall = { + MetricsInjector.m.vend.logAPICall(S.uriAndQueryString.getOrElse(""), now) + } private def isFieldAlreadySet(field : String) : Box[String] = if(field.isEmpty) diff --git a/src/main/scala/code/api/metrics.scala b/src/main/scala/code/api/metrics.scala index 875149da9..6c1e921ce 100644 --- a/src/main/scala/code/api/metrics.scala +++ b/src/main/scala/code/api/metrics.scala @@ -38,9 +38,9 @@ import net.liftweb.http.rest._ import net.liftweb.json.Extraction import net.liftweb.json.JsonAST._ import _root_.net.liftweb.util.Helpers._ -import code.model.dataAccess.APIMetric import java.util.Date import java.util.Calendar +import code.injections.MetricsInjector case class APICallAmount( url: String, @@ -61,34 +61,12 @@ object Metrics extends RestHelper { serve("obp" / "metrics" prefix { case "demo-bar" :: Nil JsonGet json => { - def byURL(metric : APIMetric) : String = - metric.url.get - - def byUsage(x : APICallAmount, y : APICallAmount) = - x.amount > y.amount - - val results = APICallAmounts(APIMetric.findAll.groupBy[String](byURL).toSeq.map(t => APICallAmount(t._1,t._2.length)).toList.sortWith(byUsage)) - + val results = MetricsInjector.m.vend.getAPICallAmounts JsonResponse(Extraction.decompose(results)) } case "demo-line" :: Nil JsonGet json => { - - def byDay(metric : APIMetric) : Date = { - val metricDate = metric.date.get - val cal = Calendar.getInstance() - cal.setTime(metricDate) - cal.set(Calendar.HOUR,0) - cal.set(Calendar.MINUTE,0) - cal.set(Calendar.SECOND,0) - cal.set(Calendar.MILLISECOND,0) - cal.getTime - } - - def byOldestDate(x : APICallsForDay, y : APICallsForDay) : Boolean = - x.date before y.date - - val results = APICallsPerDay(APIMetric.findAll.groupBy[Date](byDay).toSeq.map(t => APICallsForDay(t._2.length,t._1)).toList.sortWith(byOldestDate)) + val results = MetricsInjector.m.vend.getAPICallsPerDay JsonResponse(Extraction.decompose(results)) } diff --git a/src/main/scala/code/injections/Injectors.scala b/src/main/scala/code/injections/Injectors.scala new file mode 100644 index 000000000..6c5be260c --- /dev/null +++ b/src/main/scala/code/injections/Injectors.scala @@ -0,0 +1,19 @@ +package code.injections + +import net.liftweb.util.SimpleInjector +import code.metrics.Metrics +import code.metrics.MongoMetrics +import code.model.dataAccess.MongoConfig + +object MetricsInjector extends SimpleInjector { + + private val mongoMetrics = + new MongoMetrics( + host = MongoConfig.host, + port = MongoConfig.port, + dbName = MongoConfig.dbName) + + def buildOne: Metrics = mongoMetrics + + val m = new Inject(buildOne _) {} +} \ No newline at end of file diff --git a/src/main/scala/code/model/dataAccess/MongoConfig.scala b/src/main/scala/code/model/dataAccess/MongoConfig.scala index ea9c594d5..0bca6d583 100644 --- a/src/main/scala/code/model/dataAccess/MongoConfig.scala +++ b/src/main/scala/code/model/dataAccess/MongoConfig.scala @@ -41,18 +41,25 @@ object AdminDb extends MongoIdentifier { } object MongoConfig { - def init: Unit = { - val srvr = new ServerAddress( - Props.get("mongo.host", "localhost"), - Props.getInt("mongo.port", 27017) - ) - val defaultDatabase = + + lazy val defaultDatabase = Props.mode match { case Props.RunModes.Test => "test" case _ => "OBP006" } + + lazy val host = Props.get("mongo.host", "localhost") + lazy val port = Props.getInt("mongo.port", 27017) + lazy val dbName = Props.get("mongo.dbName", defaultDatabase) + + def init: Unit = { + val srvr = new ServerAddress( + host, + port + ) + - MongoDB.defineDb(DefaultMongoIdentifier, new Mongo(srvr), Props.get("mongo.dbName", defaultDatabase)) + MongoDB.defineDb(DefaultMongoIdentifier, new Mongo(srvr), dbName) MongoDB.defineDb(AdminDb, new Mongo(srvr), "admin") } } diff --git a/src/main/scala/code/model/dataAccess/metrics.scala b/src/main/scala/code/model/dataAccess/metrics.scala deleted file mode 100644 index e7c5e26b6..000000000 --- a/src/main/scala/code/model/dataAccess/metrics.scala +++ /dev/null @@ -1,45 +0,0 @@ -/** -Open Bank Project - API -Copyright (C) 2011, 2013, TESOBE / Music Pictures Ltd - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . - -Email: contact@tesobe.com -TESOBE / Music Pictures Ltd -Osloerstrasse 16/17 -Berlin 13359, Germany - - This product includes software developed at - TESOBE (http://www.tesobe.com/) - by - Simon Redfern : simon AT tesobe DOT com - Stefan Bethge : stefan AT tesobe DOT com - Everett Sochowski : everett AT tesobe DOT com - Ayoub Benali: ayoub AT tesobe DOT com - - */ - - package code.model.dataAccess - - import net.liftweb.mongodb.record.field.{ObjectIdPk,DateField} - import net.liftweb.record.field.{StringField} - import net.liftweb.mongodb.record.{MongoRecord,MongoMetaRecord} - -class APIMetric extends MongoRecord[APIMetric] with ObjectIdPk[APIMetric] { - def meta = APIMetric - object url extends StringField(this,255) - object date extends DateField(this) -} - -object APIMetric extends APIMetric with MongoMetaRecord[APIMetric] diff --git a/src/main/scala/code/util/APIUtil.scala b/src/main/scala/code/util/APIUtil.scala index 986d5a337..cf9deae66 100644 --- a/src/main/scala/code/util/APIUtil.scala +++ b/src/main/scala/code/util/APIUtil.scala @@ -32,7 +32,6 @@ Berlin 13359, Germany package code.util -import code.model.dataAccess.APIMetric import code.api.v1_2.ErrorMessage import net.liftweb.http.JsonResponse import net.liftweb.json.Extraction @@ -43,6 +42,7 @@ import net.liftweb.util.Helpers._ import net.liftweb.http.S import net.liftweb.http.js.JE.JsRaw import scala.collection.JavaConversions.asScalaSet +import code.injections.MetricsInjector object APIUtil { @@ -65,12 +65,10 @@ object APIUtil { case _ => false } } - - def logAPICall = - APIMetric.createRecord. - url(S.uriAndQueryString.getOrElse("")). - date((now: TimeSpan)). - save + + def logAPICall = { + MetricsInjector.m.vend.logAPICall(S.uriAndQueryString.getOrElse(""), now) + } def gitCommit : String = { val commit = tryo{