getsentry / sentry-ruby

Sentry SDK for Ruby
https://sentry.io/for/ruby
MIT License
927 stars 493 forks source link

Add AR query time to breadcrumbs #2283

Open sobrinho opened 5 months ago

sobrinho commented 5 months ago

Describe the idea

We have breadcrumbs with the query like:

{
  name: Employee Pluck,
  sql: SELECT DISTINCT "employees"."person_id" FROM "employees" WHERE "employees"."company_id" IN ('x', 'y', 'z'),
  statement_name: null
}

Would be helpful to have the timing of that query together with the breadcrumb:

{
  name: Employee Pluck,
  sql: SELECT DISTINCT "employees"."person_id" FROM "employees" WHERE "employees"."company_id" IN ('x', 'y', 'z'),
  statement_name: null,
  duration: 5.1234 // ms
}

Why do you think it's beneficial to most of the users

That will help with exceptions that might be caused due to slow endpoints such as graphql timeout middleware, rack-timeout and etc.

Possible implementation

https://github.com/getsentry/sentry-ruby/blob/master/sentry-rails/lib/sentry/rails/breadcrumb/active_support_logger.rb#L14-L18

Could be something like:

crumb = Sentry::Breadcrumb.new(
  data: data,
  category: name,
  timestamp: started.to_i,
  duration: started - finished
)
sl0thentr0py commented 5 months ago

yep i can add, but also you can probably try out our Performance product and you'll get much more visibility into such things :) https://docs.sentry.io/platforms/ruby/performance/ https://docs.sentry.io/platforms/ruby/performance/instrumentation/automatic-instrumentation/

sobrinho commented 5 months ago

Indeed but the point here is to track times from a very specific exception.

So, if a Rack::Timeout exception happens for instance, I can see the exception and go straight to the query that took too long to execute.

sl0thentr0py commented 5 months ago

we connect errors and traces together, so you can neatly go from a particular exception to the span waterfall for that entire request and can see the query immediately.

sobrinho commented 5 months ago

Every error is traced on the performance? What happens with the sampling in that case?