graphql 2.4.9 → 2.4.11

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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graphql/current.rb +5 -0
  3. data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.css +6 -0
  4. data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.js +7 -0
  5. data/lib/graphql/dashboard/statics/dashboard.css +3 -0
  6. data/lib/graphql/dashboard/statics/dashboard.js +78 -0
  7. data/lib/graphql/dashboard/statics/header-icon.png +0 -0
  8. data/lib/graphql/dashboard/statics/icon.png +0 -0
  9. data/lib/graphql/dashboard/views/graphql/dashboard/landings/show.html.erb +18 -0
  10. data/lib/graphql/dashboard/views/graphql/dashboard/traces/index.html.erb +63 -0
  11. data/lib/graphql/dashboard/views/layouts/graphql/dashboard/application.html.erb +60 -0
  12. data/lib/graphql/dashboard.rb +142 -0
  13. data/lib/graphql/dataloader/active_record_association_source.rb +64 -0
  14. data/lib/graphql/dataloader/active_record_source.rb +26 -0
  15. data/lib/graphql/dataloader/async_dataloader.rb +17 -5
  16. data/lib/graphql/dataloader/null_dataloader.rb +1 -1
  17. data/lib/graphql/dataloader/source.rb +2 -2
  18. data/lib/graphql/dataloader.rb +37 -5
  19. data/lib/graphql/execution/interpreter/runtime.rb +26 -7
  20. data/lib/graphql/execution/interpreter.rb +9 -1
  21. data/lib/graphql/invalid_name_error.rb +1 -1
  22. data/lib/graphql/invalid_null_error.rb +6 -12
  23. data/lib/graphql/language/parser.rb +1 -1
  24. data/lib/graphql/query.rb +8 -4
  25. data/lib/graphql/schema/build_from_definition.rb +0 -1
  26. data/lib/graphql/schema/enum.rb +17 -2
  27. data/lib/graphql/schema/input_object.rb +1 -1
  28. data/lib/graphql/schema/interface.rb +1 -0
  29. data/lib/graphql/schema/member/has_dataloader.rb +60 -0
  30. data/lib/graphql/schema/member.rb +1 -0
  31. data/lib/graphql/schema/object.rb +17 -8
  32. data/lib/graphql/schema/resolver.rb +1 -5
  33. data/lib/graphql/schema/visibility/profile.rb +4 -4
  34. data/lib/graphql/schema/visibility.rb +14 -9
  35. data/lib/graphql/schema.rb +52 -10
  36. data/lib/graphql/static_validation/validator.rb +6 -1
  37. data/lib/graphql/tracing/active_support_notifications_trace.rb +6 -2
  38. data/lib/graphql/tracing/appoptics_trace.rb +3 -1
  39. data/lib/graphql/tracing/appsignal_trace.rb +6 -0
  40. data/lib/graphql/tracing/data_dog_trace.rb +5 -0
  41. data/lib/graphql/tracing/detailed_trace/memory_backend.rb +60 -0
  42. data/lib/graphql/tracing/detailed_trace/redis_backend.rb +72 -0
  43. data/lib/graphql/tracing/detailed_trace.rb +93 -0
  44. data/lib/graphql/tracing/new_relic_trace.rb +147 -41
  45. data/lib/graphql/tracing/perfetto_trace/trace.proto +141 -0
  46. data/lib/graphql/tracing/perfetto_trace/trace_pb.rb +33 -0
  47. data/lib/graphql/tracing/perfetto_trace.rb +737 -0
  48. data/lib/graphql/tracing/prometheus_trace.rb +22 -0
  49. data/lib/graphql/tracing/scout_trace.rb +6 -0
  50. data/lib/graphql/tracing/sentry_trace.rb +5 -0
  51. data/lib/graphql/tracing/statsd_trace.rb +9 -0
  52. data/lib/graphql/tracing/trace.rb +124 -0
  53. data/lib/graphql/tracing.rb +2 -0
  54. data/lib/graphql/version.rb +1 -1
  55. data/lib/graphql.rb +3 -0
  56. metadata +49 -3
  57. data/lib/graphql/schema/null_mask.rb +0 -11
