Module: GraphQL::Tracing::DataDogTrace

Includes:
PlatformTrace
Defined in:
lib/graphql/tracing/data_dog_trace.rb

Instance Method Summary collapse

Methods included from PlatformTrace

#platform_authorized_lazy, #platform_execute_field_lazy, #platform_resolve_type_lazy

Instance Method Details

#authorized(query:, type:, object:) ⇒ Object



120
121
122
123
124
# File 'lib/graphql/tracing/data_dog_trace.rb', line 120

def authorized(query:, type:, object:)
  authorized_span("authorized", object, type, query) do
    super(query: query, type: type, object: object)
  end
end

#authorized_lazy(object:, type:, query:) ⇒ Object



141
142
143
144
145
# File 'lib/graphql/tracing/data_dog_trace.rb', line 141

def authorized_lazy(object:, type:, query:)
  authorized_span("authorized_lazy", object, type, query) do
    super(query: query, type: type, object: object)
  end
end

#authorized_span(span_key, object, type, query) ⇒ Object



126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/graphql/tracing/data_dog_trace.rb', line 126

def authorized_span(span_key, object, type, query)
  platform_key = @platform_key_cache[DataDogTrace].platform_authorized_key_cache[type]
  @tracer.trace(platform_key, service: @service_name) do |span|
    span.span_type = 'custom'
    if defined?(Datadog::Tracing::Metadata::Ext) # Introduced in ddtrace 1.0
      span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, 'graphql')
      span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION, span_key)
    end
    if @has_prepare_span
      prepare_span(span_key, {object: object, type: type, query: query}, span)
    end
    yield
  end
end

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



108
109
110
111
112
# File 'lib/graphql/tracing/data_dog_trace.rb', line 108

def execute_field(query:, field:, ast_node:, arguments:, object:)
  execute_field_span("execute_field", query, field, ast_node, arguments, object) do
    super(query: query, field: field, ast_node: ast_node, arguments: arguments, object: object)
  end
end

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



114
115
116
117
118
# File 'lib/graphql/tracing/data_dog_trace.rb', line 114

def execute_field_lazy(query:, field:, ast_node:, arguments:, object:)
  execute_field_span("execute_field_lazy", query, field, ast_node, arguments, object) do
    super(query: query, field: field, ast_node: ast_node, arguments: arguments, object: object)
  end
end

#execute_field_span(span_key, query, field, ast_node, arguments, object) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/graphql/tracing/data_dog_trace.rb', line 79

def execute_field_span(span_key, query, field, ast_node, arguments, object)
  return_type = field.type.unwrap
  trace_field = if return_type.kind.scalar? || return_type.kind.enum?
    (field.trace.nil? && @trace_scalars) || field.trace
  else
    true
  end
  platform_key = if trace_field
    @platform_key_cache[DataDogTrace].platform_field_key_cache[field]
  else
    nil
  end
  if platform_key && trace_field
    @tracer.trace(platform_key, service: @service_name) do |span|
      span.span_type = 'custom'
      if defined?(Datadog::Tracing::Metadata::Ext) # Introduced in ddtrace 1.0
        span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, 'graphql')
        span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION, span_key)
      end
      if @has_prepare_span
        prepare_span_data = { query: query, field: field, ast_node: ast_node, arguments: arguments, object: object }
        prepare_span(span_key, prepare_span_data, span)
      end
      yield
    end
  else
    yield
  end
end

#initialize(tracer: nil, analytics_enabled: false, analytics_sample_rate: 1.0, service: "ruby-graphql", **rest) ⇒ Object

Parameters:

  • analytics_enabled (Boolean) (defaults to: false)

    Deprecated

  • analytics_sample_rate (Float) (defaults to: 1.0)

    Deprecated



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/graphql/tracing/data_dog_trace.rb', line 8

def initialize(tracer: nil, analytics_enabled: false, analytics_sample_rate: 1.0, service: "ruby-graphql", **rest)
  if tracer.nil?
    tracer = defined?(Datadog::Tracing) ? Datadog::Tracing : Datadog.tracer
  end
  @tracer = tracer

  analytics_available = defined?(Datadog::Contrib::Analytics) \
      && Datadog::Contrib::Analytics.respond_to?(:enabled?) \
      && Datadog::Contrib::Analytics.respond_to?(:set_sample_rate)

  @analytics_enabled = analytics_available && Datadog::Contrib::Analytics.enabled?(analytics_enabled)
  @analytics_sample_rate = analytics_sample_rate
  @service_name = service
  @has_prepare_span = respond_to?(:prepare_span)
  super
end

#platform_authorized_key(type) ⇒ Object



187
188
189
# File 'lib/graphql/tracing/data_dog_trace.rb', line 187

def platform_authorized_key(type)
  "#{type.graphql_name}.authorized"
end

#platform_field_key(field) ⇒ Object

Implement this method in a subclass to apply custom tags to datadog spans def prepare_span(key, data, span) end

Parameters:

  • key (String)

    The event being traced

  • data (Hash)

    The runtime data for this event (@see GraphQL::Tracing for keys for each event)

  • span (Datadog::Tracing::SpanOperation)

    The datadog span for this event



183
184
185
# File 'lib/graphql/tracing/data_dog_trace.rb', line 183

def platform_field_key(field)
  field.path
end

#platform_resolve_type_key(type) ⇒ Object



191
192
193
# File 'lib/graphql/tracing/data_dog_trace.rb', line 191

def platform_resolve_type_key(type)
  "#{type.graphql_name}.resolve_type"
end

#resolve_type(object:, type:, query:) ⇒ Object



147
148
149
150
151
# File 'lib/graphql/tracing/data_dog_trace.rb', line 147

def resolve_type(object:, type:, query:)
  resolve_type_span("resolve_type", object, type, query) do
    super(object: object, query: query, type: type)
  end
end

#resolve_type_lazy(object:, type:, query:) ⇒ Object



153
154
155
156
157
# File 'lib/graphql/tracing/data_dog_trace.rb', line 153

def resolve_type_lazy(object:, type:, query:)
  resolve_type_span("resolve_type_lazy", object, type, query) do
    super(object: object, query: query, type: type)
  end
end

#resolve_type_span(span_key, object, type, query) ⇒ Object



159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/graphql/tracing/data_dog_trace.rb', line 159

def resolve_type_span(span_key, object, type, query)
  platform_key = @platform_key_cache[DataDogTrace].platform_resolve_type_key_cache[type]
  @tracer.trace(platform_key, service: @service_name) do |span|
    span.span_type = 'custom'
    if defined?(Datadog::Tracing::Metadata::Ext) # Introduced in ddtrace 1.0
      span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, 'graphql')
      span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION, span_key)
    end
    if @has_prepare_span
      prepare_span(span_key, {object: object, type: type, query: query}, span)
    end
    yield
  end
end