Skip to content

Commit 5977eb3

Browse files
committed
Add performance tracking to graphql
1 parent e610ffe commit 5977eb3

2 files changed

Lines changed: 66 additions & 1 deletion

File tree

app/controllers/graphql_controller.rb

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ def execute
2626
}
2727

2828
Code0::ZeroTrack::Context.with_context(user: { id: current_user&.id, username: current_user&.username }) do
29-
result = SagittariusSchema.execute(query, variables: variables, context: context, operation_name: operation_name)
29+
result = with_performance_tracking(current_user) do
30+
SagittariusSchema.execute(query, variables: variables, context: context, operation_name: operation_name)
31+
end
32+
3033
render json: result
3134
rescue StandardError => e
3235
logger.error message: e.message, backtrace: e.backtrace, exception_class: e.class
@@ -89,4 +92,48 @@ def anonymous_mutation?
8992
usersPasswordReset
9093
].include?(mutation_name)
9194
end
95+
96+
def with_performance_tracking(current_user)
97+
return yield unless current_user&.admin
98+
99+
PerformanceCollector.start_performance_tracking
100+
101+
result = yield
102+
103+
queries = PerformanceCollector.sql_queries || []
104+
total_duration = ((Sagittarius::Utils.monotonic_time - PerformanceCollector.query_start_time) * 1000).round(2)
105+
106+
include_queries = request.headers['X-Sagittarius-Performance-Details']&.include?('queries')
107+
108+
result['extensions'] ||= {}
109+
result['extensions']['performance'] = {
110+
total_duration_ms: total_duration,
111+
query_count: queries.size,
112+
query_duration_ms: queries.sum { |q| q[:duration_ms] }.round(2),
113+
queries: include_queries ? queries : nil,
114+
}.compact
115+
116+
PerformanceCollector.end_performance_tracking
117+
118+
result
119+
end
120+
121+
class PerformanceCollector < ActiveSupport::CurrentAttributes
122+
attribute :sql_queries, :query_start_time
123+
124+
def self.start_performance_tracking
125+
self.sql_queries = []
126+
self.query_start_time = Sagittarius::Utils.monotonic_time
127+
end
128+
129+
def self.end_performance_tracking
130+
self.sql_queries = nil
131+
self.query_start_time = nil
132+
end
133+
134+
def self.add_query(sql:, duration_ms:, name:, cached:)
135+
self.sql_queries ||= []
136+
self.sql_queries << { sql: sql, duration_ms: duration_ms, name: name, cached: !!cached }
137+
end
138+
end
92139
end
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# frozen_string_literal: true
2+
3+
Rails.application.config.after_initialize do
4+
ActiveSupport::Notifications.subscribe('sql.active_record') do |*args|
5+
event = ActiveSupport::Notifications::Event.new(*args)
6+
7+
next if event.payload[:name] == 'SCHEMA'
8+
next if event.payload[:name] == 'CACHE'
9+
next unless GraphqlController::PerformanceCollector.sql_queries # Only track if initialized
10+
11+
GraphqlController::PerformanceCollector.add_query(
12+
sql: event.payload[:sql],
13+
duration_ms: event.duration.round(2),
14+
name: event.payload[:name],
15+
cached: event.payload[:cached]
16+
)
17+
end
18+
end

0 commit comments

Comments
 (0)