@@ -4,73 +4,179 @@ require "graphql/tracing/platform_trace"
4
4
 
5
5
  module GraphQL
6
6
  module Tracing
7
+ # A tracer for reporting GraphQL-Ruby time to New Relic
8
+ #
9
+ # @example Installing the tracer
10
+ # class MySchema < GraphQL::Schema
11
+ # trace_with GraphQL::Tracing::NewRelicTrace
12
+ #
13
+ # # Optional, use the operation name to set the new relic transaction name:
14
+ # # trace_with GraphQL::Tracing::NewRelicTrace, set_transaction_name: true
15
+ # end
7
16
  module NewRelicTrace
8
- include PlatformTrace
9
-
10
17
  # @param set_transaction_name [Boolean] If true, the GraphQL operation name will be used as the transaction name.
11
18
  # This is not advised if you run more than one query per HTTP request, for example, with `graphql-client` or multiplexing.
12
19
  # It can also be specified per-query with `context[:set_new_relic_transaction_name]`.
13
- def initialize(set_transaction_name: false, **_rest)
20
+ # @param trace_authorized [Boolean] If `false`, skip tracing `authorized?` calls
21
+ # @param trace_resolve_type [Boolean] If `false`, skip tracing `resolve_type?` calls
22
+ def initialize(set_transaction_name: false, trace_authorized: true, trace_resolve_type: true, **_rest)
14
23
  @set_transaction_name = set_transaction_name
24
+ @trace_authorized = trace_authorized
25
+ @trace_resolve_type = trace_resolve_type
26
+ @nr_field_names = Hash.new do |h, field|
27
+ h[field] = "GraphQL/#{field.owner.graphql_name}/#{field.graphql_name}"
28
+ end.compare_by_identity
29
+
30
+ @nr_authorized_names = Hash.new do |h, type|
31
+ h[type] = "GraphQL/Authorized/#{type.graphql_name}"
32
+ end.compare_by_identity
33
+
34
+ @nr_resolve_type_names = Hash.new do |h, type|
35
+ h[type] = "GraphQL/ResolveType/#{type.graphql_name}"
36
+ end.compare_by_identity
37
+
38
+ @nr_source_names = Hash.new do |h, source_inst|
39
+ h[source_inst] = "GraphQL/Source/#{source_inst.class.name}"
40
+ end.compare_by_identity
41
+
42
+ @nr_parse = @nr_validate = @nr_analyze = @nr_execute = nil
43
+ super
44
+ end
45
+
46
+ def begin_parse(query_str)
47
+ @nr_parse = NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: "GraphQL/parse", category: :web)
48
+ super
49
+ end
50
+
51
+ def end_parse(query_str)
52
+ @nr_parse.finish
53
+ super
54
+ end
55
+
56
+ def begin_validate(query, validate)
57
+ @nr_validate = NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: "GraphQL/validate", category: :web)
58
+ super
59
+ end
60
+
61
+ def end_validate(query, validate, validation_errors)
62
+ @nr_validate.finish
63
+ super
64
+ end
65
+
66
+ def begin_analyze_multiplex(multiplex, analyzers)
67
+ @nr_analyze = NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: "GraphQL/analyze", category: :web)
68
+ super
69
+ end
70
+
71
+ def end_analyze_multiplex(multiplex, analyzers)
72
+ @nr_analyze.finish
15
73
  super
16
74
  end
17
75
 
18
- def execute_query(query:)
19
- set_this_txn_name = query.context[:set_new_relic_transaction_name]
20
- if set_this_txn_name == true || (set_this_txn_name.nil? && @set_transaction_name)
76
+ def begin_execute_multiplex(multiplex)
77
+ query = multiplex.queries.first
78
+ set_this_txn_name = query.context[:set_new_relic_transaction_name]
79
+ if set_this_txn_name || (set_this_txn_name.nil? && @set_transaction_name)
21
80
  NewRelic::Agent.set_transaction_name(transaction_name(query))
22
81
  end
