aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlad <vlad@drivergrp.com>2016-08-08 13:02:59 -0700
committervlad <vlad@drivergrp.com>2016-08-08 13:02:59 -0700
commit69560f6ebe82a56755dccbb1ba35d7a93d0dd69b (patch)
treef04a80c72a512e9c446ea2ff85ada64b4499c6fe
parent350f0bd10e65c3d60dfab546d3a375ff3990a614 (diff)
downloaddriver-core-69560f6ebe82a56755dccbb1ba35d7a93d0dd69b.tar.gz
driver-core-69560f6ebe82a56755dccbb1ba35d7a93d0dd69b.tar.bz2
driver-core-69560f6ebe82a56755dccbb1ba35d7a93d0dd69b.zip
Common error handling for requests
-rw-r--r--src/main/scala/com/drivergrp/core/app.scala24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/main/scala/com/drivergrp/core/app.scala b/src/main/scala/com/drivergrp/core/app.scala
index 24b2120..ba18e92 100644
--- a/src/main/scala/com/drivergrp/core/app.scala
+++ b/src/main/scala/com/drivergrp/core/app.scala
@@ -3,10 +3,11 @@ package com.drivergrp.core
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
-import akka.http.scaladsl.model.StatusCodes
+import akka.http.scaladsl.model.{HttpResponse, StatusCodes}
import akka.http.scaladsl.server.Directives._
+import StatusCodes._
import akka.http.scaladsl.server.RouteResult._
-import akka.http.scaladsl.server.{Route, RouteConcatenation}
+import akka.http.scaladsl.server.{ExceptionHandler, Route, RouteConcatenation}
import akka.stream.ActorMaterializer
import com.drivergrp.core.logging.{Logger, TypesafeScalaLogger}
import com.drivergrp.core.rest.Swagger
@@ -57,10 +58,21 @@ object app {
val swaggerRoutes = swaggerService.routes ~ swaggerService.swaggerUI
val versionRt = versionRoute(version, buildNumber)
- val _ = http.bindAndHandle(
- route2HandlerFlow(logRequestResult("log")(modules.map(_.route).foldLeft(versionRt ~ swaggerRoutes)(_ ~ _))),
- interface,
- port)(materializer)
+ val generalExceptionHandler = ExceptionHandler {
+ case t: Throwable =>
+ extractUri { uri =>
+ // TODO: extract `requestUuid` from request or thread, provided by linkerd/zipkin
+ def requestUuid = java.util.UUID.randomUUID.toString
+
+ log.error(s"Request to $uri could not be handled normally ($requestUuid)", t)
+ complete(HttpResponse(InternalServerError,
+ entity = s"""{ "requestUuid": "$requestUuid", "message": "${t.getMessage}" }"""))
+ }
+ }
+
+ val _ = http.bindAndHandle(route2HandlerFlow(handleExceptions(generalExceptionHandler) {
+ logRequestResult("log")(modules.map(_.route).foldLeft(versionRt ~ swaggerRoutes)(_ ~ _))
+ }), interface, port)(materializer)
}
protected def versionRoute(version: String, buildNumber: Int) = {