snowplow-incubator / sauna

:hotsprings: A decisioning and response platform
https://github.com/snowplow/sauna/wiki
69 stars 11 forks source link

Move Command-parsing logic out of responders #103

Open chuwy opened 7 years ago

chuwy commented 7 years ago

Currently, if Kinesis passes invalid JSON - responders naively trying to parse and then printing stacktrace into stdout:

NOTIFICATION: [Received Kinesis Record from anton-smoke-test].
[ERROR] [08/14/2017 15:28:26.283] [sauna-akka.actor.default-dispatcher-2] [akka://sauna/user/$a/me.chuwy.MyHipchatResponder] Unrecognized token 'foo': was expecting 'null', 'true', 'false' or NaN
 at [Source: foo; line: 1, column: 7]
com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'foo': was expecting 'null', 'true', 'false' or NaN
 at [Source: foo; line: 1, column: 7]
        at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1581)
        at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:533)
        at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._reportInvalidToken(ReaderBasedJsonParser.java:2462)
        at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._reportInvalidToken(ReaderBasedJsonParser.java:2439)
        at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._matchToken(ReaderBasedJsonParser.java:2291)
        at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._matchFalse(ReaderBasedJsonParser.java:2258)
        at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:661)
        at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3776)
        at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3694)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2005)
        at play.api.libs.json.jackson.JacksonJson$.parseJsValue(JacksonJson.scala:226)
        at play.api.libs.json.Json$.parse(Json.scala:21)
        at com.snowplowanalytics.sauna.responders.hipchat.SendRoomNotificationResponder.extractEvent(SendRoomNotificationResponder.scala:47)
        at com.snowplowanalytics.sauna.responders.Responder$$anonfun$receive$1.applyOrElse(Responder.scala:50)
        at akka.actor.Actor$class.aroundReceive(Actor.scala:484)
        at com.snowplowanalytics.sauna.responders.hipchat.SendRoomNotificationResponder.aroundReceive(SendRoomNotificationResponder.scala:43)
        at akka.actor.ActorCell.receiveMessage(ActorCell.scala:526)
        at akka.actor.ActorCell.invoke(ActorCell.scala:495)
        at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257)
        at akka.dispatch.Mailbox.run(Mailbox.scala:224)
        at akka.dispatch.Mailbox.exec(Mailbox.scala:234)
        at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
        at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
        at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
        at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

Instead, this should be handled much earlier and "Invalid command" message should be logged.