Module: Yabeda::GraphQL::YabedaTracing

Defined in:
lib/yabeda/graphql/yabeda_tracing.rb

Instance Method Summary collapse

Instance Method Details

#cache(query) ⇒ Object



57
58
59
# File 'lib/yabeda/graphql/yabeda_tracing.rb', line 57

def cache(query)
  query.context.namespace(Yabeda::GraphQL)[:field_call_cache]
end

#execute_field(field:, query:, ast_node:, arguments:, object:, &block) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/yabeda/graphql/yabeda_tracing.rb', line 4

def execute_field(field:, query:, ast_node:, arguments:, object:, &block)
  start = ::Process.clock_gettime ::Process::CLOCK_MONOTONIC
  result = block.call
  duration = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC) - start

  tags = extract_field_tags(field)
  path = query.context.current_path

  if path.length == 1
    return result if query.schema.lazy?(result)

    if query.query?
      instrument_query_execution(tags)
    elsif query.mutation?
      instrument_mutation_execution(tags)
    elsif query.subscription?
      # Not implemented yet
    end
  else
    instrument_field_execution(query, path, tags, duration)
  end

  result
end

#execute_field_lazy(field:, query:, ast_node:, arguments:, object:, &block) ⇒ Object



29
30
31
# File 'lib/yabeda/graphql/yabeda_tracing.rb', line 29

def execute_field_lazy(field:, query:, ast_node:, arguments:, object:, &block)
  execute_field(field: field, query: query, ast_node: ast_node, arguments: arguments, object: object, &block)
end

#extract_field_tags(field) ⇒ Object



33
34
35
36
37
38
39
40
# File 'lib/yabeda/graphql/yabeda_tracing.rb', line 33

def extract_field_tags(field)
  owner = field.respond_to?(:owner) ? field.owner : field.[:type_class].owner
  {
    type: owner.graphql_name,
    field: field.graphql_name,
    deprecated: !field.deprecation_reason.nil?,
  }
end

#instrument_field_execution(query, path, tags, duration) ⇒ Object



42
43
44
45
# File 'lib/yabeda/graphql/yabeda_tracing.rb', line 42

def instrument_field_execution(query, path, tags, duration)
  cache(query)[path][:tags] = tags
  cache(query)[path][:duration] += duration
end

#instrument_mutation_execution(tags) ⇒ Object



47
48
49
50
# File 'lib/yabeda/graphql/yabeda_tracing.rb', line 47

def instrument_mutation_execution(tags)
  tags = { name: tags[:field], deprecated: tags[:deprecated] }
  Yabeda.graphql.mutation_fields_count.increment(tags)
end

#instrument_query_execution(tags) ⇒ Object



52
53
54
55
# File 'lib/yabeda/graphql/yabeda_tracing.rb', line 52

def instrument_query_execution(tags)
  tags = { name: tags[:field], deprecated: tags[:deprecated] }
  Yabeda.graphql.query_fields_count.increment(tags)
end