23
- NewRelic::Agent::MethodTracerHelpers.trace_execution_scoped("GraphQL/execute") do
24
- super
82
+ @nr_execute = NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: "GraphQL/execute", category: :web)
83
+ super
84
+ end
85
+
86
+ def end_execute_multiplex(multiplex)
87
+ @nr_execute.finish
88
+ super
89
+ end
90
+
91
+ def begin_execute_field(field, object, arguments, query)
92
+ nr_segment_stack << NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: @nr_field_names[field], category: :web)
93
+ super
94
+ end
95
+
96
+ def end_execute_field(field, objects, arguments, query, result)
97
+ nr_segment_stack.pop.finish
98
+ super
99
+ end
100
+
101
+ def begin_authorized(type, obj, ctx)
102
+ if @trace_authorized
103
+ nr_segment_stack << NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: @nr_authorized_names[type], category: :web)
25
104
  end
105
+ super
26
106
  end
27
107
 
28
- {
29
- "lex" => "GraphQL/lex",
30
- "parse" => "GraphQL/parse",
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
108
+ def end_authorized(type, obj, ctx, is_authed)
109
+ if @trace_authorized
110
+ nr_segment_stack.pop.finish
49
111
  end
112
+ super
50
113
  end
51
114
 
52
- def platform_authorized(platform_key)
53
- NewRelic::Agent::MethodTracerHelpers.trace_execution_scoped(platform_key) do
54
- yield
115
+ def begin_resolve_type(type, value, context)
116
+ if @trace_resolve_type
117
+ nr_segment_stack << NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: @nr_resolve_type_names[type], category: :web)
55
118
  end
119
+ super
56
120
  end
57
121
 
58
- def platform_resolve_type(platform_key)
59
- NewRelic::Agent::MethodTracerHelpers.trace_execution_scoped(platform_key) do
60
- yield
122
+ def end_resolve_type(type, value, context, resolved_type)
123
+ if @trace_resolve_type
124
+ nr_segment_stack.pop.finish
61
125
  end
126
+ super
62
127
  end
63
128
 
64
- def platform_field_key(field)
65
- "GraphQL/#{field.owner.graphql_name}/#{field.graphql_name}"
129
+ def begin_dataloader(dl)
130
+ super
66
131
  end
67
132
 
68
- def platform_authorized_key(type)
69
- "GraphQL/Authorize/#{type.graphql_name}"
133
+ def end_dataloader(dl)
134
+ super
135
+ end
136
+
137
+ def begin_dataloader_source(source)
138
+ nr_segment_stack << NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: @nr_source_names[source], category: :web)
139
+ super
140
+ end
141
+
142
+ def end_dataloader_source(source)
143
+ nr_segment_stack.pop.finish
144
+ super
145
+ end
146
+
147
+ def dataloader_fiber_yield(source)
148
+ current_segment = nr_segment_stack.last
149
+ current_segment.finish
150
+ super
151
+ end
152
+
153
+ def dataloader_fiber_resume(source)
154
+ prev_segment = nr_segment_stack.pop
155
+ seg_partial_name = prev_segment.name.sub(/^.*(GraphQL.*)$/, '\1')
156
+ nr_segment_stack << NewRelic::Agent::Tracer.start_transaction_or_segment(partial_name: seg_partial_name, category: :web)
157
+ super
158
+ end
159
+
160
+ private
161
+
162
+ def nr_segment_stack
163
+ Fiber[:graphql_nr_segment_stack] ||= []
164
+ end
165
+
166
+ def transaction_name(query)
167
+ selected_op = query.selected_operation
168
+ txn_name = if selected_op
169
+ op_type = selected_op.operation_type
170
+ op_name = selected_op.name || fallback_transaction_name(query.context) || "anonymous"
171
+ "#{op_type}.#{op_name}"
172
+ else
173
+ "query.anonymous"
174
+ end
175
+ "GraphQL/#{txn_name}"
70
176
  end
71
177
 
72
- def platform_resolve_type_key(type)
73
- "GraphQL/ResolveType/#{type.graphql_name}"
178
+ def fallback_transaction_name(context)
179
+ context[:tracing_fallback_transaction_name]
74
180
  end
75
181
  end
76
182
  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