graphql 2.4.9 → 2.4.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/graphql/current.rb +5 -0
- data/lib/graphql/dataloader/active_record_association_source.rb +64 -0
- data/lib/graphql/dataloader/active_record_source.rb +26 -0
- data/lib/graphql/dataloader/async_dataloader.rb +17 -5
- data/lib/graphql/dataloader/null_dataloader.rb +1 -1
- data/lib/graphql/dataloader/source.rb +2 -2
- data/lib/graphql/dataloader.rb +37 -5
- data/lib/graphql/execution/interpreter/runtime.rb +25 -6
- data/lib/graphql/execution/interpreter.rb +9 -1
- data/lib/graphql/language/parser.rb +1 -1
- data/lib/graphql/query.rb +8 -4
- data/lib/graphql/schema/enum.rb +1 -1
- data/lib/graphql/schema/interface.rb +1 -0
- data/lib/graphql/schema/loader.rb +1 -0
- data/lib/graphql/schema/member/has_dataloader.rb +56 -0
- data/lib/graphql/schema/member.rb +1 -0
- data/lib/graphql/schema/object.rb +17 -8
- data/lib/graphql/schema/resolver.rb +1 -5
- data/lib/graphql/schema/visibility/profile.rb +4 -4
- data/lib/graphql/schema/visibility.rb +14 -9
- data/lib/graphql/schema.rb +4 -4
- data/lib/graphql/static_validation/validator.rb +6 -1
- data/lib/graphql/tracing/appoptics_trace.rb +1 -1
- data/lib/graphql/tracing/new_relic_trace.rb +138 -41
- data/lib/graphql/tracing/perfetto_trace/trace.proto +141 -0
- data/lib/graphql/tracing/perfetto_trace/trace_pb.rb +33 -0
- data/lib/graphql/tracing/perfetto_trace.rb +726 -0
- data/lib/graphql/tracing/trace.rb +124 -0
- data/lib/graphql/tracing.rb +1 -0
- data/lib/graphql/version.rb +1 -1
- metadata +36 -3
- data/lib/graphql/schema/null_mask.rb +0 -11
@@ -28,6 +28,7 @@ module GraphQL
|
|
28
28
|
include Schema::Member::HasPath
|
29
29
|
extend Schema::Member::HasPath
|
30
30
|
extend Schema::Member::HasDirectives
|
31
|
+
include Schema::Member::HasDataloader
|
31
32
|
|
32
33
|
# @param object [Object] The application object that this field is being resolved on
|
33
34
|
# @param context [GraphQL::Query::Context]
|
@@ -50,11 +51,6 @@ module GraphQL
|
|
50
51
|
# @return [GraphQL::Query::Context]
|
51
52
|
attr_reader :context
|
52
53
|
|
53
|
-
# @return [GraphQL::Dataloader]
|
54
|
-
def dataloader
|
55
|
-
context.dataloader
|
56
|
-
end
|
57
|
-
|
58
54
|
# @return [GraphQL::Schema::Field]
|
59
55
|
attr_reader :field
|
60
56
|
|
@@ -18,7 +18,7 @@ module GraphQL
|
|
18
18
|
if ctx.respond_to?(:types) && (types = ctx.types).is_a?(self)
|
19
19
|
types
|
20
20
|
else
|
21
|
-
schema.visibility.profile_for(ctx
|
21
|
+
schema.visibility.profile_for(ctx)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -319,9 +319,9 @@ module GraphQL
|
|
319
319
|
case type.kind.name
|
320
320
|
when "INTERFACE"
|
321
321
|
pts = []
|
322
|
-
@schema.visibility.all_interface_type_memberships[type].each do |itm|
|
323
|
-
if @cached_visible[itm] &&
|
324
|
-
pts <<
|
322
|
+
@schema.visibility.all_interface_type_memberships[type].each do |(itm, impl_type)|
|
323
|
+
if @cached_visible[itm] && @cached_visible[impl_type] && referenced?(impl_type)
|
324
|
+
pts << impl_type
|
325
325
|
end
|
326
326
|
end
|
327
327
|
pts
|
@@ -13,6 +13,10 @@ module GraphQL
|
|
13
13
|
# @param preload [Boolean] if `true`, load the default schema profile and all named profiles immediately (defaults to `true` for `Rails.env.production?`)
|
14
14
|
# @param migration_errors [Boolean] if `true`, raise an error when `Visibility` and `Warden` return different results
|
15
15
|
def self.use(schema, dynamic: false, profiles: EmptyObjects::EMPTY_HASH, preload: (defined?(Rails) ? Rails.env.production? : nil), migration_errors: false)
|
16
|
+
profiles&.each { |name, ctx|
|
17
|
+
ctx[:visibility_profile] = name
|
18
|
+
ctx.freeze
|
19
|
+
}
|
16
20
|
schema.visibility = self.new(schema, dynamic: dynamic, preload: preload, profiles: profiles, migration_errors: migration_errors)
|
17
21
|
if preload
|
18
22
|
schema.visibility.preload
|
@@ -81,8 +85,7 @@ module GraphQL
|
|
81
85
|
types_to_visit.compact!
|
82
86
|
ensure_all_loaded(types_to_visit)
|
83
87
|
@profiles.each do |profile_name, example_ctx|
|
84
|
-
|
85
|
-
prof = profile_for(example_ctx, profile_name)
|
88
|
+
prof = profile_for(example_ctx)
|
86
89
|
prof.all_types # force loading
|
87
90
|
end
|
88
91
|
end
|
@@ -145,7 +148,7 @@ module GraphQL
|
|
145
148
|
|
146
149
|
attr_reader :cached_profiles
|
147
150
|
|
148
|
-
def profile_for(context, visibility_profile)
|
151
|
+
def profile_for(context, visibility_profile = context[:visibility_profile])
|
149
152
|
if !@profiles.empty?
|
150
153
|
if visibility_profile.nil?
|
151
154
|
if @dynamic
|
@@ -160,7 +163,8 @@ module GraphQL
|
|
160
163
|
elsif !@profiles.include?(visibility_profile)
|
161
164
|
raise ArgumentError, "`#{visibility_profile.inspect}` isn't allowed for `visibility_profile:` (must be one of #{@profiles.keys.map(&:inspect).join(", ")}). Or, add `#{visibility_profile.inspect}` to the list of profiles in the schema definition."
|
162
165
|
else
|
163
|
-
@
|
166
|
+
profile_ctx = @profiles[visibility_profile]
|
167
|
+
@cached_profiles[visibility_profile] ||= @schema.visibility_profile_class.new(name: visibility_profile, context: profile_ctx, schema: @schema)
|
164
168
|
end
|
165
169
|
elsif context.is_a?(Query::NullContext)
|
166
170
|
top_level_profile
|
@@ -222,7 +226,9 @@ module GraphQL
|
|
222
226
|
elsif member.respond_to?(:interface_type_memberships)
|
223
227
|
member.interface_type_memberships.each do |itm|
|
224
228
|
@all_references[itm.abstract_type] << member
|
225
|
-
|
229
|
+
# `itm.object_type` may not actually be `member` if this implementation
|
230
|
+
# is inherited from a superclass
|
231
|
+
@interface_type_memberships[itm.abstract_type] << [itm, member]
|
226
232
|
end
|
227
233
|
elsif member < GraphQL::Schema::Union
|
228
234
|
@unions_for_references << member
|
@@ -271,13 +277,12 @@ module GraphQL
|
|
271
277
|
|
272
278
|
# TODO: somehow don't iterate over all these,
|
273
279
|
# only the ones that may have been modified
|
274
|
-
@interface_type_memberships.each do |int_type,
|
280
|
+
@interface_type_memberships.each do |int_type, type_membership_pairs|
|
275
281
|
referers = @all_references[int_type].select { |r| r.is_a?(GraphQL::Schema::Field) }
|
276
282
|
if !referers.empty?
|
277
|
-
|
278
|
-
implementor_type = type_membership.object_type
|
283
|
+
type_membership_pairs.each do |(type_membership, impl_type)|
|
279
284
|
# Add new items only:
|
280
|
-
@all_references[
|
285
|
+
@all_references[impl_type] |= referers
|
281
286
|
end
|
282
287
|
end
|
283
288
|
end
|
data/lib/graphql/schema.rb
CHANGED
@@ -7,7 +7,6 @@ require "graphql/schema/find_inherited_value"
|
|
7
7
|
require "graphql/schema/finder"
|
8
8
|
require "graphql/schema/introspection_system"
|
9
9
|
require "graphql/schema/late_bound_type"
|
10
|
-
require "graphql/schema/null_mask"
|
11
10
|
require "graphql/schema/timeout"
|
12
11
|
require "graphql/schema/type_expression"
|
13
12
|
require "graphql/schema/unique_within_type"
|
@@ -1115,9 +1114,6 @@ module GraphQL
|
|
1115
1114
|
|
1116
1115
|
# @api private
|
1117
1116
|
def handle_or_reraise(context, err)
|
1118
|
-
if context[:backtrace] || using_backtrace
|
1119
|
-
err = GraphQL::Backtrace::TracedError.new(err, context)
|
1120
|
-
end
|
1121
1117
|
handler = Execution::Errors.find_handler_for(self, err.class)
|
1122
1118
|
if handler
|
1123
1119
|
obj = context[:current_object]
|
@@ -1129,6 +1125,10 @@ module GraphQL
|
|
1129
1125
|
end
|
1130
1126
|
handler[:handler].call(err, obj, args, context, field)
|
1131
1127
|
else
|
1128
|
+
if (context[:backtrace] || using_backtrace) && !err.is_a?(GraphQL::ExecutionError)
|
1129
|
+
err = GraphQL::Backtrace::TracedError.new(err, context)
|
1130
|
+
end
|
1131
|
+
|
1132
1132
|
raise err
|
1133
1133
|
end
|
1134
1134
|
end
|
@@ -27,6 +27,8 @@ module GraphQL
|
|
27
27
|
# @param max_errors [Integer] Maximum number of errors before aborting validation. Any positive number will limit the number of errors. Defaults to nil for no limit.
|
28
28
|
# @return [Array<Hash>]
|
29
29
|
def validate(query, validate: true, timeout: nil, max_errors: nil)
|
30
|
+
errors = nil
|
31
|
+
query.current_trace.begin_validate(query, validate)
|
30
32
|
query.current_trace.validate(validate: validate, query: query) do
|
31
33
|
begin_t = Time.now
|
32
34
|
errors = if validate == false
|
@@ -58,10 +60,13 @@ module GraphQL
|
|
58
60
|
}
|
59
61
|
end
|
60
62
|
rescue GraphQL::ExecutionError => e
|
63
|
+
errors = [e]
|
61
64
|
{
|
62
65
|
remaining_timeout: nil,
|
63
|
-
errors:
|
66
|
+
errors: errors,
|
64
67
|
}
|
68
|
+
ensure
|
69
|
+
query.current_trace.end_validate(query, validate, errors)
|
65
70
|
end
|
66
71
|
|
67
72
|
# Invoked when static validation times out.
|
@@ -83,7 +83,7 @@ module GraphQL
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
-
def execute_field_lazy(query:, field:, ast_node:, arguments:, object:)
|
86
|
+
def execute_field_lazy(query:, field:, ast_node:, arguments:, object:) # rubocop:disable Development/TraceCallsSuperCop
|
87
87
|
execute_field(query: query, field: field, ast_node: ast_node, arguments: arguments, object: object)
|
88
88
|
end
|
89
89
|
|
@@ -5,72 +5,169 @@ require "graphql/tracing/platform_trace"
|
|
5
5
|
module GraphQL
|
6
6
|
module Tracing
|
7
7
|
module NewRelicTrace
|
8
|
-
include PlatformTrace
|
9
|
-
|
10
8
|
# @param set_transaction_name [Boolean] If true, the GraphQL operation name will be used as the transaction name.
|
11
9
|
# This is not advised if you run more than one query per HTTP request, for example, with `graphql-client` or multiplexing.
|
12
10
|
# It can also be specified per-query with `context[:set_new_relic_transaction_name]`.
|
13
|
-
|
11
|
+
# @param trace_authorized [Boolean] If `false`, skip tracing `authorized?` calls
|
12
|
+
# @param trace_resolve_type [Boolean] If `false`, skip tracing `resolve_type?` calls
|
13
|
+
def initialize(set_transaction_name: false, trace_authorized: true, trace_resolve_type: true, **_rest)
|
14
14
|
@set_transaction_name = set_transaction_name
|
15
|
+
@trace_authorized = trace_authorized
|
16
|
+
@trace_resolve_type = trace_resolve_type
|
17
|
+
@nr_field_names = Hash.new do |h, field|
|
18
|
+
h[field] = "GraphQL/#{field.owner.graphql_name}/#{field.graphql_name}"
|
19
|
+
end.compare_by_identity
|
20
|
+
|
21
|
+
@nr_authorized_names = Hash.new do |h, type|
|
22
|
+
h[type] = "GraphQL/Authorized/#{type.graphql_name}"
|
23
|
+
end.compare_by_identity
|
24
|
+
|
25
|
+
@nr_resolve_type_names = Hash.new do |h, type|
|
26
|
+
h[type] = "GraphQL/ResolveType/#{type.graphql_name}"
|
27
|
+
end.compare_by_identity
|
28
|
+
|
29
|
+
@nr_source_names = Hash.new do |h, source_inst|
|
30
|
+
h[source_inst] = "GraphQL/Source/#{source_inst.class.name}"
|
31
|
+
end.compare_by_identity
|
32
|
+
|
33
|
+
@nr_parse = @nr_validate = @nr_analyze = @nr_execute = nil
|
34
|
+
super
|
35
|
+
end
|
36
|
+
|
37
|
+
def begin_parse(query_str)
|
38
|
+
@nr_parse = NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: "GraphQL/parse", category: :web)
|
39
|
+
super
|
40
|
+
end
|
41
|
+
|
42
|
+
def end_parse(query_str)
|
43
|
+
@nr_parse.finish
|
44
|
+
super
|
45
|
+
end
|
46
|
+
|
47
|
+
def begin_validate(query, validate)
|
48
|
+
@nr_validate = NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: "GraphQL/validate", category: :web)
|
49
|
+
super
|
50
|
+
end
|
51
|
+
|
52
|
+
def end_validate(query, validate, validation_errors)
|
53
|
+
@nr_validate.finish
|
54
|
+
super
|
55
|
+
end
|
56
|
+
|
57
|
+
def begin_analyze_multiplex(multiplex, analyzers)
|
58
|
+
@nr_analyze = NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: "GraphQL/analyze", category: :web)
|
59
|
+
super
|
60
|
+
end
|
61
|
+
|
62
|
+
def end_analyze_multiplex(multiplex, analyzers)
|
63
|
+
@nr_analyze.finish
|
15
64
|
super
|
16
65
|
end
|
17
66
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
67
|
+
def begin_execute_multiplex(multiplex)
|
68
|
+
query = multiplex.queries.first
|
69
|
+
set_this_txn_name = query.context[:set_new_relic_transaction_name]
|
70
|
+
if set_this_txn_name || (set_this_txn_name.nil? && @set_transaction_name)
|
21
71
|
NewRelic::Agent.set_transaction_name(transaction_name(query))
|
22
72
|
end
|
23
|
-
NewRelic::Agent::
|
24
|
-
|
73
|
+
@nr_execute = NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: "GraphQL/execute", category: :web)
|
74
|
+
super
|
75
|
+
end
|
76
|
+
|
77
|
+
def end_execute_multiplex(multiplex)
|
78
|
+
@nr_execute.finish
|
79
|
+
super
|
80
|
+
end
|
81
|
+
|
82
|
+
def begin_execute_field(field, object, arguments, query)
|
83
|
+
nr_segment_stack << NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: @nr_field_names[field], category: :web)
|
84
|
+
super
|
85
|
+
end
|
86
|
+
|
87
|
+
def end_execute_field(field, objects, arguments, query, result)
|
88
|
+
nr_segment_stack.pop.finish
|
89
|
+
super
|
90
|
+
end
|
91
|
+
|
92
|
+
def begin_authorized(type, obj, ctx)
|
93
|
+
if @trace_authorized
|
94
|
+
nr_segment_stack << NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: @nr_authorized_names[type], category: :web)
|
25
95
|
end
|
96
|
+
super
|
26
97
|
end
|
27
98
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
"validate" => "GraphQL/validate",
|
32
|
-
"analyze_query" => "GraphQL/analyze",
|
33
|
-
"analyze_multiplex" => "GraphQL/analyze",
|
34
|
-
"execute_multiplex" => "GraphQL/execute",
|
35
|
-
"execute_query_lazy" => "GraphQL/execute",
|
36
|
-
}.each do |trace_method, platform_key|
|
37
|
-
module_eval <<-RUBY, __FILE__, __LINE__
|
38
|
-
def #{trace_method}(**_keys)
|
39
|
-
NewRelic::Agent::MethodTracerHelpers.trace_execution_scoped("#{platform_key}") do
|
40
|
-
super
|
41
|
-
end
|
42
|
-
end
|
43
|
-
RUBY
|
44
|
-
end
|
45
|
-
|
46
|
-
def platform_execute_field(platform_key)
|
47
|
-
NewRelic::Agent::MethodTracerHelpers.trace_execution_scoped(platform_key) do
|
48
|
-
yield
|
99
|
+
def end_authorized(type, obj, ctx, is_authed)
|
100
|
+
if @trace_authorized
|
101
|
+
nr_segment_stack.pop.finish
|
49
102
|
end
|
103
|
+
super
|
50
104
|
end
|
51
105
|
|
52
|
-
def
|
53
|
-
|
54
|
-
|
106
|
+
def begin_resolve_type(type, value, context)
|
107
|
+
if @trace_resolve_type
|
108
|
+
nr_segment_stack << NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: @nr_resolve_type_names[type], category: :web)
|
55
109
|
end
|
110
|
+
super
|
56
111
|
end
|
57
112
|
|
58
|
-
def
|
59
|
-
|
60
|
-
|
113
|
+
def end_resolve_type(type, value, context, resolved_type)
|
114
|
+
if @trace_resolve_type
|
115
|
+
nr_segment_stack.pop.finish
|
61
116
|
end
|
117
|
+
super
|
62
118
|
end
|
63
119
|
|
64
|
-
def
|
65
|
-
|
120
|
+
def begin_dataloader(dl)
|
121
|
+
super
|
66
122
|
end
|
67
123
|
|
68
|
-
def
|
69
|
-
|
124
|
+
def end_dataloader(dl)
|
125
|
+
super
|
126
|
+
end
|
127
|
+
|
128
|
+
def begin_dataloader_source(source)
|
129
|
+
nr_segment_stack << NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: @nr_source_names[source], category: :web)
|
130
|
+
super
|
131
|
+
end
|
132
|
+
|
133
|
+
def end_dataloader_source(source)
|
134
|
+
nr_segment_stack.pop.finish
|
135
|
+
super
|
136
|
+
end
|
137
|
+
|
138
|
+
def dataloader_fiber_yield(source)
|
139
|
+
current_segment = nr_segment_stack.last
|
140
|
+
current_segment.finish
|
141
|
+
super
|
142
|
+
end
|
143
|
+
|
144
|
+
def dataloader_fiber_resume(source)
|
145
|
+
prev_segment = nr_segment_stack.pop
|
146
|
+
seg_partial_name = prev_segment.name.sub(/^.*(GraphQL.*)$/, '\1')
|
147
|
+
nr_segment_stack << NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: seg_partial_name, category: :web)
|
148
|
+
super
|
149
|
+
end
|
150
|
+
|
151
|
+
private
|
152
|
+
|
153
|
+
def nr_segment_stack
|
154
|
+
Fiber[:graphql_nr_segment_stack] ||= []
|
155
|
+
end
|
156
|
+
|
157
|
+
def transaction_name(query)
|
158
|
+
selected_op = query.selected_operation
|
159
|
+
txn_name = if selected_op
|
160
|
+
op_type = selected_op.operation_type
|
161
|
+
op_name = selected_op.name || fallback_transaction_name(query.context) || "anonymous"
|
162
|
+
"#{op_type}.#{op_name}"
|
163
|
+
else
|
164
|
+
"query.anonymous"
|
165
|
+
end
|
166
|
+
"GraphQL/#{txn_name}"
|
70
167
|
end
|
71
168
|
|
72
|
-
def
|
73
|
-
|
169
|
+
def fallback_transaction_name(context)
|
170
|
+
context[:tracing_fallback_transaction_name]
|
74
171
|
end
|
75
172
|
end
|
76
173
|
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
// This is an abbreviated version of the full Perfetto schema.
|
2
|
+
// Most of them are for OS or Chrome traces and we'll never use them.
|
3
|
+
// Full doc: https://github.com/google/perfetto/tree/main/protos/perfetto
|
4
|
+
//
|
5
|
+
// Build it with
|
6
|
+
// protoc --ruby_out=lib/graphql/tracing/perfetto_trace --proto_path=lib/graphql/tracing/perfetto_trace trace.proto
|
7
|
+
syntax = "proto2";
|
8
|
+
package perfetto_trace.protos;
|
9
|
+
option ruby_package = "GraphQL::Tracing::PerfettoTrace";
|
10
|
+
|
11
|
+
message Trace {
|
12
|
+
repeated TracePacket packet = 1;
|
13
|
+
}
|
14
|
+
|
15
|
+
message TracePacket {
|
16
|
+
optional uint64 timestamp = 8;
|
17
|
+
oneof data {
|
18
|
+
TrackEvent track_event = 11;
|
19
|
+
TrackDescriptor track_descriptor = 60;
|
20
|
+
}
|
21
|
+
oneof optional_trusted_packet_sequence_id {
|
22
|
+
uint32 trusted_packet_sequence_id = 10;
|
23
|
+
}
|
24
|
+
optional InternedData interned_data = 12;
|
25
|
+
optional bool first_packet_on_sequence = 87;
|
26
|
+
optional bool previous_packet_dropped = 42;
|
27
|
+
optional uint32 sequence_flags = 13;
|
28
|
+
}
|
29
|
+
|
30
|
+
message TrackEvent {
|
31
|
+
repeated uint64 category_iids = 3;
|
32
|
+
repeated string categories = 22;
|
33
|
+
oneof name_field {
|
34
|
+
uint64 name_iid = 10;
|
35
|
+
string name = 23;
|
36
|
+
}
|
37
|
+
enum Type {
|
38
|
+
TYPE_UNSPECIFIED = 0;
|
39
|
+
TYPE_SLICE_BEGIN = 1;
|
40
|
+
TYPE_SLICE_END = 2;
|
41
|
+
TYPE_INSTANT = 3;
|
42
|
+
TYPE_COUNTER = 4;
|
43
|
+
}
|
44
|
+
optional Type type = 9;
|
45
|
+
optional uint64 track_uuid = 11;
|
46
|
+
oneof counter_value_field {
|
47
|
+
int64 counter_value = 30;
|
48
|
+
double double_counter_value = 44;
|
49
|
+
}
|
50
|
+
repeated uint64 extra_counter_track_uuids = 31;
|
51
|
+
repeated int64 extra_counter_values = 12;
|
52
|
+
repeated uint64 extra_double_counter_track_uuids = 45;
|
53
|
+
repeated double extra_double_counter_values = 46;
|
54
|
+
repeated fixed64 flow_ids = 47;
|
55
|
+
repeated fixed64 terminating_flow_ids = 48;
|
56
|
+
repeated DebugAnnotation debug_annotations = 4;
|
57
|
+
}
|
58
|
+
|
59
|
+
message DebugAnnotation {
|
60
|
+
oneof name_field {
|
61
|
+
uint64 name_iid = 1;
|
62
|
+
string name = 10;
|
63
|
+
}
|
64
|
+
oneof value {
|
65
|
+
bool bool_value = 2;
|
66
|
+
uint64 uint_value = 3;
|
67
|
+
int64 int_value = 4;
|
68
|
+
double double_value = 5;
|
69
|
+
string string_value = 6;
|
70
|
+
uint64 string_value_iid = 17;
|
71
|
+
}
|
72
|
+
repeated DebugAnnotation dict_entries = 11;
|
73
|
+
repeated DebugAnnotation array_values = 12;
|
74
|
+
uint64 string_value_iid = 17;
|
75
|
+
}
|
76
|
+
|
77
|
+
message TrackDescriptor {
|
78
|
+
optional uint64 uuid = 1;
|
79
|
+
optional uint64 parent_uuid = 5;
|
80
|
+
|
81
|
+
oneof static_or_dynamic_name {
|
82
|
+
string name = 2;
|
83
|
+
}
|
84
|
+
|
85
|
+
optional CounterDescriptor counter = 8;
|
86
|
+
enum ChildTracksOrdering {
|
87
|
+
UNKNOWN = 0;
|
88
|
+
LEXICOGRAPHIC = 1;
|
89
|
+
CHRONOLOGICAL = 2;
|
90
|
+
EXPLICIT = 3;
|
91
|
+
}
|
92
|
+
optional ChildTracksOrdering child_ordering = 11;
|
93
|
+
optional int32 sibling_order_rank = 12;
|
94
|
+
}
|
95
|
+
|
96
|
+
message CounterDescriptor {
|
97
|
+
enum BuiltinCounterType {
|
98
|
+
COUNTER_UNSPECIFIED = 0;
|
99
|
+
COUNTER_THREAD_TIME_NS = 1;
|
100
|
+
COUNTER_THREAD_INSTRUCTION_COUNT = 2;
|
101
|
+
}
|
102
|
+
enum Unit {
|
103
|
+
UNIT_UNSPECIFIED = 0;
|
104
|
+
UNIT_TIME_NS = 1;
|
105
|
+
UNIT_COUNT = 2;
|
106
|
+
UNIT_SIZE_BYTES = 3;
|
107
|
+
}
|
108
|
+
optional BuiltinCounterType type = 1;
|
109
|
+
repeated string categories = 2;
|
110
|
+
optional Unit unit = 3;
|
111
|
+
optional string unit_name = 6;
|
112
|
+
optional int64 unit_multiplier = 4;
|
113
|
+
optional bool is_incremental = 5;
|
114
|
+
}
|
115
|
+
|
116
|
+
message InternedData {
|
117
|
+
repeated EventCategory event_categories = 1;
|
118
|
+
repeated EventName event_names = 2;
|
119
|
+
repeated DebugAnnotationName debug_annotation_names = 3;
|
120
|
+
repeated InternedString debug_annotation_string_values = 29;
|
121
|
+
}
|
122
|
+
|
123
|
+
message InternedString {
|
124
|
+
optional uint64 iid = 1;
|
125
|
+
optional bytes str = 2;
|
126
|
+
}
|
127
|
+
|
128
|
+
message EventCategory {
|
129
|
+
optional uint64 iid = 1;
|
130
|
+
optional string name = 2;
|
131
|
+
}
|
132
|
+
|
133
|
+
message EventName {
|
134
|
+
optional uint64 iid = 1;
|
135
|
+
optional string name = 2;
|
136
|
+
}
|
137
|
+
|
138
|
+
message DebugAnnotationName {
|
139
|
+
optional uint64 iid = 1;
|
140
|
+
optional string name = 2;
|
141
|
+
}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
3
|
+
# source: trace.proto
|
4
|
+
|
5
|
+
require 'google/protobuf'
|
6
|
+
|
7
|
+
|
8
|
+
descriptor_data = "\n\x0btrace.proto\x12\x15perfetto_trace.protos\";\n\x05Trace\x12\x32\n\x06packet\x18\x01 \x03(\x0b\x32\".perfetto_trace.protos.TracePacket\"\x8a\x03\n\x0bTracePacket\x12\x11\n\ttimestamp\x18\x08 \x01(\x04\x12\x38\n\x0btrack_event\x18\x0b \x01(\x0b\x32!.perfetto_trace.protos.TrackEventH\x00\x12\x42\n\x10track_descriptor\x18< \x01(\x0b\x32&.perfetto_trace.protos.TrackDescriptorH\x00\x12$\n\x1atrusted_packet_sequence_id\x18\n \x01(\rH\x01\x12:\n\rinterned_data\x18\x0c \x01(\x0b\x32#.perfetto_trace.protos.InternedData\x12 \n\x18\x66irst_packet_on_sequence\x18W \x01(\x08\x12\x1f\n\x17previous_packet_dropped\x18* \x01(\x08\x12\x16\n\x0esequence_flags\x18\r \x01(\rB\x06\n\x04\x64\x61taB%\n#optional_trusted_packet_sequence_id\"\xf2\x04\n\nTrackEvent\x12\x15\n\rcategory_iids\x18\x03 \x03(\x04\x12\x12\n\ncategories\x18\x16 \x03(\t\x12\x12\n\x08name_iid\x18\n \x01(\x04H\x00\x12\x0e\n\x04name\x18\x17 \x01(\tH\x00\x12\x34\n\x04type\x18\t \x01(\x0e\x32&.perfetto_trace.protos.TrackEvent.Type\x12\x12\n\ntrack_uuid\x18\x0b \x01(\x04\x12\x17\n\rcounter_value\x18\x1e \x01(\x03H\x01\x12\x1e\n\x14\x64ouble_counter_value\x18, \x01(\x01H\x01\x12!\n\x19\x65xtra_counter_track_uuids\x18\x1f \x03(\x04\x12\x1c\n\x14\x65xtra_counter_values\x18\x0c \x03(\x03\x12(\n extra_double_counter_track_uuids\x18- \x03(\x04\x12#\n\x1b\x65xtra_double_counter_values\x18. \x03(\x01\x12\x10\n\x08\x66low_ids\x18/ \x03(\x06\x12\x1c\n\x14terminating_flow_ids\x18\x30 \x03(\x06\x12\x41\n\x11\x64\x65\x62ug_annotations\x18\x04 \x03(\x0b\x32&.perfetto_trace.protos.DebugAnnotation\"j\n\x04Type\x12\x14\n\x10TYPE_UNSPECIFIED\x10\x00\x12\x14\n\x10TYPE_SLICE_BEGIN\x10\x01\x12\x12\n\x0eTYPE_SLICE_END\x10\x02\x12\x10\n\x0cTYPE_INSTANT\x10\x03\x12\x10\n\x0cTYPE_COUNTER\x10\x04\x42\x0c\n\nname_fieldB\x15\n\x13\x63ounter_value_field\"\xd5\x02\n\x0f\x44\x65\x62ugAnnotation\x12\x12\n\x08name_iid\x18\x01 \x01(\x04H\x00\x12\x0e\n\x04name\x18\n \x01(\tH\x00\x12\x14\n\nbool_value\x18\x02 \x01(\x08H\x01\x12\x14\n\nuint_value\x18\x03 \x01(\x04H\x01\x12\x13\n\tint_value\x18\x04 \x01(\x03H\x01\x12\x16\n\x0c\x64ouble_value\x18\x05 \x01(\x01H\x01\x12\x16\n\x0cstring_value\x18\x06 \x01(\tH\x01\x12\x1a\n\x10string_value_iid\x18\x11 \x01(\x04H\x01\x12<\n\x0c\x64ict_entries\x18\x0b \x03(\x0b\x32&.perfetto_trace.protos.DebugAnnotation\x12<\n\x0c\x61rray_values\x18\x0c \x03(\x0b\x32&.perfetto_trace.protos.DebugAnnotationB\x0c\n\nname_fieldB\x07\n\x05value\"\xe1\x02\n\x0fTrackDescriptor\x12\x0c\n\x04uuid\x18\x01 \x01(\x04\x12\x13\n\x0bparent_uuid\x18\x05 \x01(\x04\x12\x0e\n\x04name\x18\x02 \x01(\tH\x00\x12\x39\n\x07\x63ounter\x18\x08 \x01(\x0b\x32(.perfetto_trace.protos.CounterDescriptor\x12R\n\x0e\x63hild_ordering\x18\x0b \x01(\x0e\x32:.perfetto_trace.protos.TrackDescriptor.ChildTracksOrdering\x12\x1a\n\x12sibling_order_rank\x18\x0c \x01(\x05\"V\n\x13\x43hildTracksOrdering\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x11\n\rLEXICOGRAPHIC\x10\x01\x12\x11\n\rCHRONOLOGICAL\x10\x02\x12\x0c\n\x08\x45XPLICIT\x10\x03\x42\x18\n\x16static_or_dynamic_name\"\xb9\x03\n\x11\x43ounterDescriptor\x12I\n\x04type\x18\x01 \x01(\x0e\x32;.perfetto_trace.protos.CounterDescriptor.BuiltinCounterType\x12\x12\n\ncategories\x18\x02 \x03(\t\x12;\n\x04unit\x18\x03 \x01(\x0e\x32-.perfetto_trace.protos.CounterDescriptor.Unit\x12\x11\n\tunit_name\x18\x06 \x01(\t\x12\x17\n\x0funit_multiplier\x18\x04 \x01(\x03\x12\x16\n\x0eis_incremental\x18\x05 \x01(\x08\"o\n\x12\x42uiltinCounterType\x12\x17\n\x13\x43OUNTER_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43OUNTER_THREAD_TIME_NS\x10\x01\x12$\n COUNTER_THREAD_INSTRUCTION_COUNT\x10\x02\"S\n\x04Unit\x12\x14\n\x10UNIT_UNSPECIFIED\x10\x00\x12\x10\n\x0cUNIT_TIME_NS\x10\x01\x12\x0e\n\nUNIT_COUNT\x10\x02\x12\x13\n\x0fUNIT_SIZE_BYTES\x10\x03\"\xa0\x02\n\x0cInternedData\x12>\n\x10\x65vent_categories\x18\x01 \x03(\x0b\x32$.perfetto_trace.protos.EventCategory\x12\x35\n\x0b\x65vent_names\x18\x02 \x03(\x0b\x32 .perfetto_trace.protos.EventName\x12J\n\x16\x64\x65\x62ug_annotation_names\x18\x03 \x03(\x0b\x32*.perfetto_trace.protos.DebugAnnotationName\x12M\n\x1e\x64\x65\x62ug_annotation_string_values\x18\x1d \x03(\x0b\x32%.perfetto_trace.protos.InternedString\"*\n\x0eInternedString\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0b\n\x03str\x18\x02 \x01(\x0c\"*\n\rEventCategory\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"&\n\tEventName\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\t\"0\n\x13\x44\x65\x62ugAnnotationName\x12\x0b\n\x03iid\x18\x01 \x01(\x04\x12\x0c\n\x04name\x18\x02 \x01(\tB\"\xea\x02\x1fGraphQL::Tracing::PerfettoTrace"
|
9
|
+
|
10
|
+
pool = Google::Protobuf::DescriptorPool.generated_pool
|
11
|
+
pool.add_serialized_file(descriptor_data)
|
12
|
+
|
13
|
+
module GraphQL
|
14
|
+
module Tracing
|
15
|
+
module PerfettoTrace
|
16
|
+
Trace = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.Trace").msgclass
|
17
|
+
TracePacket = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.TracePacket").msgclass
|
18
|
+
TrackEvent = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.TrackEvent").msgclass
|
19
|
+
TrackEvent::Type = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.TrackEvent.Type").enummodule
|
20
|
+
DebugAnnotation = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.DebugAnnotation").msgclass
|
21
|
+
TrackDescriptor = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.TrackDescriptor").msgclass
|
22
|
+
TrackDescriptor::ChildTracksOrdering = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.TrackDescriptor.ChildTracksOrdering").enummodule
|
23
|
+
CounterDescriptor = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.CounterDescriptor").msgclass
|
24
|
+
CounterDescriptor::BuiltinCounterType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.CounterDescriptor.BuiltinCounterType").enummodule
|
25
|
+
CounterDescriptor::Unit = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.CounterDescriptor.Unit").enummodule
|
26
|
+
InternedData = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.InternedData").msgclass
|
27
|
+
InternedString = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.InternedString").msgclass
|
28
|
+
EventCategory = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.EventCategory").msgclass
|
29
|
+
EventName = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.EventName").msgclass
|
30
|
+
DebugAnnotationName = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("perfetto_trace.protos.DebugAnnotationName").msgclass
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|