Class: GraphQL::Metrics::Tracer

Inherits:
Object
  • Object
show all
Includes:
Trace
Defined in:
lib/graphql/metrics/tracer.rb

Constant Summary collapse

GRAPHQL_GEM_EXECUTE_MULTIPLEX_KEY =

NOTE: These constants come from the graphql ruby gem and are in “chronological” order based on the phases of execution of the graphql-ruby gem, though old versions of the gem aren’t always consistent about this (see github.com/rmosolgo/graphql-ruby/issues/3393). Most of them can be run multiple times when multiplexing multiple queries.

'execute_multiplex'
GRAPHQL_GEM_LEXING_KEY =

wraps everything below this line; only run once

'lex'
GRAPHQL_GEM_PARSING_KEY =

may not trigger if the query is passed in pre-parsed

'parse'
GRAPHQL_GEM_VALIDATION_KEY =

may not trigger if the query is passed in pre-parsed

'validate'
GRAPHQL_GEM_ANALYZE_MULTIPLEX_KEY =

wraps all ‘analyze_query`s; only run once

'analyze_multiplex'
GRAPHQL_GEM_ANALYZE_QUERY_KEY =
'analyze_query'
GRAPHQL_GEM_EXECUTE_QUERY_KEY =
'execute_query'
GRAPHQL_GEM_TRACING_FIELD_KEYS =
[
  GRAPHQL_GEM_TRACING_FIELD_KEY = 'execute_field',
  GRAPHQL_GEM_TRACING_LAZY_FIELD_KEY = 'execute_field_lazy'
]

Instance Method Summary collapse

Methods included from Trace

#analyze_multiplex, #analyze_query, #execute_field, #execute_field_lazy, #execute_multiplex, #execute_query, #lex, #parse, #validate

Constructor Details

#initializeTracer

Returns a new instance of Tracer.



24
25
26
# File 'lib/graphql/metrics/tracer.rb', line 24

def initialize
  # no-op, but don't want the behavior from GraphQL::Metrics::Trace
end

Instance Method Details

#trace(key, data, &block) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/graphql/metrics/tracer.rb', line 28

def trace(key, data, &block)
  # NOTE: Context doesn't exist yet during lexing, parsing.
  context = data[:query]&.context
  skip_tracing = context&.fetch(GraphQL::Metrics::SKIP_GRAPHQL_METRICS_ANALYSIS, false)
  return yield if skip_tracing

  case key
  when GRAPHQL_GEM_EXECUTE_MULTIPLEX_KEY
    return capture_multiplex_start_time(&block)
  when GRAPHQL_GEM_LEXING_KEY
    return capture_lexing_time(&block)
  when GRAPHQL_GEM_PARSING_KEY
    return capture_parsing_time(&block)
  when GRAPHQL_GEM_VALIDATION_KEY
    return capture_validation_time(context, &block)
  when GRAPHQL_GEM_ANALYZE_MULTIPLEX_KEY
    # Ensures that we reset potentially long-lived PreContext objects between multiplexs. We reset at this point
    # since all parsing and validation will be done by this point, and a GraphQL::Query::Context will exist.
    pre_context.reset
    return yield
  when GRAPHQL_GEM_ANALYZE_QUERY_KEY
    return capture_analysis_time(context, &block)
  when GRAPHQL_GEM_EXECUTE_QUERY_KEY
    capture_query_start_time(context, &block)
  when *GRAPHQL_GEM_TRACING_FIELD_KEYS
    return yield if context[SKIP_FIELD_AND_ARGUMENT_METRICS]
    return yield unless GraphQL::Metrics.timings_capture_enabled?(data[:query].context)

    context_key = case key
    when GRAPHQL_GEM_TRACING_FIELD_KEY
      GraphQL::Metrics::INLINE_FIELD_TIMINGS
    when GRAPHQL_GEM_TRACING_LAZY_FIELD_KEY
      GraphQL::Metrics::LAZY_FIELD_TIMINGS
    end

    trace_field(context_key, data[:query], &block)
  else
    return yield
  end
end