Class: GQLMetricsTracer

Inherits:
Object
  • Object
show all
Defined in:
lib/gql_metrics_tracer.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(schema_definition) ⇒ GQLMetricsTracer

Returns a new instance of GQLMetricsTracer.



13
14
15
16
17
18
# File 'lib/gql_metrics_tracer.rb', line 13

def initialize(schema_definition)
  @schema_id = nil
  @schema_definition = schema_definition

  publish_schema!
end

Class Method Details

.use(schema_definition, _options = {}) ⇒ Object



7
8
9
10
11
# File 'lib/gql_metrics_tracer.rb', line 7

def self.use(schema_definition, _options = {})
  tracer = new(schema_definition)
  schema_definition.instrument(:query, tracer)
  schema_definition.tracer(tracer)
end

Instance Method Details

#after_query(query) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/gql_metrics_tracer.rb', line 28

def after_query(query)
  ended_at_ns = precise_time
  ended_timestamp = Time.current
  started_at = query.context.dig("gqlmetrics-trace", "starts-timestamp")
  started_at_ns = query.context.dig("gqlmetrics-trace", "starts-ns")
  traces = query.context.dig("gqlmetrics-trace", "traces")

  send_trace!(
    query: query.document.to_query_string,
    duration_ns: ended_at_ns - started_at_ns,
    started_at: started_at,
    ended_at: ended_timestamp,
    traces: traces,
  )
end

#before_query(query) ⇒ Object



20
21
22
23
24
25
26
# File 'lib/gql_metrics_tracer.rb', line 20

def before_query(query)
  query.context["gqlmetrics-trace"] = {
    "starts-ns" => precise_time,
    "starts-timestamp" => Time.current,
    "traces" => [],
  }
end

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



44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/gql_metrics_tracer.rb', line 44

def trace(key, data, &block)
  if key == "execute_field"
    field = data[:context].present? ? data[:context].field : data[:field]
    path = data[:context].present? ? data[:context].path : data[:path]
    parent_type = data[:context].present? ? data[:context].parent_type : data[:owner].graphql_name
    context = data[:context] || data[:object].context

    trace_field!(field: field, path: path, parent_type: parent_type, context: context, &block)
  else
    yield
  end
end