graphql 1.13.19 → 2.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of graphql might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/generators/graphql/install_generator.rb +1 -1
- data/lib/generators/graphql/relay.rb +3 -17
- data/lib/generators/graphql/templates/schema.erb +3 -0
- data/lib/graphql/analysis/ast/field_usage.rb +3 -1
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +1 -1
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +43 -36
- data/lib/graphql/analysis/ast.rb +2 -12
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/table.rb +2 -20
- data/lib/graphql/backtrace/tracer.rb +2 -3
- data/lib/graphql/backtrace.rb +2 -8
- data/lib/graphql/dataloader/null_dataloader.rb +3 -1
- data/lib/graphql/dataloader/source.rb +9 -0
- data/lib/graphql/dataloader.rb +4 -1
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/execution/errors.rb +12 -82
- data/lib/graphql/execution/interpreter/resolve.rb +26 -0
- data/lib/graphql/execution/interpreter/runtime.rb +162 -119
- data/lib/graphql/execution/interpreter.rb +187 -78
- data/lib/graphql/execution/lazy.rb +7 -21
- data/lib/graphql/execution/lookahead.rb +44 -40
- data/lib/graphql/execution/multiplex.rb +3 -174
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +2 -15
- data/lib/graphql/introspection/type_type.rb +8 -1
- data/lib/graphql/introspection.rb +4 -3
- data/lib/graphql/language/document_from_schema_definition.rb +18 -35
- data/lib/graphql/language/lexer.rb +216 -1488
- data/lib/graphql/language/lexer.ri +744 -0
- data/lib/graphql/language/nodes.rb +41 -33
- data/lib/graphql/language/parser.rb +375 -363
- data/lib/graphql/language/parser.y +48 -43
- data/lib/graphql/language/printer.rb +37 -21
- data/lib/graphql/language/visitor.rb +191 -83
- data/lib/graphql/pagination/active_record_relation_connection.rb +0 -8
- data/lib/graphql/pagination/array_connection.rb +4 -2
- data/lib/graphql/pagination/connection.rb +31 -4
- data/lib/graphql/pagination/connections.rb +3 -28
- data/lib/graphql/pagination/relation_connection.rb +2 -0
- data/lib/graphql/query/context.rb +155 -196
- data/lib/graphql/query/input_validation_result.rb +1 -1
- data/lib/graphql/query/null_context.rb +0 -3
- data/lib/graphql/query/validation_pipeline.rb +10 -34
- data/lib/graphql/query/variables.rb +7 -20
- data/lib/graphql/query.rb +32 -42
- data/lib/graphql/railtie.rb +0 -104
- data/lib/graphql/rake_task/validate.rb +1 -1
- data/lib/graphql/rake_task.rb +29 -1
- data/lib/graphql/relay/range_add.rb +9 -20
- data/lib/graphql/relay.rb +0 -15
- data/lib/graphql/schema/addition.rb +7 -9
- data/lib/graphql/schema/argument.rb +36 -43
- data/lib/graphql/schema/build_from_definition.rb +32 -18
- data/lib/graphql/schema/directive/one_of.rb +12 -0
- data/lib/graphql/schema/directive/transform.rb +1 -1
- data/lib/graphql/schema/directive.rb +11 -22
- data/lib/graphql/schema/enum.rb +28 -39
- data/lib/graphql/schema/enum_value.rb +5 -25
- data/lib/graphql/schema/field/connection_extension.rb +4 -0
- data/lib/graphql/schema/field.rb +214 -327
- data/lib/graphql/schema/input_object.rb +56 -67
- data/lib/graphql/schema/interface.rb +0 -35
- data/lib/graphql/schema/introspection_system.rb +3 -8
- data/lib/graphql/schema/late_bound_type.rb +8 -2
- data/lib/graphql/schema/list.rb +0 -6
- data/lib/graphql/schema/loader.rb +1 -2
- data/lib/graphql/schema/member/base_dsl_methods.rb +15 -19
- data/lib/graphql/schema/member/build_type.rb +5 -7
- data/lib/graphql/schema/member/has_arguments.rb +144 -53
- data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
- data/lib/graphql/schema/member/has_directives.rb +71 -56
- data/lib/graphql/schema/member/has_fields.rb +15 -3
- data/lib/graphql/schema/member/has_interfaces.rb +47 -18
- data/lib/graphql/schema/member/has_validators.rb +31 -5
- data/lib/graphql/schema/member/relay_shortcuts.rb +28 -2
- data/lib/graphql/schema/member/type_system_helpers.rb +17 -0
- data/lib/graphql/schema/member/validates_input.rb +1 -1
- data/lib/graphql/schema/member.rb +0 -6
- data/lib/graphql/schema/mutation.rb +0 -9
- data/lib/graphql/schema/non_null.rb +1 -7
- data/lib/graphql/schema/object.rb +15 -52
- data/lib/graphql/schema/relay_classic_mutation.rb +53 -42
- data/lib/graphql/schema/resolver/has_payload_type.rb +20 -10
- data/lib/graphql/schema/resolver.rb +41 -42
- data/lib/graphql/schema/scalar.rb +7 -22
- data/lib/graphql/schema/subscription.rb +0 -7
- data/lib/graphql/schema/timeout.rb +24 -28
- data/lib/graphql/schema/type_membership.rb +3 -0
- data/lib/graphql/schema/union.rb +10 -17
- data/lib/graphql/schema/warden.rb +23 -6
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +240 -968
- data/lib/graphql/static_validation/all_rules.rb +1 -0
- data/lib/graphql/static_validation/base_visitor.rb +4 -21
- data/lib/graphql/static_validation/definition_dependencies.rb +7 -1
- data/lib/graphql/static_validation/error.rb +2 -2
- data/lib/graphql/static_validation/literal_validator.rb +19 -1
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +11 -5
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +12 -12
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +12 -6
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +1 -1
- data/lib/graphql/static_validation/validator.rb +3 -25
- data/lib/graphql/static_validation.rb +0 -2
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +7 -1
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +38 -1
- data/lib/graphql/subscriptions/event.rb +3 -8
- data/lib/graphql/subscriptions/instrumentation.rb +0 -51
- data/lib/graphql/subscriptions.rb +32 -20
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/appoptics_trace.rb +231 -0
- data/lib/graphql/tracing/appsignal_trace.rb +66 -0
- data/lib/graphql/tracing/data_dog_trace.rb +148 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +2 -0
- data/lib/graphql/tracing/new_relic_trace.rb +75 -0
- data/lib/graphql/tracing/notifications_trace.rb +41 -0
- data/lib/graphql/tracing/platform_trace.rb +107 -0
- data/lib/graphql/tracing/platform_tracing.rb +26 -41
- data/lib/graphql/tracing/prometheus_trace.rb +89 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +3 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/statsd_trace.rb +56 -0
- data/lib/graphql/tracing.rb +136 -40
- data/lib/graphql/type_kinds.rb +6 -3
- data/lib/graphql/types/iso_8601_date.rb +4 -1
- data/lib/graphql/types/iso_8601_date_time.rb +4 -0
- data/lib/graphql/types/relay/base_connection.rb +16 -6
- data/lib/graphql/types/relay/connection_behaviors.rb +5 -25
- data/lib/graphql/types/relay/default_relay.rb +5 -9
- data/lib/graphql/types/relay/edge_behaviors.rb +1 -4
- data/lib/graphql/types/relay/node_behaviors.rb +5 -1
- data/lib/graphql/types/relay.rb +0 -2
- data/lib/graphql/types/string.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +11 -72
- metadata +31 -132
- data/lib/graphql/analysis/analyze_query.rb +0 -98
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -131
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
- data/lib/graphql/backwards_compatibility.rb +0 -61
- data/lib/graphql/base_type.rb +0 -232
- data/lib/graphql/boolean_type.rb +0 -2
- data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
- data/lib/graphql/compatibility/execution_specification.rb +0 -436
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
- data/lib/graphql/compatibility.rb +0 -5
- data/lib/graphql/define/assign_argument.rb +0 -12
- data/lib/graphql/define/assign_connection.rb +0 -13
- data/lib/graphql/define/assign_enum_value.rb +0 -18
- data/lib/graphql/define/assign_global_id_field.rb +0 -11
- data/lib/graphql/define/assign_mutation_function.rb +0 -34
- data/lib/graphql/define/assign_object_field.rb +0 -42
- data/lib/graphql/define/defined_object_proxy.rb +0 -53
- data/lib/graphql/define/instance_definable.rb +0 -255
- data/lib/graphql/define/no_definition_error.rb +0 -7
- data/lib/graphql/define/non_null_with_bang.rb +0 -16
- data/lib/graphql/define/type_definer.rb +0 -31
- data/lib/graphql/define.rb +0 -31
- data/lib/graphql/deprecated_dsl.rb +0 -55
- data/lib/graphql/directive/deprecated_directive.rb +0 -2
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -107
- data/lib/graphql/enum_type.rb +0 -133
- data/lib/graphql/execution/execute.rb +0 -333
- data/lib/graphql/execution/flatten.rb +0 -40
- data/lib/graphql/execution/instrumentation.rb +0 -92
- data/lib/graphql/execution/lazy/resolve.rb +0 -91
- data/lib/graphql/execution/typecast.rb +0 -50
- data/lib/graphql/field/resolve.rb +0 -59
- data/lib/graphql/field.rb +0 -226
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -128
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -138
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -72
- data/lib/graphql/internal_representation/document.rb +0 -27
- data/lib/graphql/internal_representation/node.rb +0 -206
- data/lib/graphql/internal_representation/print.rb +0 -51
- data/lib/graphql/internal_representation/rewrite.rb +0 -184
- data/lib/graphql/internal_representation/scope.rb +0 -88
- data/lib/graphql/internal_representation/visit.rb +0 -36
- data/lib/graphql/internal_representation.rb +0 -7
- data/lib/graphql/language/lexer.rl +0 -260
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/non_null_type.rb +0 -71
- data/lib/graphql/object_type.rb +0 -130
- data/lib/graphql/query/arguments.rb +0 -189
- data/lib/graphql/query/arguments_cache.rb +0 -24
- data/lib/graphql/query/executor.rb +0 -52
- data/lib/graphql/query/literal_input.rb +0 -136
- data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
- data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
- data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
- data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
- data/lib/graphql/query/serial_execution.rb +0 -40
- data/lib/graphql/relay/array_connection.rb +0 -83
- data/lib/graphql/relay/base_connection.rb +0 -189
- data/lib/graphql/relay/connection_instrumentation.rb +0 -54
- data/lib/graphql/relay/connection_resolve.rb +0 -43
- data/lib/graphql/relay/connection_type.rb +0 -54
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -19
- data/lib/graphql/relay/edges_instrumentation.rb +0 -39
- data/lib/graphql/relay/global_id_resolve.rb +0 -17
- data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
- data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
- data/lib/graphql/relay/mutation/resolve.rb +0 -56
- data/lib/graphql/relay/mutation/result.rb +0 -38
- data/lib/graphql/relay/mutation.rb +0 -106
- data/lib/graphql/relay/node.rb +0 -39
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -188
- data/lib/graphql/relay/type_extensions.rb +0 -32
- data/lib/graphql/scalar_type.rb +0 -91
- data/lib/graphql/schema/catchall_middleware.rb +0 -35
- data/lib/graphql/schema/default_parse_error.rb +0 -10
- data/lib/graphql/schema/default_type_error.rb +0 -17
- data/lib/graphql/schema/member/accepts_definition.rb +0 -164
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -58
- data/lib/graphql/schema/member/instrumentation.rb +0 -131
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -44
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -88
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -313
- data/lib/graphql/static_validation/default_visitor.rb +0 -15
- data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/subscription_root.rb +0 -76
- data/lib/graphql/tracing/skylight_tracing.rb +0 -70
- data/lib/graphql/types/relay/node_field.rb +0 -24
- data/lib/graphql/types/relay/nodes_field.rb +0 -43
- data/lib/graphql/union_type.rb +0 -115
- data/lib/graphql/upgrader/member.rb +0 -937
- data/lib/graphql/upgrader/schema.rb +0 -38
@@ -5,7 +5,6 @@ require "graphql/subscriptions/event"
|
|
5
5
|
require "graphql/subscriptions/instrumentation"
|
6
6
|
require "graphql/subscriptions/serialize"
|
7
7
|
require "graphql/subscriptions/action_cable_subscriptions"
|
8
|
-
require "graphql/subscriptions/subscription_root"
|
9
8
|
require "graphql/subscriptions/default_subscription_resolve_extension"
|
10
9
|
|
11
10
|
module GraphQL
|
@@ -27,15 +26,12 @@ module GraphQL
|
|
27
26
|
def self.use(defn, options = {})
|
28
27
|
schema = defn.is_a?(Class) ? defn : defn.target
|
29
28
|
|
30
|
-
if schema.subscriptions
|
29
|
+
if schema.subscriptions(inherited: false)
|
31
30
|
raise ArgumentError, "Can't reinstall subscriptions. #{schema} is using #{schema.subscriptions}, can't also add #{self}"
|
32
31
|
end
|
33
32
|
|
34
33
|
instrumentation = Subscriptions::Instrumentation.new(schema: schema)
|
35
34
|
defn.instrument(:query, instrumentation)
|
36
|
-
if !schema.is_a?(Class)
|
37
|
-
defn.instrument(:field, instrumentation)
|
38
|
-
end
|
39
35
|
options[:schema] = schema
|
40
36
|
schema.subscriptions = self.new(**options)
|
41
37
|
schema.add_subscription_extension_if_necessary
|
@@ -43,15 +39,14 @@ module GraphQL
|
|
43
39
|
end
|
44
40
|
|
45
41
|
# @param schema [Class] the GraphQL schema this manager belongs to
|
46
|
-
|
42
|
+
# @param validate_update [Boolean] If false, then validation is skipped when executing updates
|
43
|
+
def initialize(schema:, validate_update: true, broadcast: false, default_broadcastable: false, **rest)
|
47
44
|
if broadcast
|
48
|
-
if !schema.using_ast_analysis?
|
49
|
-
raise ArgumentError, "`broadcast: true` requires AST analysis, add `using GraphQL::Analysis::AST` to your schema or see https://graphql-ruby.org/queries/ast_analysis.html."
|
50
|
-
end
|
51
45
|
schema.query_analyzer(Subscriptions::BroadcastAnalyzer)
|
52
46
|
end
|
53
47
|
@default_broadcastable = default_broadcastable
|
54
48
|
@schema = schema
|
49
|
+
@validate_update = validate_update
|
55
50
|
end
|
56
51
|
|
57
52
|
# @return [Boolean] Used when fields don't have `broadcastable:` explicitly set
|
@@ -63,17 +58,21 @@ module GraphQL
|
|
63
58
|
# @param args [Hash<String, Symbol => Object]
|
64
59
|
# @param object [Object]
|
65
60
|
# @param scope [Symbol, String]
|
61
|
+
# @param context [Hash]
|
66
62
|
# @return [void]
|
67
|
-
def trigger(event_name, args, object, scope: nil)
|
63
|
+
def trigger(event_name, args, object, scope: nil, context: {})
|
64
|
+
# Make something as context-like as possible, even though there isn't a current query:
|
65
|
+
dummy_query = GraphQL::Query.new(@schema, "", validate: false, context: context)
|
66
|
+
context = dummy_query.context
|
68
67
|
event_name = event_name.to_s
|
69
68
|
|
70
69
|
# Try with the verbatim input first:
|
71
|
-
field = @schema.get_field(@schema.subscription, event_name)
|
70
|
+
field = @schema.get_field(@schema.subscription, event_name, context)
|
72
71
|
|
73
72
|
if field.nil?
|
74
73
|
# And if it wasn't found, normalize it:
|
75
74
|
normalized_event_name = normalize_name(event_name)
|
76
|
-
field = @schema.get_field(@schema.subscription, normalized_event_name)
|
75
|
+
field = @schema.get_field(@schema.subscription, normalized_event_name, context)
|
77
76
|
if field.nil?
|
78
77
|
raise InvalidTriggerError, "No subscription matching trigger: #{event_name} (looked for #{@schema.subscription.graphql_name}.#{normalized_event_name})"
|
79
78
|
end
|
@@ -91,6 +90,7 @@ module GraphQL
|
|
91
90
|
arguments: normalized_args,
|
92
91
|
field: field,
|
93
92
|
scope: scope,
|
93
|
+
context: context,
|
94
94
|
)
|
95
95
|
execute_all(event, object)
|
96
96
|
end
|
@@ -117,14 +117,20 @@ module GraphQL
|
|
117
117
|
variables = query_data.fetch(:variables)
|
118
118
|
context = query_data.fetch(:context)
|
119
119
|
operation_name = query_data.fetch(:operation_name)
|
120
|
-
|
120
|
+
execute_options = {
|
121
121
|
query: query_string,
|
122
122
|
context: context,
|
123
123
|
subscription_topic: event.topic,
|
124
124
|
operation_name: operation_name,
|
125
125
|
variables: variables,
|
126
126
|
root_value: object,
|
127
|
-
|
127
|
+
}
|
128
|
+
|
129
|
+
# merge event's and query's context together
|
130
|
+
context.merge!(event.context) unless event.context.nil? || context.nil?
|
131
|
+
|
132
|
+
execute_options[:validate] = validate_update?(**execute_options)
|
133
|
+
result = @schema.execute(**execute_options)
|
128
134
|
subscriptions_context = result.context.namespace(:subscriptions)
|
129
135
|
if subscriptions_context[:no_update]
|
130
136
|
result = nil
|
@@ -142,6 +148,14 @@ module GraphQL
|
|
142
148
|
result
|
143
149
|
end
|
144
150
|
|
151
|
+
# Define this method to customize whether to validate
|
152
|
+
# this subscription when executing an update.
|
153
|
+
#
|
154
|
+
# @return [Boolean] defaults to `true`, or false if `validate: false` is provided.
|
155
|
+
def validate_update?(query:, context:, root_value:, subscription_topic:, operation_name:, variables:)
|
156
|
+
@validate_update
|
157
|
+
end
|
158
|
+
|
145
159
|
# Run the update query for this subscription and deliver it
|
146
160
|
# @see {#execute_update}
|
147
161
|
# @see {#deliver}
|
@@ -233,7 +247,7 @@ module GraphQL
|
|
233
247
|
# @return [Any] normalized arguments value
|
234
248
|
def normalize_arguments(event_name, arg_owner, args, context)
|
235
249
|
case arg_owner
|
236
|
-
when GraphQL::
|
250
|
+
when GraphQL::Schema::Field, Class
|
237
251
|
if arg_owner.is_a?(Class) && !arg_owner.kind.input_object?
|
238
252
|
# it's a type, but not an input object
|
239
253
|
return args
|
@@ -274,9 +288,7 @@ module GraphQL
|
|
274
288
|
end
|
275
289
|
|
276
290
|
if missing_arg_names.any?
|
277
|
-
arg_owner_name = if arg_owner.is_a?(GraphQL::Field)
|
278
|
-
"Subscription.#{arg_owner.name}"
|
279
|
-
elsif arg_owner.is_a?(GraphQL::Schema::Field)
|
291
|
+
arg_owner_name = if arg_owner.is_a?(GraphQL::Schema::Field)
|
280
292
|
arg_owner.path
|
281
293
|
elsif arg_owner.is_a?(Class)
|
282
294
|
arg_owner.graphql_name
|
@@ -287,9 +299,9 @@ module GraphQL
|
|
287
299
|
end
|
288
300
|
|
289
301
|
normalized_args
|
290
|
-
when GraphQL::
|
302
|
+
when GraphQL::Schema::List
|
291
303
|
args.map { |a| normalize_arguments(event_name, arg_owner.of_type, a, context) }
|
292
|
-
when GraphQL::
|
304
|
+
when GraphQL::Schema::NonNull
|
293
305
|
normalize_arguments(event_name, arg_owner.of_type, args, context)
|
294
306
|
else
|
295
307
|
args
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'graphql/tracing/notifications_trace'
|
4
|
+
|
5
|
+
module GraphQL
|
6
|
+
module Tracing
|
7
|
+
# This implementation forwards events to ActiveSupport::Notifications
|
8
|
+
# with a `graphql` suffix.
|
9
|
+
module ActiveSupportNotificationsTrace
|
10
|
+
include NotificationsTrace
|
11
|
+
def initialize(engine: ActiveSupport::Notifications, **rest)
|
12
|
+
super
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,231 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GraphQL
|
4
|
+
module Tracing
|
5
|
+
|
6
|
+
# This class uses the AppopticsAPM SDK from the appoptics_apm gem to create
|
7
|
+
# traces for GraphQL.
|
8
|
+
#
|
9
|
+
# There are 4 configurations available. They can be set in the
|
10
|
+
# appoptics_apm config file or in code. Please see:
|
11
|
+
# {https://docs.appoptics.com/kb/apm_tracing/ruby/configure}
|
12
|
+
#
|
13
|
+
# AppOpticsAPM::Config[:graphql][:enabled] = true|false
|
14
|
+
# AppOpticsAPM::Config[:graphql][:transaction_name] = true|false
|
15
|
+
# AppOpticsAPM::Config[:graphql][:sanitize_query] = true|false
|
16
|
+
# AppOpticsAPM::Config[:graphql][:remove_comments] = true|false
|
17
|
+
module AppOpticsTrace
|
18
|
+
# These GraphQL events will show up as 'graphql.prep' spans
|
19
|
+
PREP_KEYS = ['lex', 'parse', 'validate', 'analyze_query', 'analyze_multiplex'].freeze
|
20
|
+
# These GraphQL events will show up as 'graphql.execute' spans
|
21
|
+
EXEC_KEYS = ['execute_multiplex', 'execute_query', 'execute_query_lazy'].freeze
|
22
|
+
|
23
|
+
# During auto-instrumentation this version of AppOpticsTracing is compared
|
24
|
+
# with the version provided in the appoptics_apm gem, so that the newer
|
25
|
+
# version of the class can be used
|
26
|
+
|
27
|
+
def self.version
|
28
|
+
Gem::Version.new('1.0.0')
|
29
|
+
end
|
30
|
+
|
31
|
+
[
|
32
|
+
'lex',
|
33
|
+
'parse',
|
34
|
+
'validate',
|
35
|
+
'analyze_query',
|
36
|
+
'analyze_multiplex',
|
37
|
+
'execute_multiplex',
|
38
|
+
'execute_query',
|
39
|
+
'execute_query_lazy',
|
40
|
+
].each do |trace_method|
|
41
|
+
module_eval <<-RUBY, __FILE__, __LINE__
|
42
|
+
def #{trace_method}(**data)
|
43
|
+
return super if !defined?(AppOpticsAPM) || gql_config[:enabled] == false
|
44
|
+
layer = span_name("#{trace_method}")
|
45
|
+
kvs = metadata(data, layer)
|
46
|
+
kvs[:Key] = "#{trace_method}" if (PREP_KEYS + EXEC_KEYS).include?("#{trace_method}")
|
47
|
+
|
48
|
+
transaction_name(kvs[:InboundQuery]) if kvs[:InboundQuery] && layer == 'graphql.execute'
|
49
|
+
|
50
|
+
::AppOpticsAPM::SDK.trace(layer, kvs) do
|
51
|
+
kvs.clear # we don't have to send them twice
|
52
|
+
super
|
53
|
+
end
|
54
|
+
end
|
55
|
+
RUBY
|
56
|
+
end
|
57
|
+
|
58
|
+
def platform_execute_field(platform_key, data)
|
59
|
+
return super if !defined?(AppOpticsAPM) || gql_config[:enabled] == false
|
60
|
+
layer = platform_key
|
61
|
+
kvs = metadata(data, layer)
|
62
|
+
|
63
|
+
::AppOpticsAPM::SDK.trace(layer, kvs) do
|
64
|
+
kvs.clear # we don't have to send them twice
|
65
|
+
yield
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def authorized(**data)
|
70
|
+
return super if !defined?(AppOpticsAPM) || gql_config[:enabled] == false
|
71
|
+
layer = @platform_authorized_key_cache[data[:type]]
|
72
|
+
kvs = metadata(data, layer)
|
73
|
+
|
74
|
+
::AppOpticsAPM::SDK.trace(layer, kvs) do
|
75
|
+
kvs.clear # we don't have to send them twice
|
76
|
+
super
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def authorized_lazy(**data)
|
81
|
+
return super if !defined?(AppOpticsAPM) || gql_config[:enabled] == false
|
82
|
+
layer = @platform_authorized_key_cache[data[:type]]
|
83
|
+
kvs = metadata(data, layer)
|
84
|
+
|
85
|
+
::AppOpticsAPM::SDK.trace(layer, kvs) do
|
86
|
+
kvs.clear # we don't have to send them twice
|
87
|
+
super
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def resolve_type(**data)
|
92
|
+
return super if !defined?(AppOpticsAPM) || gql_config[:enabled] == false
|
93
|
+
layer = @platform_resolve_type_key_cache[data[:type]]
|
94
|
+
kvs = metadata(data, layer)
|
95
|
+
|
96
|
+
::AppOpticsAPM::SDK.trace(layer, kvs) do
|
97
|
+
kvs.clear # we don't have to send them twice
|
98
|
+
super
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def resolve_type_lazy(**data)
|
103
|
+
return super if !defined?(AppOpticsAPM) || gql_config[:enabled] == false
|
104
|
+
layer = @platform_resolve_type_key_cache[data[:type]]
|
105
|
+
kvs = metadata(data, layer)
|
106
|
+
|
107
|
+
::AppOpticsAPM::SDK.trace(layer, kvs) do
|
108
|
+
kvs.clear # we don't have to send them twice
|
109
|
+
super
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
include PlatformTrace
|
114
|
+
|
115
|
+
def platform_field_key(field)
|
116
|
+
"graphql.#{field.owner.graphql_name}.#{field.graphql_name}"
|
117
|
+
end
|
118
|
+
|
119
|
+
def platform_authorized_key(type)
|
120
|
+
"graphql.authorized.#{type.graphql_name}"
|
121
|
+
end
|
122
|
+
|
123
|
+
def platform_resolve_type_key(type)
|
124
|
+
"graphql.resolve_type.#{type.graphql_name}"
|
125
|
+
end
|
126
|
+
|
127
|
+
private
|
128
|
+
|
129
|
+
def gql_config
|
130
|
+
::AppOpticsAPM::Config[:graphql] ||= {}
|
131
|
+
end
|
132
|
+
|
133
|
+
def transaction_name(query)
|
134
|
+
return if gql_config[:transaction_name] == false ||
|
135
|
+
::AppOpticsAPM::SDK.get_transaction_name
|
136
|
+
|
137
|
+
split_query = query.strip.split(/\W+/, 3)
|
138
|
+
split_query[0] = 'query' if split_query[0].empty?
|
139
|
+
name = "graphql.#{split_query[0..1].join('.')}"
|
140
|
+
|
141
|
+
::AppOpticsAPM::SDK.set_transaction_name(name)
|
142
|
+
end
|
143
|
+
|
144
|
+
def multiplex_transaction_name(names)
|
145
|
+
return if gql_config[:transaction_name] == false ||
|
146
|
+
::AppOpticsAPM::SDK.get_transaction_name
|
147
|
+
|
148
|
+
name = "graphql.multiplex.#{names.join('.')}"
|
149
|
+
name = "#{name[0..251]}..." if name.length > 254
|
150
|
+
|
151
|
+
::AppOpticsAPM::SDK.set_transaction_name(name)
|
152
|
+
end
|
153
|
+
|
154
|
+
def span_name(key)
|
155
|
+
return 'graphql.prep' if PREP_KEYS.include?(key)
|
156
|
+
return 'graphql.execute' if EXEC_KEYS.include?(key)
|
157
|
+
|
158
|
+
key[/^graphql\./] ? key : "graphql.#{key}"
|
159
|
+
end
|
160
|
+
|
161
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
162
|
+
def metadata(data, layer)
|
163
|
+
data.keys.map do |key|
|
164
|
+
case key
|
165
|
+
when :context
|
166
|
+
graphql_context(data[key], layer)
|
167
|
+
when :query
|
168
|
+
graphql_query(data[key])
|
169
|
+
when :query_string
|
170
|
+
graphql_query_string(data[key])
|
171
|
+
when :multiplex
|
172
|
+
graphql_multiplex(data[key])
|
173
|
+
when :path
|
174
|
+
[key, data[key].join(".")]
|
175
|
+
else
|
176
|
+
[key, data[key]]
|
177
|
+
end
|
178
|
+
end.flatten(2).each_slice(2).to_h.merge(Spec: 'graphql')
|
179
|
+
end
|
180
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
181
|
+
|
182
|
+
def graphql_context(context, layer)
|
183
|
+
context.errors && context.errors.each do |err|
|
184
|
+
AppOpticsAPM::API.log_exception(layer, err)
|
185
|
+
end
|
186
|
+
|
187
|
+
[[:Path, context.path.join('.')]]
|
188
|
+
end
|
189
|
+
|
190
|
+
def graphql_query(query)
|
191
|
+
return [] unless query
|
192
|
+
|
193
|
+
query_string = query.query_string
|
194
|
+
query_string = remove_comments(query_string) if gql_config[:remove_comments] != false
|
195
|
+
query_string = sanitize(query_string) if gql_config[:sanitize_query] != false
|
196
|
+
|
197
|
+
[[:InboundQuery, query_string],
|
198
|
+
[:Operation, query.selected_operation_name]]
|
199
|
+
end
|
200
|
+
|
201
|
+
def graphql_query_string(query_string)
|
202
|
+
query_string = remove_comments(query_string) if gql_config[:remove_comments] != false
|
203
|
+
query_string = sanitize(query_string) if gql_config[:sanitize_query] != false
|
204
|
+
|
205
|
+
[:InboundQuery, query_string]
|
206
|
+
end
|
207
|
+
|
208
|
+
def graphql_multiplex(data)
|
209
|
+
names = data.queries.map(&:operations).map(&:keys).flatten.compact
|
210
|
+
multiplex_transaction_name(names) if names.size > 1
|
211
|
+
|
212
|
+
[:Operations, names.join(', ')]
|
213
|
+
end
|
214
|
+
|
215
|
+
def sanitize(query)
|
216
|
+
return unless query
|
217
|
+
|
218
|
+
# remove arguments
|
219
|
+
query.gsub(/"[^"]*"/, '"?"') # strings
|
220
|
+
.gsub(/-?[0-9]*\.?[0-9]+e?[0-9]*/, '?') # ints + floats
|
221
|
+
.gsub(/\[[^\]]*\]/, '[?]') # arrays
|
222
|
+
end
|
223
|
+
|
224
|
+
def remove_comments(query)
|
225
|
+
return unless query
|
226
|
+
|
227
|
+
query.gsub(/#[^\n\r]*/, '')
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GraphQL
|
4
|
+
module Tracing
|
5
|
+
module AppsignalTrace
|
6
|
+
include PlatformTrace
|
7
|
+
|
8
|
+
|
9
|
+
# @param set_action_name [Boolean] If true, the GraphQL operation name will be used as the transaction name.
|
10
|
+
# This is not advised if you run more than one query per HTTP request, for example, with `graphql-client` or multiplexing.
|
11
|
+
# It can also be specified per-query with `context[:set_appsignal_action_name]`.
|
12
|
+
def initialize(set_action_name: false, **rest)
|
13
|
+
@set_action_name = set_action_name
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
{
|
18
|
+
"lex" => "lex.graphql",
|
19
|
+
"parse" => "parse.graphql",
|
20
|
+
"validate" => "validate.graphql",
|
21
|
+
"analyze_query" => "analyze.graphql",
|
22
|
+
"analyze_multiplex" => "analyze.graphql",
|
23
|
+
"execute_multiplex" => "execute.graphql",
|
24
|
+
"execute_query" => "execute.graphql",
|
25
|
+
"execute_query_lazy" => "execute.graphql",
|
26
|
+
}.each do |trace_method, platform_key|
|
27
|
+
module_eval <<-RUBY, __FILE__, __LINE__
|
28
|
+
def #{trace_method}(**data)
|
29
|
+
#{
|
30
|
+
if trace_method == "execute_query"
|
31
|
+
<<-RUBY
|
32
|
+
set_this_txn_name = data[:query].context[:set_appsignal_action_name]
|
33
|
+
if set_this_txn_name == true || (set_this_txn_name.nil? && @set_action_name)
|
34
|
+
Appsignal::Transaction.current.set_action(transaction_name(data[:query]))
|
35
|
+
end
|
36
|
+
RUBY
|
37
|
+
end
|
38
|
+
}
|
39
|
+
|
40
|
+
Appsignal.instrument("#{platform_key}") do
|
41
|
+
super
|
42
|
+
end
|
43
|
+
end
|
44
|
+
RUBY
|
45
|
+
end
|
46
|
+
|
47
|
+
def platform_execute_field(platform_key)
|
48
|
+
Appsignal.instrument(platform_key) do
|
49
|
+
super
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def platform_field_key(field)
|
54
|
+
"#{field.owner.graphql_name}.#{field.graphql_name}.graphql"
|
55
|
+
end
|
56
|
+
|
57
|
+
def platform_authorized_key(type)
|
58
|
+
"#{type.graphql_name}.authorized.graphql"
|
59
|
+
end
|
60
|
+
|
61
|
+
def platform_resolve_type_key(type)
|
62
|
+
"#{type.graphql_name}.resolve_type.graphql"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GraphQL
|
4
|
+
module Tracing
|
5
|
+
module DataDogTrace
|
6
|
+
# @param analytics_enabled [Boolean] Deprecated
|
7
|
+
# @param analytics_sample_rate [Float] Deprecated
|
8
|
+
def initialize(tracer: nil, analytics_enabled: false, analytics_sample_rate: 1.0, service: "ruby-graphql", **rest)
|
9
|
+
if tracer.nil?
|
10
|
+
tracer = defined?(Datadog::Tracing) ? Datadog::Tracing : Datadog.tracer
|
11
|
+
end
|
12
|
+
@tracer = tracer
|
13
|
+
|
14
|
+
analytics_available = defined?(Datadog::Contrib::Analytics) \
|
15
|
+
&& Datadog::Contrib::Analytics.respond_to?(:enabled?) \
|
16
|
+
&& Datadog::Contrib::Analytics.respond_to?(:set_sample_rate)
|
17
|
+
|
18
|
+
@analytics_enabled = analytics_available && Datadog::Contrib::Analytics.enabled?(analytics_enabled)
|
19
|
+
@analytics_sample_rate = analytics_sample_rate
|
20
|
+
@service_name = service
|
21
|
+
super
|
22
|
+
end
|
23
|
+
|
24
|
+
{
|
25
|
+
'lex' => 'lex.graphql',
|
26
|
+
'parse' => 'parse.graphql',
|
27
|
+
'validate' => 'validate.graphql',
|
28
|
+
'analyze_query' => 'analyze.graphql',
|
29
|
+
'analyze_multiplex' => 'analyze.graphql',
|
30
|
+
'execute_multiplex' => 'execute.graphql',
|
31
|
+
'execute_query' => 'execute.graphql',
|
32
|
+
'execute_query_lazy' => 'execute.graphql',
|
33
|
+
}.each do |trace_method, trace_key|
|
34
|
+
module_eval <<-RUBY, __FILE__, __LINE__
|
35
|
+
def #{trace_method}(**data)
|
36
|
+
@tracer.trace("#{trace_key}", service: @service_name) do |span|
|
37
|
+
span.span_type = 'custom'
|
38
|
+
if defined?(Datadog::Tracing::Metadata::Ext) # Introduced in ddtrace 1.0
|
39
|
+
span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, 'graphql')
|
40
|
+
span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION, '#{trace_method}')
|
41
|
+
end
|
42
|
+
|
43
|
+
#{
|
44
|
+
if trace_method == 'execute_multiplex'
|
45
|
+
<<-RUBY
|
46
|
+
operations = data[:multiplex].queries.map(&:selected_operation_name).join(', ')
|
47
|
+
|
48
|
+
resource = if operations.empty?
|
49
|
+
first_query = data[:multiplex].queries.first
|
50
|
+
fallback_transaction_name(first_query && first_query.context)
|
51
|
+
else
|
52
|
+
operations
|
53
|
+
end
|
54
|
+
span.resource = resource if resource
|
55
|
+
|
56
|
+
# For top span of query, set the analytics sample rate tag, if available.
|
57
|
+
if @analytics_enabled
|
58
|
+
Datadog::Contrib::Analytics.set_sample_rate(span, @analytics_sample_rate)
|
59
|
+
end
|
60
|
+
RUBY
|
61
|
+
elsif trace_method == 'execute_query'
|
62
|
+
<<-RUBY
|
63
|
+
span.set_tag(:selected_operation_name, data[:query].selected_operation_name)
|
64
|
+
span.set_tag(:selected_operation_type, data[:query].selected_operation.operation_type)
|
65
|
+
span.set_tag(:query_string, data[:query].query_string)
|
66
|
+
RUBY
|
67
|
+
end
|
68
|
+
}
|
69
|
+
prepare_span("#{trace_method.sub("platform_", "")}", data, span)
|
70
|
+
super
|
71
|
+
end
|
72
|
+
end
|
73
|
+
RUBY
|
74
|
+
end
|
75
|
+
|
76
|
+
def platform_execute_field(platform_key, data, span_key = "execute_field")
|
77
|
+
@tracer.trace(platform_key, service: @service_name) do |span|
|
78
|
+
span.span_type = 'custom'
|
79
|
+
if defined?(Datadog::Tracing::Metadata::Ext) # Introduced in ddtrace 1.0
|
80
|
+
span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, 'graphql')
|
81
|
+
span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION, span_key)
|
82
|
+
end
|
83
|
+
prepare_span(span_key, data, span)
|
84
|
+
yield
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def platform_execute_field_lazy(platform_key, data, &block)
|
89
|
+
platform_execute_field(platform_key, data, "execute_field_lazy", &block)
|
90
|
+
end
|
91
|
+
|
92
|
+
def authorized(object:, type:, query:, span_key: "authorized")
|
93
|
+
platform_key = @platform_authorized_key_cache[type]
|
94
|
+
@tracer.trace(platform_key, service: @service_name) do |span|
|
95
|
+
span.span_type = 'custom'
|
96
|
+
if defined?(Datadog::Tracing::Metadata::Ext) # Introduced in ddtrace 1.0
|
97
|
+
span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, 'graphql')
|
98
|
+
span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION, span_key)
|
99
|
+
end
|
100
|
+
prepare_span(span_key, {object: object, type: type, query: query}, span)
|
101
|
+
super(query: query, type: type, object: object)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def authorized_lazy(**kwargs, &block)
|
106
|
+
authorized(span_key: "authorized_lazy", **kwargs, &block)
|
107
|
+
end
|
108
|
+
|
109
|
+
def resolve_type(object:, type:, query:, span_key: "resolve_type")
|
110
|
+
platform_key = @platform_resolve_type_key_cache[type]
|
111
|
+
@tracer.trace(platform_key, service: @service_name) do |span|
|
112
|
+
span.span_type = 'custom'
|
113
|
+
if defined?(Datadog::Tracing::Metadata::Ext) # Introduced in ddtrace 1.0
|
114
|
+
span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, 'graphql')
|
115
|
+
span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION, span_key)
|
116
|
+
end
|
117
|
+
prepare_span(span_key, {object: object, type: type, query: query}, span)
|
118
|
+
super(query: query, type: type, object: object)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def resolve_type_lazy(**kwargs, &block)
|
123
|
+
resolve_type(span_key: "resolve_type_lazy", **kwargs, &block)
|
124
|
+
end
|
125
|
+
|
126
|
+
include PlatformTrace
|
127
|
+
|
128
|
+
# Implement this method in a subclass to apply custom tags to datadog spans
|
129
|
+
# @param key [String] The event being traced
|
130
|
+
# @param data [Hash] The runtime data for this event (@see GraphQL::Tracing for keys for each event)
|
131
|
+
# @param span [Datadog::Tracing::SpanOperation] The datadog span for this event
|
132
|
+
def prepare_span(key, data, span)
|
133
|
+
end
|
134
|
+
|
135
|
+
def platform_field_key(field)
|
136
|
+
field.path
|
137
|
+
end
|
138
|
+
|
139
|
+
def platform_authorized_key(type)
|
140
|
+
"#{type.graphql_name}.authorized"
|
141
|
+
end
|
142
|
+
|
143
|
+
def platform_resolve_type_key(type)
|
144
|
+
"#{type.graphql_name}.resolve_type"
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -75,10 +75,12 @@ module GraphQL
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def analytics_enabled?
|
78
|
+
# [Deprecated] options[:analytics_enabled] will be removed in the future
|
78
79
|
analytics_available? && Datadog::Contrib::Analytics.enabled?(options.fetch(:analytics_enabled, false))
|
79
80
|
end
|
80
81
|
|
81
82
|
def analytics_sample_rate
|
83
|
+
# [Deprecated] options[:analytics_sample_rate] will be removed in the future
|
82
84
|
options.fetch(:analytics_sample_rate, 1.0)
|
83
85
|
end
|
84
86
|
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GraphQL
|
4
|
+
module Tracing
|
5
|
+
module NewRelicTrace
|
6
|
+
include PlatformTrace
|
7
|
+
|
8
|
+
# @param set_transaction_name [Boolean] If true, the GraphQL operation name will be used as the transaction name.
|
9
|
+
# This is not advised if you run more than one query per HTTP request, for example, with `graphql-client` or multiplexing.
|
10
|
+
# It can also be specified per-query with `context[:set_new_relic_transaction_name]`.
|
11
|
+
def initialize(set_transaction_name: false, **_rest)
|
12
|
+
@set_transaction_name = set_transaction_name
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def execute_query(query:)
|
17
|
+
set_this_txn_name = query.context[:set_new_relic_transaction_name]
|
18
|
+
if set_this_txn_name == true || (set_this_txn_name.nil? && @set_transaction_name)
|
19
|
+
NewRelic::Agent.set_transaction_name(transaction_name(query))
|
20
|
+
end
|
21
|
+
NewRelic::Agent::MethodTracerHelpers.trace_execution_scoped("GraphQL/execute") do
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
{
|
27
|
+
"lex" => "GraphQL/lex",
|
28
|
+
"parse" => "GraphQL/parse",
|
29
|
+
"validate" => "GraphQL/validate",
|
30
|
+
"analyze_query" => "GraphQL/analyze",
|
31
|
+
"analyze_multiplex" => "GraphQL/analyze",
|
32
|
+
"execute_multiplex" => "GraphQL/execute",
|
33
|
+
"execute_query_lazy" => "GraphQL/execute",
|
34
|
+
}.each do |trace_method, platform_key|
|
35
|
+
module_eval <<-RUBY, __FILE__, __LINE__
|
36
|
+
def #{trace_method}(**_keys)
|
37
|
+
NewRelic::Agent::MethodTracerHelpers.trace_execution_scoped("#{platform_key}") do
|
38
|
+
super
|
39
|
+
end
|
40
|
+
end
|
41
|
+
RUBY
|
42
|
+
end
|
43
|
+
|
44
|
+
def platform_execute_field(platform_key)
|
45
|
+
NewRelic::Agent::MethodTracerHelpers.trace_execution_scoped(platform_key) do
|
46
|
+
yield
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def platform_authorized(platform_key)
|
51
|
+
NewRelic::Agent::MethodTracerHelpers.trace_execution_scoped(platform_key) do
|
52
|
+
yield
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def platform_resolve_type(platform_key)
|
57
|
+
NewRelic::Agent::MethodTracerHelpers.trace_execution_scoped(platform_key) do
|
58
|
+
yield
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def platform_field_key(field)
|
63
|
+
"GraphQL/#{field.owner.graphql_name}/#{field.graphql_name}"
|
64
|
+
end
|
65
|
+
|
66
|
+
def platform_authorized_key(type)
|
67
|
+
"GraphQL/Authorize/#{type.graphql_name}"
|
68
|
+
end
|
69
|
+
|
70
|
+
def platform_resolve_type_key(type)
|
71
|
+
"GraphQL/ResolveType/#{type.graphql_name}"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|