diff options
author | vlad <vlad@drivergrp.com> | 2016-08-08 13:02:59 -0700 |
---|---|---|
committer | vlad <vlad@drivergrp.com> | 2016-08-08 13:02:59 -0700 |
commit | 69560f6ebe82a56755dccbb1ba35d7a93d0dd69b (patch) | |
tree | f04a80c72a512e9c446ea2ff85ada64b4499c6fe /src/main | |
parent | 350f0bd10e65c3d60dfab546d3a375ff3990a614 (diff) | |
download | driver-core-69560f6ebe82a56755dccbb1ba35d7a93d0dd69b.tar.gz driver-core-69560f6ebe82a56755dccbb1ba35d7a93d0dd69b.tar.bz2 driver-core-69560f6ebe82a56755dccbb1ba35d7a93d0dd69b.zip |
Common error handling for requests
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/scala/com/drivergrp/core/app.scala | 24 |
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) = { |