-
Notifications
You must be signed in to change notification settings - Fork 107
Description
Hi! I'm working on improving the Scout integration for GraphQL-Ruby. My library sometimes spins up new Fibers, runs them for a while, then pauses them ... then resumes them again. I'd like a way to report the duration while the Fiber is running, but not while it's paused. I think the best approach here is to make two separate spans: one before the pause and one after it.
However, the catch is, the library doesn't know when (or where in the code) the Fiber will be paused. I can't wrap the before-part in a do ... end block -- instead, code runs ... then eventually it may yield. So I'm looking for a way to start a new span, then manually finish it when I observe that Fiber pause. Is there a supported way to do this?
For now, I'm going to use the internal implementation from .implement:
scout_apm_ruby/lib/scout_apm/tracer.rb
Lines 24 to 39 in eebbc5f
| def self.instrument(type, name, options={}) # Takes a block | |
| layer = ScoutApm::Layer.new(type, name) | |
| layer.desc = options[:desc] if options[:desc] | |
| layer.subscopable! if options[:scope] | |
| req = ScoutApm::RequestManager.lookup | |
| req.start_layer(layer) | |
| req.ignore_children! if options[:ignore_children] | |
| begin | |
| yield | |
| ensure | |
| req.acknowledge_children! if options[:ignore_children] | |
| req.stop_layer | |
| end | |
| end |
Basically I'll separate those two parts -- before yield and after it -- and call them as needed. But if there's a better way, I'd like to use it! Thanks.