Skip to content

Commit d9fd6a1

Browse files
authored
Merge pull request #4497 from rmosolgo/context-trace-instance
Accept trace instances during query execution
2 parents 6871cc4 + 28b3743 commit d9fd6a1

File tree

5 files changed

+86
-1
lines changed

5 files changed

+86
-1
lines changed

guides/queries/tracing.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ end
3232

3333
For a full list of methods and their arguments, see {{ "GraphQL::Tracing::Trace" | api_doc }}.
3434

35+
By default, GraphQL-Ruby makes a new trace instance when it runs a query. You can pass an existing instance as `context: { trace: ... }`. Also, `GraphQL.parse( ..., trace: ...)` accepts a trace instance.
36+
3537
## ActiveSupport::Notifications
3638

3739
You can emit events to `ActiveSupport::Notifications` with an experimental tracer, `ActiveSupportNotificationsTrace`.

lib/graphql/query.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ def interpreter?
168168

169169
# @return [GraphQL::Tracing::Trace]
170170
def current_trace
171-
@current_trace ||= multiplex ? multiplex.current_trace : schema.new_trace(multiplex: multiplex, query: self)
171+
@current_trace ||= context[:trace] || (multiplex ? multiplex.current_trace : schema.new_trace(multiplex: multiplex, query: self))
172172
end
173173

174174
def subscription_update?

lib/graphql/schema.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,6 +1047,7 @@ def execute(query_str = nil, **kwargs)
10471047
{
10481048
backtrace: ctx[:backtrace],
10491049
tracers: ctx[:tracers],
1050+
trace: ctx[:trace],
10501051
dataloader: ctx[:dataloader],
10511052
}
10521053
else

spec/graphql/execution/multiplex_spec.rb

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,4 +242,41 @@ def raise_exception
242242
assert_equal unhandled_err_json, InspectQueryInstrumentation.last_json
243243
end
244244
end
245+
246+
describe "context[:trace]" do
247+
class MultiplexTraceSchema < GraphQL::Schema
248+
class Query < GraphQL::Schema::Object
249+
field :int, Integer
250+
def int; 1; end
251+
end
252+
253+
class Trace < GraphQL::Tracing::Trace
254+
def execute_multiplex(multiplex:)
255+
@execute_multiplex_count ||= 0
256+
@execute_multiplex_count += 1
257+
super
258+
end
259+
260+
def execute_query(query:)
261+
@execute_query_count ||= 0
262+
@execute_query_count += 1
263+
super
264+
end
265+
266+
attr_reader :execute_multiplex_count, :execute_query_count
267+
end
268+
269+
query(Query)
270+
end
271+
272+
it "uses it instead of making a new trace" do
273+
query_str = "{ int }"
274+
trace_instance = MultiplexTraceSchema::Trace.new
275+
res = MultiplexTraceSchema.multiplex([{query: query_str}, {query: query_str}], context: { trace: trace_instance })
276+
assert_equal [1, 1], res.map { |r| r["data"]["int"]}
277+
278+
assert_equal 1, trace_instance.execute_multiplex_count
279+
assert_equal 2, trace_instance.execute_query_count
280+
end
281+
end
245282
end

spec/graphql/query_spec.rb

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,4 +1016,49 @@ def self.parse(query_str, trace: nil, filename: nil)
10161016
assert_equal "Query", res["data"]["__typename"]
10171017
end
10181018
end
1019+
1020+
describe "context[:trace]" do
1021+
class QueryTraceSchema < GraphQL::Schema
1022+
class Query < GraphQL::Schema::Object
1023+
field :int, Integer
1024+
def int; 1; end
1025+
end
1026+
1027+
class Trace < GraphQL::Tracing::Trace
1028+
def execute_multiplex(multiplex:)
1029+
@execute_multiplex_count ||= 0
1030+
@execute_multiplex_count += 1
1031+
super
1032+
end
1033+
1034+
def execute_query(query:)
1035+
@execute_query_count ||= 0
1036+
@execute_query_count += 1
1037+
super
1038+
end
1039+
1040+
def execute_field(**rest)
1041+
@execute_field_count ||= 0
1042+
@execute_field_count += 1
1043+
super
1044+
end
1045+
1046+
attr_reader :execute_multiplex_count, :execute_query_count, :execute_field_count
1047+
end
1048+
1049+
query(Query)
1050+
end
1051+
1052+
it "uses it instead of making a new trace" do
1053+
query_str = "{ int __typename }"
1054+
trace_instance = QueryTraceSchema::Trace.new
1055+
res = QueryTraceSchema.execute(query_str, context: { trace: trace_instance })
1056+
1057+
assert_equal 1, res["data"]["int"]
1058+
1059+
assert_equal 1, trace_instance.execute_multiplex_count
1060+
assert_equal 1, trace_instance.execute_query_count
1061+
assert_equal 2, trace_instance.execute_field_count
1062+
end
1063+
end
10191064
end

0 commit comments

Comments
 (0)