membership-attribute-service/app/monitoring/ErrorHandling.scala (51 lines of code) (raw):

package monitoring import com.gu.monitoring.SafeLogger.LogPrefix import com.gu.monitoring.SafeLogging import controllers.{Cached, NoCache} import filters.AddGuIdentityHeaders import filters.AddGuIdentityHeaders.{identityHeaderNames, xGuIdentityIdHeaderName} import models.ApiErrors.{badRequest, internalError, notFound} import play.api._ import play.api.http.DefaultHttpErrorHandler import play.api.libs.json.Json import play.api.mvc.Results._ import play.api.mvc._ import play.api.routing.Router import play.core.SourceMapper import services.IdentityAuthService import scala.concurrent._ class ErrorHandler( env: Environment, config: Configuration, sourceMapper: Option[SourceMapper], router: => Option[Router], identityAuthService: IdentityAuthService, addGuIdentityHeaders: AddGuIdentityHeaders, )(implicit executionContext: ExecutionContext) extends DefaultHttpErrorHandler(env, config, sourceMapper, router) with SafeLogging { override def onClientError(request: RequestHeader, statusCode: Int, message: String = ""): Future[Result] = { super.onClientError(request, statusCode, message).map(Cached(_)) } override protected def onNotFound(request: RequestHeader, message: String): Future[Result] = { logger.debug(s"Handler not found for request: $request") Future.successful( Cached(NotFound(Json.toJson(notFound))), ) } override protected def onProdServerError(request: RequestHeader, ex: UsefulException): Future[Result] = { // log first to make sure it's not lost logger.errorNoPrefix(scrub"Error handling request request: $request", ex) val result = addGuIdentityHeaders.fromIdapiIfMissing(request, internalError) result.foreach { result: Result => val identityId = result.header.headers.get(xGuIdentityIdHeaderName) val prefix = identityId.getOrElse("no-identity-id") implicit val logPrefix: LogPrefix = LogPrefix(prefix) // now log with the identity id so it appears in searches logger.error(scrub"Error handling request request: $request", ex) } result } override protected def onBadRequest(request: RequestHeader, message: String): Future[Result] = { logServerError(request, new PlayException("Bad request", message)) Future.successful(NoCache(BadRequest(Json.toJson(badRequest(message))))) } }