Class: GraphQL::Tracing::DetailedTrace
- Inherits:
-
Object
- Object
- GraphQL::Tracing::DetailedTrace
- Defined in:
- lib/graphql/tracing/detailed_trace.rb,
lib/graphql/tracing/detailed_trace/redis_backend.rb,
lib/graphql/tracing/detailed_trace/memory_backend.rb,
lib/graphql/tracing/detailed_trace/active_record_backend.rb
Overview
DetailedTrace can make detailed profiles for a subset of production traffic. Install it in Rails with rails generate graphql:detailed_trace.
When MySchema.detailed_trace?(query) returns true, a profiler-specific trace_mode: ... will be used for the query,
overriding the one in context[:trace_mode].
By default, the detailed tracer calls .inspect on application objects returned from fields. You can customize
this behavior by extending DetailedTrace and overriding #inspect_object. You can opt out of debug annotations
entirely with use ..., debug: false or for a single query with context: { detailed_trace_debug: false }.
You can store saved traces in two ways:
-
ActiveRecord: With
rails generate graphql:detailed_trace, a new migration will be added to your app. That table will be used to store trace data. -
Redis: Pass
redis: ...to save trace data to a Redis database. Depending on your needs, you can configure this database to retain all data (persistent) or to expire data according to your rules.
If you need to save traces indefinitely, you can download them from Perfetto after opening them there.
Defined Under Namespace
Classes: ActiveRecordBackend, MemoryBackend, RedisBackend, StoredTrace
Instance Attribute Summary collapse
-
#trace_mode ⇒ Symbol
readonly
The trace mode to use when Schema.detailed_trace? returns
true.
Class Method Summary collapse
-
.debug? ⇒ true
Default debug setting.
-
.inspect_object(object) ⇒ Object
-
.use(schema, trace_mode: :profile_sample, memory: false, debug: debug?, , redis: nil, limit: nil, model_class: nil) ⇒ Object
Instance Method Summary collapse
-
#debug? ⇒ Boolean
-
#delete_all_traces ⇒ void
-
#delete_trace(id) ⇒ void
-
#find_trace(id) ⇒ StoredTrace?
-
#initialize(storage:, trace_mode:, debug:) ⇒ DetailedTrace
constructor
A new instance of DetailedTrace.
-
#inspect_object(object) ⇒ Object
-
#save_trace(operation_name, duration_ms, begin_ms, trace_data) ⇒ String
ID of saved trace.
-
#traces(last: nil, before: nil) ⇒ Enumerable<StoredTrace>
Constructor Details
#initialize(storage:, trace_mode:, debug:) ⇒ DetailedTrace
Returns a new instance of DetailedTrace.
84 85 86 87 88 |
# File 'lib/graphql/tracing/detailed_trace.rb', line 84 def initialize(storage:, trace_mode:, debug:) @storage = storage @trace_mode = trace_mode @debug = debug end |
Instance Attribute Details
#trace_mode ⇒ Symbol (readonly)
Returns The trace mode to use when Schema.detailed_trace? returns true.
91 92 93 |
# File 'lib/graphql/tracing/detailed_trace.rb', line 91 def trace_mode @trace_mode end |
Class Method Details
.debug? ⇒ true
Default debug setting
139 140 141 |
# File 'lib/graphql/tracing/detailed_trace.rb', line 139 def self.debug? true end |
.inspect_object(object) ⇒ Object
129 130 131 132 133 134 135 |
# File 'lib/graphql/tracing/detailed_trace.rb', line 129 def self.inspect_object(object) if defined?(ActiveRecord::Relation) && object.is_a?(ActiveRecord::Relation) "#{object.class}, .to_sql=#{object.to_sql.inspect}" else object.inspect end end |
.use(schema, trace_mode: :profile_sample, memory: false, debug: debug?, , redis: nil, limit: nil, model_class: nil) ⇒ Object
69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/graphql/tracing/detailed_trace.rb', line 69 def self.use(schema, trace_mode: :profile_sample, memory: false, debug: debug?, redis: nil, limit: nil, model_class: nil) storage = if redis RedisBackend.new(redis: redis, limit: limit) elsif memory MemoryBackend.new(limit: limit) elsif defined?(ActiveRecord) ActiveRecordBackend.new(limit: limit, model_class: model_class) else raise ArgumentError, "To store traces, install ActiveRecord or provide `redis: ...`" end detailed_trace = self.new(storage: storage, trace_mode: trace_mode, debug: debug) schema.detailed_trace = detailed_trace schema.trace_with(PerfettoTrace, mode: trace_mode, save_profile: true) end |
Instance Method Details
#debug? ⇒ Boolean
99 100 101 |
# File 'lib/graphql/tracing/detailed_trace.rb', line 99 def debug? @debug end |
#delete_all_traces ⇒ void
This method returns an undefined value.
121 122 123 |
# File 'lib/graphql/tracing/detailed_trace.rb', line 121 def delete_all_traces @storage.delete_all_traces end |
#delete_trace(id) ⇒ void
This method returns an undefined value.
116 117 118 |
# File 'lib/graphql/tracing/detailed_trace.rb', line 116 def delete_trace(id) @storage.delete_trace(id) end |
#find_trace(id) ⇒ StoredTrace?
111 112 113 |
# File 'lib/graphql/tracing/detailed_trace.rb', line 111 def find_trace(id) @storage.find_trace(id) end |
#inspect_object(object) ⇒ Object
125 126 127 |
# File 'lib/graphql/tracing/detailed_trace.rb', line 125 def inspect_object(object) self.class.inspect_object(object) end |
#save_trace(operation_name, duration_ms, begin_ms, trace_data) ⇒ String
Returns ID of saved trace.
94 95 96 |
# File 'lib/graphql/tracing/detailed_trace.rb', line 94 def save_trace(operation_name, duration_ms, begin_ms, trace_data) @storage.save_trace(operation_name, duration_ms, begin_ms, trace_data) end |
#traces(last: nil, before: nil) ⇒ Enumerable<StoredTrace>
106 107 108 |
# File 'lib/graphql/tracing/detailed_trace.rb', line 106 def traces(last: nil, before: nil) @storage.traces(last: last, before: before) end |