@@ -129,7 +129,7 @@ internal async Task HandleStartProfilingRequest(StartProfilingParams parameters,
129129
130130 if ( connInfo != null )
131131 {
132- ProfilerSession session = StartSession ( connInfo ) ;
132+ ProfilerSession session = StartSession ( parameters . OwnerUri , connInfo ) ;
133133 result . SessionId = session . SessionId ;
134134 result . Succeeded = true ;
135135 }
@@ -154,7 +154,7 @@ internal async Task HandleStopProfilingRequest(StopProfilingParams parameters, R
154154 {
155155 try
156156 {
157- monitor . StopMonitoringSession ( parameters . SessionId ) ;
157+ monitor . StopMonitoringSession ( parameters . OwnerUri ) ;
158158 await requestContext . SendResult ( new StopProfilingResult
159159 {
160160 Succeeded = true
@@ -169,13 +169,13 @@ await requestContext.SendResult(new StopProfilingResult
169169 /// <summary>
170170 /// Starts a new profiler session for the provided connection
171171 /// </summary>
172- internal ProfilerSession StartSession ( ConnectionInfo connInfo )
172+ internal ProfilerSession StartSession ( string sessionId , ConnectionInfo connInfo )
173173 {
174174 // create a new XEvent session and Profiler session
175175 var xeSession = this . XEventSessionFactory . CreateXEventSession ( connInfo ) ;
176176 var profilerSession = new ProfilerSession ( )
177177 {
178- SessionId = Guid . NewGuid ( ) . ToString ( ) ,
178+ SessionId = sessionId ,
179179 XEventSession = xeSession
180180 } ;
181181
@@ -208,15 +208,52 @@ public IXEventSession CreateXEventSession(ConnectionInfo connInfo)
208208 private static Session GetOrCreateSession ( SqlStoreConnection connection , string sessionName )
209209 {
210210 XEStore store = new XEStore ( connection ) ;
211- Session session = store . Sessions [ "Profiler" ] ;
211+ Session session = store . Sessions [ sessionName ] ;
212212 // start the session if it isn't already running
213+ if ( session == null )
214+ {
215+ session = CreateSession ( connection , sessionName ) ;
216+ }
217+
213218 if ( session != null && ! session . IsRunning )
214219 {
215220 session . Start ( ) ;
216221 }
217222 return session ;
218223 }
219224
225+ private static Session CreateSession ( SqlStoreConnection connection , string sessionName )
226+ {
227+ string createSessionSql =
228+ @"
229+ CREATE EVENT SESSION [Profiler] ON SERVER
230+ ADD EVENT sqlserver.attention(
231+ ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id)
232+ WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
233+ ADD EVENT sqlserver.existing_connection(SET collect_options_text=(1)
234+ ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)),
235+ ADD EVENT sqlserver.login(SET collect_options_text=(1)
236+ ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)),
237+ ADD EVENT sqlserver.logout(
238+ ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)),
239+ ADD EVENT sqlserver.rpc_completed(
240+ ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id)
241+ WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
242+ ADD EVENT sqlserver.sql_batch_completed(
243+ ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id)
244+ WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
245+ ADD EVENT sqlserver.sql_batch_starting(
246+ ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.database_id,sqlserver.nt_username,sqlserver.query_hash,sqlserver.server_principal_name,sqlserver.session_id)
247+ WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0))))
248+ ADD TARGET package0.ring_buffer(SET max_events_limit=(1000),max_memory=(51200))
249+ WITH (MAX_MEMORY=8192 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)" ;
250+
251+ connection . ServerConnection . ExecuteNonQuery ( createSessionSql ) ;
252+
253+ XEStore store = new XEStore ( connection ) ;
254+ return store . Sessions [ sessionName ] ;
255+ }
256+
220257 /// <summary>
221258 /// Callback when profiler events are available
222259 /// </summary>
@@ -227,7 +264,7 @@ public void EventsAvailable(string sessionId, List<ProfilerEvent> events)
227264 ProfilerEventsAvailableNotification . Type ,
228265 new ProfilerEventsAvailableParams ( )
229266 {
230- SessionId = sessionId ,
267+ OwnerUri = sessionId ,
231268 Events = events
232269 } ) ;
233270 }
0 commit comments