mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-01 01:25:43 -05:00
Bugs fixes so XEvent profiler isn't broken (#577)
* Fix a few issues with profiler method handlers * Filter out profiler polling events * Add a unit test for profiler events * Add method comment headers
This commit is contained in:
@@ -129,7 +129,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Profiler
|
||||
|
||||
if (connInfo != null)
|
||||
{
|
||||
ProfilerSession session = StartSession(connInfo);
|
||||
ProfilerSession session = StartSession(parameters.OwnerUri, connInfo);
|
||||
result.SessionId = session.SessionId;
|
||||
result.Succeeded = true;
|
||||
}
|
||||
@@ -154,7 +154,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Profiler
|
||||
{
|
||||
try
|
||||
{
|
||||
monitor.StopMonitoringSession(parameters.SessionId);
|
||||
monitor.StopMonitoringSession(parameters.OwnerUri);
|
||||
await requestContext.SendResult(new StopProfilingResult
|
||||
{
|
||||
Succeeded = true
|
||||
@@ -169,13 +169,13 @@ namespace Microsoft.SqlTools.ServiceLayer.Profiler
|
||||
/// <summary>
|
||||
/// Starts a new profiler session for the provided connection
|
||||
/// </summary>
|
||||
internal ProfilerSession StartSession(ConnectionInfo connInfo)
|
||||
internal ProfilerSession StartSession(string sessionId, ConnectionInfo connInfo)
|
||||
{
|
||||
// create a new XEvent session and Profiler session
|
||||
var xeSession = this.XEventSessionFactory.CreateXEventSession(connInfo);
|
||||
var profilerSession = new ProfilerSession()
|
||||
{
|
||||
SessionId = Guid.NewGuid().ToString(),
|
||||
SessionId = sessionId,
|
||||
XEventSession = xeSession
|
||||
};
|
||||
|
||||
@@ -208,8 +208,13 @@ namespace Microsoft.SqlTools.ServiceLayer.Profiler
|
||||
private static Session GetOrCreateSession(SqlStoreConnection connection, string sessionName)
|
||||
{
|
||||
XEStore store = new XEStore(connection);
|
||||
Session session = store.Sessions["Profiler"];
|
||||
Session session = store.Sessions[sessionName];
|
||||
// start the session if it isn't already running
|
||||
if (session == null)
|
||||
{
|
||||
session = CreateSession(connection, sessionName);
|
||||
}
|
||||
|
||||
if (session != null && !session.IsRunning)
|
||||
{
|
||||
session.Start();
|
||||
@@ -217,6 +222,38 @@ namespace Microsoft.SqlTools.ServiceLayer.Profiler
|
||||
return session;
|
||||
}
|
||||
|
||||
private static Session CreateSession(SqlStoreConnection connection, string sessionName)
|
||||
{
|
||||
string createSessionSql =
|
||||
@"
|
||||
CREATE EVENT SESSION [Profiler] ON SERVER
|
||||
ADD EVENT sqlserver.attention(
|
||||
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)
|
||||
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
|
||||
ADD EVENT sqlserver.existing_connection(SET collect_options_text=(1)
|
||||
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)),
|
||||
ADD EVENT sqlserver.login(SET collect_options_text=(1)
|
||||
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)),
|
||||
ADD EVENT sqlserver.logout(
|
||||
ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.client_pid,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_id)),
|
||||
ADD EVENT sqlserver.rpc_completed(
|
||||
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)
|
||||
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
|
||||
ADD EVENT sqlserver.sql_batch_completed(
|
||||
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)
|
||||
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0)))),
|
||||
ADD EVENT sqlserver.sql_batch_starting(
|
||||
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)
|
||||
WHERE ([package0].[equal_boolean]([sqlserver].[is_system],(0))))
|
||||
ADD TARGET package0.ring_buffer(SET max_events_limit=(1000),max_memory=(51200))
|
||||
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)";
|
||||
|
||||
connection.ServerConnection.ExecuteNonQuery(createSessionSql);
|
||||
|
||||
XEStore store = new XEStore(connection);
|
||||
return store.Sessions[sessionName];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Callback when profiler events are available
|
||||
/// </summary>
|
||||
@@ -227,7 +264,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Profiler
|
||||
ProfilerEventsAvailableNotification.Type,
|
||||
new ProfilerEventsAvailableParams()
|
||||
{
|
||||
SessionId = sessionId,
|
||||
OwnerUri = sessionId,
|
||||
Events = events
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user