public DiagnosticTest() { QueryEngine engine = new DiagnosticsQueryEngine(); _server = TestTdsServer.StartServerWithQueryEngine(engine); _connectionString = _server.ConnectionString; }
private static async Task CollectStatisticsDiagnosticsAsync(Func <string, Task> sqlOperation, [CallerMemberName] string methodName = "") { bool statsLogged = false; bool operationHasError = false; Guid beginOperationId = Guid.Empty; FakeDiagnosticListenerObserver diagnosticListenerObserver = new FakeDiagnosticListenerObserver(kvp => { IDictionary statistics; if (kvp.Key.Equals("System.Data.SqlClient.WriteCommandBefore")) { Assert.NotNull(kvp.Value); Guid retrievedOperationId = GetPropertyValueFromType <Guid>(kvp.Value, "OperationId"); Assert.NotEqual(retrievedOperationId, Guid.Empty); SqlCommand sqlCommand = GetPropertyValueFromType <SqlCommand>(kvp.Value, "Command"); Assert.NotNull(sqlCommand); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); beginOperationId = retrievedOperationId; statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteCommandAfter")) { Assert.NotNull(kvp.Value); Guid retrievedOperationId = GetPropertyValueFromType <Guid>(kvp.Value, "OperationId"); Assert.NotEqual(retrievedOperationId, Guid.Empty); SqlCommand sqlCommand = GetPropertyValueFromType <SqlCommand>(kvp.Value, "Command"); Assert.NotNull(sqlCommand); statistics = GetPropertyValueFromType <IDictionary>(kvp.Value, "Statistics"); if (!operationHasError) { Assert.NotNull(statistics); } string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); // if we get to this point, then statistics exist and this must be the "end" // event, so we need to make sure the operation IDs match Assert.Equal(retrievedOperationId, beginOperationId); beginOperationId = Guid.Empty; statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteCommandError")) { operationHasError = true; Assert.NotNull(kvp.Value); SqlCommand sqlCommand = GetPropertyValueFromType <SqlCommand>(kvp.Value, "Command"); Assert.NotNull(sqlCommand); Exception ex = GetPropertyValueFromType <Exception>(kvp.Value, "Exception"); Assert.NotNull(ex); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteConnectionOpenBefore")) { Assert.NotNull(kvp.Value); SqlConnection sqlConnection = GetPropertyValueFromType <SqlConnection>(kvp.Value, "Connection"); Assert.NotNull(sqlConnection); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteConnectionOpenAfter")) { Assert.NotNull(kvp.Value); SqlConnection sqlConnection = GetPropertyValueFromType <SqlConnection>(kvp.Value, "Connection"); Assert.NotNull(sqlConnection); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); statistics = GetPropertyValueFromType <IDictionary>(kvp.Value, "Statistics"); Assert.NotNull(statistics); Guid connectionId = GetPropertyValueFromType <Guid>(kvp.Value, "ConnectionId"); if (sqlConnection.State == ConnectionState.Open) { Assert.NotEqual(connectionId, Guid.Empty); } statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteConnectionOpenError")) { Assert.NotNull(kvp.Value); SqlConnection sqlConnection = GetPropertyValueFromType <SqlConnection>(kvp.Value, "Connection"); Assert.NotNull(sqlConnection); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); Exception ex = GetPropertyValueFromType <Exception>(kvp.Value, "Exception"); Assert.NotNull(ex); statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteConnectionCloseBefore")) { Assert.NotNull(kvp.Value); SqlConnection sqlConnection = GetPropertyValueFromType <SqlConnection>(kvp.Value, "Connection"); Assert.NotNull(sqlConnection); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); Guid connectionId = GetPropertyValueFromType <Guid>(kvp.Value, "ConnectionId"); Assert.NotEqual(connectionId, Guid.Empty); statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteConnectionCloseAfter")) { Assert.NotNull(kvp.Value); SqlConnection sqlConnection = GetPropertyValueFromType <SqlConnection>(kvp.Value, "Connection"); Assert.NotNull(sqlConnection); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); statistics = GetPropertyValueFromType <IDictionary>(kvp.Value, "Statistics"); Guid connectionId = GetPropertyValueFromType <Guid>(kvp.Value, "ConnectionId"); Assert.NotEqual(connectionId, Guid.Empty); statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteConnectionCloseError")) { Assert.NotNull(kvp.Value); SqlConnection sqlConnection = GetPropertyValueFromType <SqlConnection>(kvp.Value, "Connection"); Assert.NotNull(sqlConnection); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); Exception ex = GetPropertyValueFromType <Exception>(kvp.Value, "Exception"); Assert.NotNull(ex); Guid connectionId = GetPropertyValueFromType <Guid>(kvp.Value, "ConnectionId"); Assert.NotEqual(connectionId, Guid.Empty); statsLogged = true; } }); diagnosticListenerObserver.Enable(); using (DiagnosticListener.AllListeners.Subscribe(diagnosticListenerObserver)) { Console.WriteLine(string.Format("Test: {0} Enabled Listeners", methodName)); using (var server = TestTdsServer.StartServerWithQueryEngine(new DiagnosticsQueryEngine(), methodName: methodName)) { Console.WriteLine(string.Format("Test: {0} Started Server", methodName)); await sqlOperation(server.ConnectionString); Console.WriteLine(string.Format("Test: {0} SqlOperation Successful", methodName)); Assert.True(statsLogged); diagnosticListenerObserver.Disable(); Console.WriteLine(string.Format("Test: {0} Listeners Disabled", methodName)); } Console.WriteLine(string.Format("Test: {0} Server Disposed", methodName)); } Console.WriteLine(string.Format("Test: {0} Listeners Disposed Successfully", methodName)); }
private static void CollectStatisticsDiagnostics(Action <string> sqlOperation, bool enableServerLogging = false) { bool statsLogged = false; bool operationHasError = false; Guid beginOperationId = Guid.Empty; FakeDiagnosticListenerObserver diagnosticListenerObserver = new FakeDiagnosticListenerObserver(kvp => { IDictionary statistics; if (kvp.Key.Equals("System.Data.SqlClient.WriteCommandBefore")) { Assert.NotNull(kvp.Value); Guid retrievedOperationId = GetPropertyValueFromType <Guid>(kvp.Value, "OperationId"); Assert.NotEqual(retrievedOperationId, Guid.Empty); SqlCommand sqlCommand = GetPropertyValueFromType <SqlCommand>(kvp.Value, "Command"); Assert.NotNull(sqlCommand); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); Guid connectionId = GetPropertyValueFromType <Guid>(kvp.Value, "ConnectionId"); if (sqlCommand.Connection.State == ConnectionState.Open) { Assert.NotEqual(connectionId, Guid.Empty); } beginOperationId = retrievedOperationId; statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteCommandAfter")) { Assert.NotNull(kvp.Value); Guid retrievedOperationId = GetPropertyValueFromType <Guid>(kvp.Value, "OperationId"); Assert.NotEqual(retrievedOperationId, Guid.Empty); SqlCommand sqlCommand = GetPropertyValueFromType <SqlCommand>(kvp.Value, "Command"); Assert.NotNull(sqlCommand); statistics = GetPropertyValueFromType <IDictionary>(kvp.Value, "Statistics"); if (!operationHasError) { Assert.NotNull(statistics); } string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); Guid connectionId = GetPropertyValueFromType <Guid>(kvp.Value, "ConnectionId"); if (sqlCommand.Connection.State == ConnectionState.Open) { Assert.NotEqual(connectionId, Guid.Empty); } // if we get to this point, then statistics exist and this must be the "end" // event, so we need to make sure the operation IDs match Assert.Equal(retrievedOperationId, beginOperationId); beginOperationId = Guid.Empty; statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteCommandError")) { operationHasError = true; Assert.NotNull(kvp.Value); SqlCommand sqlCommand = GetPropertyValueFromType <SqlCommand>(kvp.Value, "Command"); Assert.NotNull(sqlCommand); Exception ex = GetPropertyValueFromType <Exception>(kvp.Value, "Exception"); Assert.NotNull(ex); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); Guid connectionId = GetPropertyValueFromType <Guid>(kvp.Value, "ConnectionId"); if (sqlCommand.Connection.State == ConnectionState.Open) { Assert.NotEqual(connectionId, Guid.Empty); } statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteConnectionOpenBefore")) { Assert.NotNull(kvp.Value); SqlConnection sqlConnection = GetPropertyValueFromType <SqlConnection>(kvp.Value, "Connection"); Assert.NotNull(sqlConnection); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteConnectionOpenAfter")) { Assert.NotNull(kvp.Value); SqlConnection sqlConnection = GetPropertyValueFromType <SqlConnection>(kvp.Value, "Connection"); Assert.NotNull(sqlConnection); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); statistics = GetPropertyValueFromType <IDictionary>(kvp.Value, "Statistics"); Assert.NotNull(statistics); Guid connectionId = GetPropertyValueFromType <Guid>(kvp.Value, "ConnectionId"); Assert.NotEqual(connectionId, Guid.Empty); statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteConnectionOpenError")) { Assert.NotNull(kvp.Value); SqlConnection sqlConnection = GetPropertyValueFromType <SqlConnection>(kvp.Value, "Connection"); Assert.NotNull(sqlConnection); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); Exception ex = GetPropertyValueFromType <Exception>(kvp.Value, "Exception"); Assert.NotNull(ex); statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteConnectionCloseBefore")) { Assert.NotNull(kvp.Value); SqlConnection sqlConnection = GetPropertyValueFromType <SqlConnection>(kvp.Value, "Connection"); Assert.NotNull(sqlConnection); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); Guid connectionId = GetPropertyValueFromType <Guid>(kvp.Value, "ConnectionId"); Assert.NotEqual(connectionId, Guid.Empty); statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteConnectionCloseAfter")) { Assert.NotNull(kvp.Value); SqlConnection sqlConnection = GetPropertyValueFromType <SqlConnection>(kvp.Value, "Connection"); Assert.NotNull(sqlConnection); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); statistics = GetPropertyValueFromType <IDictionary>(kvp.Value, "Statistics"); Guid connectionId = GetPropertyValueFromType <Guid>(kvp.Value, "ConnectionId"); Assert.NotEqual(connectionId, Guid.Empty); statsLogged = true; } else if (kvp.Key.Equals("System.Data.SqlClient.WriteConnectionCloseError")) { Assert.NotNull(kvp.Value); SqlConnection sqlConnection = GetPropertyValueFromType <SqlConnection>(kvp.Value, "Connection"); Assert.NotNull(sqlConnection); string operation = GetPropertyValueFromType <string>(kvp.Value, "Operation"); Assert.False(string.IsNullOrWhiteSpace(operation)); Exception ex = GetPropertyValueFromType <Exception>(kvp.Value, "Exception"); Assert.NotNull(ex); Guid connectionId = GetPropertyValueFromType <Guid>(kvp.Value, "ConnectionId"); Assert.NotEqual(connectionId, Guid.Empty); statsLogged = true; } }); diagnosticListenerObserver.Enable(); using (DiagnosticListener.AllListeners.Subscribe(diagnosticListenerObserver)) using (var server = TestTdsServer.StartServerWithQueryEngine(new DiagnosticsQueryEngine(), enableLog: enableServerLogging)) { sqlOperation(server.ConnectionString); Assert.True(statsLogged); diagnosticListenerObserver.Disable(); } }