@@ -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
92139end
0 commit comments