@@ -22,10 +22,12 @@ module NewRelicTrace
22
22
# It can also be specified per-query with `context[:set_new_relic_transaction_name]`.
23
23
# @param trace_authorized [Boolean] If `false`, skip tracing `authorized?` calls
24
24
# @param trace_resolve_type [Boolean] If `false`, skip tracing `resolve_type?` calls
25
- def initialize ( set_transaction_name : false , trace_authorized : true , trace_resolve_type : true , **_rest )
25
+ # @param trace_scalars [Boolean] If `true`, Enum and Scalar fields will be traced by default
26
+ def initialize ( set_transaction_name : false , trace_authorized : true , trace_resolve_type : true , trace_scalars : false , **_rest )
26
27
@set_transaction_name = set_transaction_name
27
28
@trace_authorized = trace_authorized
28
29
@trace_resolve_type = trace_resolve_type
30
+ @trace_scalars = trace_scalars
29
31
@nr_field_names = Hash . new do |h , field |
30
32
h [ field ] = "GraphQL/#{ field . owner . graphql_name } /#{ field . graphql_name } "
31
33
end . compare_by_identity
@@ -92,78 +94,88 @@ def end_execute_multiplex(multiplex)
92
94
end
93
95
94
96
def begin_execute_field ( field , object , arguments , query )
95
- nr_segment_stack << NewRelic ::Agent ::Tracer . start_transaction_or_segment ( partial_name : @nr_field_names [ field ] , category : :web )
97
+ return_type = field . type . unwrap
98
+ trace_field = if return_type . kind . scalar? || return_type . kind . enum?
99
+ ( field . trace . nil? && @trace_scalars ) || field . trace
100
+ else
101
+ true
102
+ end
103
+ if trace_field
104
+ start_segment ( partial_name : @nr_field_names [ field ] , category : :web )
105
+ end
96
106
super
97
107
end
98
108
99
109
def end_execute_field ( field , objects , arguments , query , result )
100
- nr_segment_stack . pop . finish
110
+ finish_segment
101
111
super
102
112
end
103
113
104
114
def begin_authorized ( type , obj , ctx )
105
115
if @trace_authorized
106
- nr_segment_stack << NewRelic :: Agent :: Tracer . start_transaction_or_segment ( partial_name : @nr_authorized_names [ type ] , category : :web )
116
+ start_segment ( partial_name : @nr_authorized_names [ type ] , category : :web )
107
117
end
108
118
super
109
119
end
110
120
111
121
def end_authorized ( type , obj , ctx , is_authed )
112
122
if @trace_authorized
113
- nr_segment_stack . pop . finish
123
+ finish_segment
114
124
end
115
125
super
116
126
end
117
127
118
128
def begin_resolve_type ( type , value , context )
119
129
if @trace_resolve_type
120
- nr_segment_stack << NewRelic :: Agent :: Tracer . start_transaction_or_segment ( partial_name : @nr_resolve_type_names [ type ] , category : :web )
130
+ start_segment ( partial_name : @nr_resolve_type_names [ type ] , category : :web )
121
131
end
122
132
super
123
133
end
124
134
125
135
def end_resolve_type ( type , value , context , resolved_type )
126
136
if @trace_resolve_type
127
- nr_segment_stack . pop . finish
137
+ finish_segment
128
138
end
129
139
super
130
140
end
131
141
132
- def begin_dataloader ( dl )
133
- super
134
- end
135
-
136
- def end_dataloader ( dl )
137
- super
138
- end
139
-
140
142
def begin_dataloader_source ( source )
141
- nr_segment_stack << NewRelic :: Agent :: Tracer . start_transaction_or_segment ( partial_name : @nr_source_names [ source ] , category : :web )
143
+ start_segment ( partial_name : @nr_source_names [ source ] , category : :web )
142
144
super
143
145
end
144
146
145
147
def end_dataloader_source ( source )
146
- nr_segment_stack . pop . finish
148
+ finish_segment
147
149
super
148
150
end
149
151
150
152
def dataloader_fiber_yield ( source )
151
- current_segment = nr_segment_stack . last
152
- current_segment . finish
153
+ prev_segment = finish_segment
154
+ Fiber [ :graphql_nr_previous_segment ] = prev_segment
153
155
super
154
156
end
155
157
156
158
def dataloader_fiber_resume ( source )
157
- prev_segment = nr_segment_stack . pop
159
+ prev_segment = Fiber [ :graphql_nr_previous_segment ]
160
+ Fiber [ :graphql_nr_previous_segment ] = nil
158
161
seg_partial_name = prev_segment . name . sub ( /^.*(GraphQL.*)$/ , '\1' )
159
- nr_segment_stack << NewRelic :: Agent :: Tracer . start_transaction_or_segment ( partial_name : seg_partial_name , category : :web )
162
+ start_segment ( partial_name : seg_partial_name , category : :web )
160
163
super
161
164
end
162
165
163
166
private
164
167
165
- def nr_segment_stack
166
- Fiber [ :graphql_nr_segment_stack ] ||= [ ]
168
+ def start_segment ( ...)
169
+ Fiber [ :graphql_nr_segment ] = NewRelic ::Agent ::Tracer . start_transaction_or_segment ( ...)
170
+ end
171
+
172
+ def finish_segment
173
+ segment = Fiber [ :graphql_nr_segment ]
174
+ if segment
175
+ segment . finish
176
+ Fiber [ :graphql_nr_segment ] = nil
177
+ segment
178
+ end
167
179
end
168
180
169
181
def transaction_name ( query )
0 commit comments