ruby-grape / grape

An opinionated framework for creating REST-like APIs in Ruby.
http://www.ruby-grape.org
MIT License
9.88k stars 1.22k forks source link

Sentry transaction name #2351

Open mbajur opened 12 months ago

mbajur commented 12 months ago

Hello! I'm using Grape gem in one of my production apps. This app also uses Sentry for error reporting and performance monitoring. This issue is not strictly tied to grape but - for some reason, Sentry transaction naming works fine for regular rails controllers and actions but not for grape ones. It uses request URL instead. So, for regular rails transactions i'm getting Doorkeeper::TokensController#create while for grape actions, i'm getting /api/v1/records/1 etc. This thing can be configured by using Sentry.configure_scope { |scope| scope.set_transaction_name("MyController#my_action") } before the actual transaction and i was wondering:

Is that possible to access current resource and action names in before filter of my grape api, globally? By globally i mean not separately in each resource but rather in the parent Base < Grape::API class.

Thanks in advance for any clues

dblock commented 12 months ago

It depends on what you mean by "resource". Grape generates anonymous methods when you write get do ..., so it's unlike Rails which has a controller class with a create method.

The current endpoint serving the request is self in the context of the request, and env[Grape::Env::API_ENDPOINT] elsewhere, so you should be able to get started with that. There might be some complications with multiple routes.

In general, I'd like to be able to add Sentry in the list of https://github.com/ruby-grape/grape#monitoring-products. Take a look at the implementations of those, maybe you'll find exactly what you're looking for or adapt something?

numbata commented 2 months ago

It looks feasible using the same approach as in Datadog Instrumentation. See the usage of the api_view method.