class GraphQL::Tracing
Public Instance Methods
after_query(query)
click to toggle source
# File lib/graphql/tracing.rb, line 20 def after_query(query) result = query.result end_time = Time.now.utc duration_nanos = duration_nanos(start_time: query.context['graphql-tracing']['start_time'], end_time: end_time) result["extensions"] ||= {} result["extensions"]["tracing"] = { "version" => 1, "startTime" => query.context['graphql-tracing']['start_time'].strftime('%FT%T.%3NZ'), "endTime" => end_time.strftime('%FT%T.%3NZ'), "duration" => duration_nanos, "execution" => { "resolvers" => query.context['graphql-tracing']['resolvers'] } } end
before_query(query)
click to toggle source
# File lib/graphql/tracing.rb, line 13 def before_query(query) query.context['graphql-tracing'] = { 'start_time' => Time.now.utc, 'resolvers' => [] } end
instrument(type, field)
click to toggle source
# File lib/graphql/tracing.rb, line 37 def instrument(type, field) old_resolve_proc = field.resolve_proc new_resolve_proc = ->(obj, args, ctx) do resolve_start_time = Time.now.utc result = old_resolve_proc.call(obj, args, ctx) resolve_end_time = Time.now.utc ctx['graphql-tracing']['resolvers'] << { 'path' => ctx.path, 'parentType' => type.name, 'fieldName' => field.name, 'returnType' => field.type.to_s, 'startOffset' => duration_nanos(start_time: ctx['graphql-tracing']['start_time'], end_time: resolve_start_time), 'duration' => duration_nanos(start_time: resolve_start_time, end_time: resolve_end_time) } result end field.redefine { resolve(new_resolve_proc) } end
use(schema_definition)
click to toggle source
# File lib/graphql/tracing.rb, line 8 def use(schema_definition) schema_definition.instrument(:query, self) schema_definition.instrument(:field, self) end
Private Instance Methods
duration_nanos(start_time:, end_time:)
click to toggle source
# File lib/graphql/tracing.rb, line 62 def duration_nanos(start_time:, end_time:) ((end_time.to_f - start_time.to_f) * 1e9).to_i end