Squash nested sinatra/rack request span
Motivation
For Sinatra/Rack instrumentation, the middleware stack architecture renders nested flamegraph for span. Although it is technically correct, the user experience with such UI is suboptimal.

What does this PR do?
Instead of instrumenting nested middleware stack of Sinatra or Rack, the implementation changes to only instrument the top of the stack. This means the UI would display only one rack.request and sinatra.request.
Some changes followed after skipping the subsequent middlewares:
-
sinatra.app.nametag is removed from thesinatra.requestspan, but still present forsinatra.routespan. Since the app name only make sense when a route is matched by its individual app. - When no route matched,
sinatra.requestspan would no longer tagged withsinatra.route.path, since none of the route matched(sinatra.routespan is absent as well).
Other improvement: Configuration is all it needs to instrument Sinatra, no longer need to register for each Sinatra app.
For Classic Sinatra app

For Modular Sinatra app with Sinatra::Router
class Acme < Sinatra::Base
# # Use Sinatra::Router to mount different modular Sinatra applications
use Sinatra::Router do
mount ::Health
mount ::Basic
end

For Modular Sinatra app chaining with use
class Acme < Sinatra::Base
# # Use Sinatra App as middleware
use Health
use Basic
