mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-27 01:25:42 -05:00
Profiler notifications (#640)
* Initial changes for adding lost event notifications * Handling polling errors by notifying listeners * Restructuring lost events & testing * Minor fixes to tests * Add back in filtering * Changing how lost events are found * Cleaning up tests
This commit is contained in:
committed by
GitHub
parent
f244d307e2
commit
838a7e4fab
@@ -46,7 +46,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
|
||||
// capture listener event notifications
|
||||
var mockListener = new Mock<IProfilerSessionListener>();
|
||||
mockListener.Setup(p => p.EventsAvailable(It.IsAny<string>(), It.IsAny<List<ProfilerEvent>>())).Callback(() =>
|
||||
mockListener.Setup(p => p.EventsAvailable(It.IsAny<string>(), It.IsAny<List<ProfilerEvent>>(), It.IsAny<bool>())).Callback(() =>
|
||||
{
|
||||
recievedEvents = true;
|
||||
});
|
||||
@@ -166,7 +166,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
|
||||
// capture listener event notifications
|
||||
var mockListener = new Mock<IProfilerSessionListener>();
|
||||
mockListener.Setup(p => p.EventsAvailable(It.IsAny<string>(), It.IsAny<List<ProfilerEvent>>())).Callback(() =>
|
||||
mockListener.Setup(p => p.EventsAvailable(It.IsAny<string>(), It.IsAny<List<ProfilerEvent>>(), It.IsAny<bool>())).Callback(() =>
|
||||
{
|
||||
recievedEvents = true;
|
||||
});
|
||||
@@ -235,5 +235,52 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
|
||||
requestContext.VerifyAll();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test notifications for stopped sessions
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task TestStoppedSessionNotification()
|
||||
{
|
||||
bool sessionStopped = false;
|
||||
string testUri = "profiler_uri";
|
||||
|
||||
// capture listener event notifications
|
||||
var mockSession = new Mock<IXEventSession>();
|
||||
mockSession.Setup(p => p.GetTargetXml()).Callback(() =>
|
||||
{
|
||||
throw new XEventException();
|
||||
});
|
||||
|
||||
var mockListener = new Mock<IProfilerSessionListener>();
|
||||
mockListener.Setup(p => p.SessionStopped(It.IsAny<string>(), It.IsAny<int>())).Callback(() =>
|
||||
{
|
||||
sessionStopped = true;
|
||||
});
|
||||
|
||||
var profilerService = new ProfilerService();
|
||||
profilerService.SessionMonitor.AddSessionListener(mockListener.Object);
|
||||
profilerService.ConnectionServiceInstance = TestObjects.GetTestConnectionService();
|
||||
ConnectionInfo connectionInfo = TestObjects.GetTestConnectionInfo();
|
||||
profilerService.ConnectionServiceInstance.OwnerToConnectionMap.Add(testUri, connectionInfo);
|
||||
|
||||
// start monitoring test session
|
||||
profilerService.SessionMonitor.StartMonitoringSession(testUri, mockSession.Object);
|
||||
|
||||
// wait for polling to finish, or for timeout
|
||||
System.Timers.Timer pollingTimer = new System.Timers.Timer();
|
||||
pollingTimer.Interval = 10000;
|
||||
pollingTimer.Start();
|
||||
bool timeout = false;
|
||||
pollingTimer.Elapsed += new System.Timers.ElapsedEventHandler((s_, e_) => {timeout = true;});
|
||||
while (sessionStopped == false && !timeout)
|
||||
{
|
||||
Thread.Sleep(250);
|
||||
}
|
||||
pollingTimer.Stop();
|
||||
|
||||
// check that a stopped session notification was sent
|
||||
Assert.True(sessionStopped);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
|
||||
// add a new event
|
||||
var newEvent = new ProfilerEvent("new event", "1/1/2017");
|
||||
newEvent.Values.Add("event_sequence", "4");
|
||||
allEvents.Add(newEvent);
|
||||
|
||||
// poll all events
|
||||
@@ -52,7 +53,6 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
Assert.Equal(profilerEvents.Count, 0);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Test the FilterProfilerEvents method
|
||||
/// </summary>
|
||||
@@ -68,6 +68,7 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
// add a new "Profiler Polling" event
|
||||
var newEvent = new ProfilerEvent("sql_batch_completed", "1/1/2017");
|
||||
newEvent.Values.Add("batch_text", "SELECT target_data FROM sys.dm_xe_session_targets");
|
||||
newEvent.Values.Add("event_sequence", "4");
|
||||
profilerEvents.Add(newEvent);
|
||||
|
||||
// verify that the polling event is removed
|
||||
@@ -76,6 +77,53 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
Assert.Equal(newProfilerEvents.Count, expectedEventCount);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test notifications for lost events
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void TestEventsLost()
|
||||
{
|
||||
// create a profiler session and get some test events
|
||||
var profilerSession = new ProfilerSession();
|
||||
var profilerEvents = ProfilerTestObjects.TestProfilerEvents;
|
||||
|
||||
// filter all the results from the first poll
|
||||
// these events happened before the profiler began
|
||||
profilerSession.FilterOldEvents(profilerEvents);
|
||||
Assert.Equal(profilerEvents.Count, 0);
|
||||
// No events should be lost
|
||||
Assert.False(profilerSession.EventsLost);
|
||||
|
||||
// test all events are overwritten, but no events are lost
|
||||
profilerEvents.Clear();
|
||||
ProfilerEvent newEvent = new ProfilerEvent("event4", "6/18/2018");
|
||||
newEvent.Values.Add("event_sequence", "4");
|
||||
|
||||
profilerEvents.Add(newEvent);
|
||||
profilerSession.FilterOldEvents(profilerEvents);
|
||||
|
||||
// should not show event loss
|
||||
Assert.False(profilerSession.EventsLost);
|
||||
|
||||
// test all events are overwritten, and events are lost
|
||||
profilerEvents.Clear();
|
||||
newEvent = new ProfilerEvent("event7", "6/18/2018");
|
||||
newEvent.Values.Add("event_sequence", "7");
|
||||
|
||||
profilerEvents.Add(newEvent);
|
||||
profilerSession.FilterOldEvents(profilerEvents);
|
||||
|
||||
// should show event loss
|
||||
Assert.True(profilerSession.EventsLost);
|
||||
|
||||
//poll again with previously seen events
|
||||
profilerEvents.Add(newEvent);
|
||||
|
||||
// old events were seen, no event loss occured
|
||||
profilerSession.FilterOldEvents(profilerEvents);
|
||||
Assert.False(profilerSession.EventsLost);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test the TryEnterPolling method
|
||||
/// </summary>
|
||||
|
||||
@@ -25,11 +25,18 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
{
|
||||
get
|
||||
{
|
||||
ProfilerEvent event1 = new ProfilerEvent("event1", "1/1/2017");
|
||||
event1.Values.Add("event_sequence", "1");
|
||||
ProfilerEvent event2 = new ProfilerEvent("event2", "1/2/2017");
|
||||
event2.Values.Add("event_sequence", "2");
|
||||
ProfilerEvent event3 = new ProfilerEvent("event3", "1/3/2017");
|
||||
event3.Values.Add("event_sequence", "3");
|
||||
|
||||
return new List<ProfilerEvent>
|
||||
{
|
||||
new ProfilerEvent("event1", "1/1/2017"),
|
||||
new ProfilerEvent("event2", "1/2/2017"),
|
||||
new ProfilerEvent("event3", "1/3/2017")
|
||||
event1,
|
||||
event2,
|
||||
event3
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -41,11 +48,18 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
|
||||
public List<ProfilerEvent> PreviousEvents { get; set; }
|
||||
|
||||
public void EventsAvailable(string sessionId, List<ProfilerEvent> events)
|
||||
public bool Stopped { get; set; }
|
||||
|
||||
public void EventsAvailable(string sessionId, List<ProfilerEvent> events, bool eventsLost)
|
||||
{
|
||||
this.PreviousSessionId = sessionId;
|
||||
this.PreviousEvents = events;
|
||||
}
|
||||
|
||||
public void SessionStopped(string viewerId, int sessionId)
|
||||
{
|
||||
Stopped = true;
|
||||
}
|
||||
}
|
||||
|
||||
public class TestXEventSession : IXEventSession
|
||||
@@ -210,6 +224,10 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>1</value>" +
|
||||
" </data>" +
|
||||
" <data name=\"event_sequence\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>1</value>" +
|
||||
" </data>" +
|
||||
" </event>" +
|
||||
"</RingBufferTarget>";
|
||||
|
||||
@@ -220,12 +238,20 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>1</value>" +
|
||||
" </data>" +
|
||||
" <data name=\"event_sequence\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>1</value>" +
|
||||
" </data>" +
|
||||
" </event>" +
|
||||
" <event name=\"existing_connection\" package=\"sqlserver\" timestamp=\"2017-10-08T07:46:53.579Z\">" +
|
||||
" <data name=\"session_id\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>1</value>" +
|
||||
" </data>" +
|
||||
" <data name=\"event_sequence\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>2</value>" +
|
||||
" </data>" +
|
||||
" </event>" +
|
||||
"</RingBufferTarget>";
|
||||
|
||||
@@ -236,18 +262,30 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>1</value>" +
|
||||
" </data>" +
|
||||
" <data name=\"event_sequence\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>1</value>" +
|
||||
" </data>" +
|
||||
" </event>" +
|
||||
" <event name=\"existing_connection\" package=\"sqlserver\" timestamp=\"2017-10-08T07:46:53.579Z\">" +
|
||||
" <data name=\"session_id\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>1</value>" +
|
||||
" </data>" +
|
||||
" <data name=\"event_sequence\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>2</value>" +
|
||||
" </data>" +
|
||||
" </event>" +
|
||||
" <event name=\"existing_connection\" package=\"sqlserver\" timestamp=\"2017-11-08T07:46:53.579Z\">" +
|
||||
" <data name=\"session_id\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>1</value>" +
|
||||
" </data>" +
|
||||
" <data name=\"event_sequence\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>3</value>" +
|
||||
" </data>" +
|
||||
" </event>" +
|
||||
"</RingBufferTarget>";
|
||||
|
||||
@@ -277,6 +315,10 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>2</value>" +
|
||||
" </data>" +
|
||||
" <data name=\"event_sequence\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>1</value>" +
|
||||
" </data>" +
|
||||
" </event>" +
|
||||
"</RingBufferTarget>";
|
||||
|
||||
@@ -287,12 +329,20 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>2</value>" +
|
||||
" </data>" +
|
||||
" <data name=\"event_sequence\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>1</value>" +
|
||||
" </data>" +
|
||||
" </event>" +
|
||||
" <event name=\"existing_connection\" package=\"sqlserver\" timestamp=\"2017-10-08T07:46:53.579Z\">" +
|
||||
" <data name=\"session_id\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>2</value>" +
|
||||
" </data>" +
|
||||
" <data name=\"event_sequence\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>2</value>" +
|
||||
" </data>" +
|
||||
" </event>" +
|
||||
"</RingBufferTarget>";
|
||||
|
||||
@@ -303,18 +353,30 @@ namespace Microsoft.SqlTools.ServiceLayer.UnitTests.Profiler
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>2</value>" +
|
||||
" </data>" +
|
||||
" <data name=\"event_sequence\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>1</value>" +
|
||||
" </data>" +
|
||||
" </event>" +
|
||||
" <event name=\"existing_connection\" package=\"sqlserver\" timestamp=\"2017-10-08T07:46:53.579Z\">" +
|
||||
" <data name=\"session_id\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>2</value>" +
|
||||
" </data>" +
|
||||
" <data name=\"event_sequence\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>2</value>" +
|
||||
" </data>" +
|
||||
" </event>" +
|
||||
" <event name=\"existing_connection\" package=\"sqlserver\" timestamp=\"2017-11-08T07:46:53.579Z\">" +
|
||||
" <data name=\"session_id\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>2</value>" +
|
||||
" </data>" +
|
||||
" <data name=\"event_sequence\">" +
|
||||
" <type name=\"int16\" package=\"package0\"></type>" +
|
||||
" <value>3</value>" +
|
||||
" </data>" +
|
||||
" </event>" +
|
||||
"</RingBufferTarget>";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user