grape icon indicating copy to clipboard operation
grape copied to clipboard

`endpoint_run.grape` callback is called without middlewares

Open Kukunin opened this issue 5 years ago • 1 comments

Hello. I'm trying to add the monitoring by subscribing to 'endpoint_run.grape' via ActiveSupport::Notifications.subscribe.

It works well until an exception occurs inside API. I have a bunch of rescue_from blocks to return different status codes depending on exceptions, such as

rescue_from ActiveRecord::RecordNotFound do
  error!({ error: :not_found }, 404)
end

The problem is when I call an endpoint which raises ActiveRecord::RecordNotFound, it really returns 404 status code, but in my callback data[:endpoint].status is still 200 (however data[:exception_object] is not null).

A quick look at the code shows, that callback wraps only the main call, without middlewares. I believe, it should wrap middlewares too because:

  • middlewares are part of the business logic. It's not good to have 404 returned to a client and 200 reported to the monitoring.
  • timing will be more accurate because the middlewares can eat time too.

Kukunin avatar Mar 12 '20 19:03 Kukunin

This does look like a bug, or something that maybe we can address in a backward compatible way, appreciate a PR.

dblock avatar Mar 13 '20 13:03 dblock