Add new fields to API Metrics #91

This commit is contained in:
Marko Milic 2016-07-26 14:12:49 +02:00
parent 17d92ac579
commit da78dabe15
7 changed files with 61 additions and 12 deletions

View File

@ -483,6 +483,24 @@ object OAuthHandshake extends RestHelper with Loggable {
nonceSaved && tokenSaved
}
def getConsumer: List[Consumer] = {
val httpMethod = S.request match {
case Full(r) => r.request.method
case _ => "GET"
}
val (httpCode, message, oAuthParameters) = validator("protectedResource", httpMethod)
import code.model.Token
val consumer: Option[Consumer] = for {
tokenId: String <- oAuthParameters.get("oauth_token")
token: Token <- Token.find(By(Token.key, tokenId))
consumer: Consumer <- token.consumerId.foreign
} yield {
consumer
}
consumer.toList
}
def getUser : Box[User] = {
val httpMethod = S.request match {
case Full(r) => r.request.method

View File

@ -173,7 +173,14 @@ object APIUtil extends Loggable {
// TODO This should use Elastic Search or Kafka not an RDBMS
val u = user.orNull
val userId = if (u != null) u.userId else "null"
APIMetrics.apiMetrics.vend.saveMetric(userId, S.uriAndQueryString.getOrElse(""), (now: TimeSpan))
val userName = if (u != null) u.name else "null"
var appName = "null"
var developerEmail = "null"
for (c <- getConsumer) {
appName = c.name.get
developerEmail = c.developerEmail.get
}
APIMetrics.apiMetrics.vend.saveMetric(userId, S.uriAndQueryString.getOrElse(""), (now: TimeSpan), userName, appName, developerEmail)
}
}

View File

@ -34,11 +34,11 @@ object APIMetrics extends SimpleInjector {
trait APIMetrics {
def saveMetric(userId: String, url : String, date : Date) : Unit
def saveMetric(userId: String, url : String, date : Date, userName: String, appName: String, developerEmail: String) : Unit
def saveMetric(url : String, date : Date) : Unit ={
//TODO: update all places calling old function before removing this
saveMetric ("TODO: userId", url, date)
saveMetric ("TODO: userId", url, date, "TODO: userName", "TODO: appName", "TODO: developerEmail")
}
//TODO: ordering of list? should this be by date? currently not enforced
@ -57,4 +57,7 @@ trait APIMetric {
def getUrl() : String
def getDate() : Date
def getUserId() : String
def getUserName() : String
def getAppName : String
def getDeveloperEmail() : String
}

View File

@ -9,10 +9,10 @@ object ElasticsearchMetrics extends APIMetrics {
val es = new elasticsearchMetrics
override def saveMetric(userId: String, url: String, date: Date): Unit = {
override def saveMetric(userId: String, url: String, date: Date, userName: String, appName: String, developerEmail: String): Unit = {
if (Props.getBool("allow_elasticsearch", false) && Props.getBool("allow_elasticsearch_metrics", false) ) {
es.indexMetric(userId, url, date)
es.indexMetric(userId, url, date, userName, appName, developerEmail)
}
}

View File

@ -7,8 +7,8 @@ import net.liftweb.mapper._
object MappedMetrics extends APIMetrics {
override def saveMetric(userId: String, url: String, date: Date): Unit = {
MappedMetric.create.url(url).date(date).save
override def saveMetric(userId: String, url: String, date: Date, userName: String, appName: String, developerEmail: String): Unit = {
MappedMetric.create.url(url).date(date).userName(userName).appName(appName).developerEmail(developerEmail).save
}
override def getAllGroupedByUserId(): Map[String, List[APIMetric]] = {
@ -34,13 +34,19 @@ class MappedMetric extends APIMetric with LongKeyedMapper[MappedMetric] with IdP
object userId extends DefaultStringField(this)
object url extends DefaultStringField(this)
object date extends MappedDateTime(this)
object userName extends DefaultStringField(this)
object appName extends DefaultStringField(this)
object developerEmail extends DefaultStringField(this)
override def getUrl(): String = url.get
override def getDate(): Date = date.get
override def getUserId(): String = userId.get
override def getUserName(): String = userName.get
override def getAppName(): String = appName.get
override def getDeveloperEmail(): String = developerEmail.get
}
object MappedMetric extends MappedMetric with LongKeyedMetaMapper[MappedMetric] {
override def dbIndexes = Index(userId) :: Index(url) :: Index(date) :: super.dbIndexes
override def dbIndexes = Index(userId) :: Index(url) :: Index(date) :: Index(userName) :: Index(appName) :: Index(developerEmail) :: super.dbIndexes
}

View File

@ -43,19 +43,28 @@ import net.liftweb.record.field.StringField
object userId extends StringField(this,255)
object url extends StringField(this,255)
object date extends DateField(this)
object userName extends StringField(this,255)
object appName extends StringField(this,255)
object developerEmail extends StringField(this,255)
def getUrl() = url.get
def getDate() = date.get
def getUserId() = userId.get
def getUserName(): String = userName.get
def getAppName(): String = appName.get
def getDeveloperEmail(): String = developerEmail.get
}
private object MongoAPIMetric extends MongoAPIMetric with MongoMetaRecord[MongoAPIMetric] with APIMetrics {
def saveMetric(userId: String, url : String, date : Date) : Unit = {
def saveMetric(userId: String, url : String, date : Date, userName: String, appName: String, developerEmail: String) : Unit = {
MongoAPIMetric.createRecord.
userId(userId).
url(url).
date(date).
userName(userName).
appName(appName).
developerEmail(developerEmail).
save
}

View File

@ -142,7 +142,10 @@ class elasticsearchMetrics extends elasticsearch {
"request" as (
"userId" typed StringType,
"url" typed StringType,
"date" typed DateType
"date" typed DateType,
"userName" typed StringType,
"appName" typed StringType,
"developerEmail" typed StringType
)
)
}
@ -152,14 +155,17 @@ class elasticsearchMetrics extends elasticsearch {
}
}
def indexMetric(userId: String, url: String, date: Date) {
def indexMetric(userId: String, url: String, date: Date, userName: String, appName: String, developerEmail: String) {
if (Props.getBool("allow_elasticsearch", false) && Props.getBool("allow_elasticsearch_metrics", false) ) {
try {
client.execute {
index into esIndex / "request" fields (
"userId" -> userId,
"url" -> url,
"date" -> date
"date" -> date,
"userName" -> userName,
"appName" -> appName,
"developerEmail" -> developerEmail
)
}
}