Last active
May 10, 2024 15:42
-
-
Save codykonior/a05305435c797ff97f9fd151f16a98e5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # As of SQL 2017 | |
| /Record @id @type @time | |
| /Record/ConnectivityTraceRecord/ClientConnectionId | |
| /Record/ConnectivityTraceRecord/IsClient | |
| /Record/ConnectivityTraceRecord/LocalHost | |
| /Record/ConnectivityTraceRecord/LocalPort | |
| /Record/ConnectivityTraceRecord/OSError | |
| /Record/ConnectivityTraceRecord/RecordSource | |
| /Record/ConnectivityTraceRecord/RecordTime | |
| /Record/ConnectivityTraceRecord/RecordType | |
| /Record/ConnectivityTraceRecord/RemoteHost | |
| /Record/ConnectivityTraceRecord/RemotePort | |
| /Record/ConnectivityTraceRecord/SniConnectionId | |
| /Record/ConnectivityTraceRecord/SniConnId | |
| /Record/ConnectivityTraceRecord/SniConsumerError | |
| /Record/ConnectivityTraceRecord/SniError | |
| /Record/ConnectivityTraceRecord/SniProvider | |
| /Record/ConnectivityTraceRecord/Spid | |
| /Record/ConnectivityTraceRecord/State | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/EnqueueTime | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/NetReadsTime | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/NetWritesTime | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/TotalTime | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Ssl/EnqueueTime | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Ssl/NetReadsTime | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Ssl/NetWritesTime | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Ssl/SecureCallsTime | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Ssl/TotalTime | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Sspi/EnqueueTime | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Sspi/NetReadsTime | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Sspi/NetWritesTime | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Sspi/SecureCallsTime | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Sspi/TotalTime | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/TriggerAndResGovTime/ExecClassifier | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/TriggerAndResGovTime/FindLogin | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/TriggerAndResGovTime/LogonTriggers | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/TriggerAndResGovTime/SessionRecover | |
| /Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/TriggerAndResGovTime/TotalTime | |
| /Record/ConnectivityTraceRecord/TdsBuffersInformation/TdsInputBufferBytes | |
| /Record/ConnectivityTraceRecord/TdsBuffersInformation/TdsInputBufferError | |
| /Record/ConnectivityTraceRecord/TdsBuffersInformation/TdsOutputBufferError | |
| /Record/ConnectivityTraceRecord/TdsBufInfo/InputBufBytes | |
| /Record/ConnectivityTraceRecord/TdsBufInfo/InputBufError | |
| /Record/ConnectivityTraceRecord/TdsBufInfo/OutputBufError | |
| /Record/ConnectivityTraceRecord/TdsDisconnectFlags/DisconnectDueToReadError | |
| /Record/ConnectivityTraceRecord/TdsDisconnectFlags/ErrorFoundBeforeLogin | |
| /Record/ConnectivityTraceRecord/TdsDisconnectFlags/NetworkErrorFoundInInputStream | |
| /Record/ConnectivityTraceRecord/TdsDisconnectFlags/NormalDisconnect | |
| /Record/ConnectivityTraceRecord/TdsDisconnectFlags/NormalLogout | |
| /Record/ConnectivityTraceRecord/TdsDisconnectFlags/PhysicalConnectionIsKilled | |
| /Record/ConnectivityTraceRecord/TdsDisconnectFlags/RoutingCompleted | |
| /Record/ConnectivityTraceRecord/TdsDisconnectFlags/SessionIsKilled | |
| /Record/Stack/frame | |
| # Also note that some fields seem to have changed names and can be coalesced. This | |
| # extracts all of the above information in flat format except the stack frame | |
| # Below updated for SQL 2019 | |
| ; WITH RingBuffer AS ( | |
| SELECT records.record.value('(/Record/@id)[1]', 'int') AS Id, | |
| records.record.value('(/Record/@type)[1]', 'varchar(50)') AS Type, | |
| records.record.value('(/Record/@time)[1]', 'bigint') AS Time, | |
| records.record.value('(/Record/ConnectivityTraceRecord/ClientConnectionId)[1]', 'uniqueidentifier') AS ClientConnectionId, | |
| records.record.value('(/Record/ConnectivityTraceRecord/IsClient)[1]', 'bit') AS IsClient, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LocalHost)[1]', 'varchar(max)') AS LocalHost, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LocalPort)[1]', 'int') AS LocalPort, | |
| records.record.value('(/Record/ConnectivityTraceRecord/OSError)[1]', 'int') AS OSError, | |
| records.record.value('(/Record/ConnectivityTraceRecord/RecordSource)[1]', 'varchar(max)') AS RecordSource, | |
| records.record.value('(/Record/ConnectivityTraceRecord/RecordTime)[1]', 'datetime') AS RecordTime, | |
| records.record.value('(/Record/ConnectivityTraceRecord/RecordType)[1]', 'varchar(max)') AS RecordType, | |
| records.record.value('(/Record/ConnectivityTraceRecord/RemoteHost)[1]', 'varchar(max)') AS RemoteHost, | |
| records.record.value('(/Record/ConnectivityTraceRecord/RemotePort)[1]', 'varchar(max)') AS RemotePort, | |
| records.record.value('(/Record/ConnectivityTraceRecord/SniConnectionId)[1]', 'uniqueidentifier') AS SniConnectionId, | |
| records.record.value('(/Record/ConnectivityTraceRecord/SniConnId)[1]', 'uniqueidentifier') AS SniConnId, | |
| records.record.value('(/Record/ConnectivityTraceRecord/SniConsumerError)[1]', 'int') AS SniConsumerError, | |
| records.record.value('(/Record/ConnectivityTraceRecord/SniError)[1]', 'int') AS SniError, | |
| records.record.value('(/Record/ConnectivityTraceRecord/SniProvider)[1]', 'int') AS SniProvider, | |
| records.record.value('(/Record/ConnectivityTraceRecord/Spid)[1]', 'int') AS Spid, | |
| records.record.value('(/Record/ConnectivityTraceRecord/State)[1]', 'int') AS State, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/EnqueueTime)[1]', 'int') AS EnqueueTime, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/NetReadsTime)[1]', 'int') AS NetReadsTime, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/NetWritesTime)[1]', 'int') AS NetWritesTime, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/TotalTime)[1]', 'int') AS TotalTime, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Ssl/EnqueueTime)[1]', 'int') AS EnqueueTimeSsl, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Ssl/NetReadsTime)[1]', 'int') AS NetReadsTimeSsl, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Ssl/NetWritesTime)[1]', 'int') AS NetWritesTimeSsl, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Ssl/SecureCallsTime)[1]', 'int') AS SecureCallsTimeSsl, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Ssl/TotalTime)[1]', 'int') AS TotalTimeSsl, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Sspi/EnqueueTime)[1]', 'int') AS EnqueueTimeSspi, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Sspi/NetReadsTime)[1]', 'int') AS NetReadsTimeSspi, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Sspi/NetWritesTime)[1]', 'int') AS NetWritesTimeSspi, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Sspi/SecureCallsTime)[1]', 'int') AS SecureCallsTimeSspi, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/Sspi/TotalTime)[1]', 'int') AS TotalTimeSspi, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/TriggerAndResGovTime/ExecClassifier)[1]', 'int') AS ExecClassifierGov, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/TriggerAndResGovTime/FindLogin)[1]', 'int') AS FindLoginGov, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/TriggerAndResGovTime/LogonTriggers)[1]', 'int') AS LogonTriggersGov, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/TriggerAndResGovTime/SessionRecover)[1]', 'int') AS SessionRecoverGov, | |
| records.record.value('(/Record/ConnectivityTraceRecord/LoginTimersInMilliseconds/TriggerAndResGovTime/TotalTime)[1]', 'int') AS TotalTimeGov, | |
| records.record.value('(/Record/ConnectivityTraceRecord/TdsBuffersInformation/TdsInputBufferBytes)[1]', 'int') AS TdsInputBufferBytes, | |
| records.record.value('(/Record/ConnectivityTraceRecord/TdsBuffersInformation/TdsInputBufferError)[1]', 'int') AS TdsInputBufferError, | |
| records.record.value('(/Record/ConnectivityTraceRecord/TdsBuffersInformation/TdsOutputBufferError)[1]', 'int') AS TdsOutputBufferError, | |
| records.record.value('(/Record/ConnectivityTraceRecord/TdsBufInfo/InputBufBytes)[1]', 'int') AS TdsInputBufBytes, | |
| records.record.value('(/Record/ConnectivityTraceRecord/TdsBufInfo/InputBufError)[1]', 'int') AS TdsInputBufError, | |
| records.record.value('(/Record/ConnectivityTraceRecord/TdsBufInfo/OutputBufError)[1]', 'int') AS TdsOutputBufError, | |
| records.record.value('(/Record/ConnectivityTraceRecord/TdsDisconnectFlags/DisconnectDueToReadError)[1]', 'bit') AS DisconnectDueToReadError, | |
| records.record.value('(/Record/ConnectivityTraceRecord/TdsDisconnectFlags/ErrorFoundBeforeLogin)[1]', 'bit') AS ErrorFoundBeforeLogin, | |
| records.record.value('(/Record/ConnectivityTraceRecord/TdsDisconnectFlags/NetworkErrorFoundInInputStream)[1]', 'bit') AS NetworkErrorFoundInInputStream, | |
| records.record.value('(/Record/ConnectivityTraceRecord/TdsDisconnectFlags/NormalDisconnect)[1]', 'bit') AS NormalDisconnect, | |
| records.record.value('(/Record/ConnectivityTraceRecord/TdsDisconnectFlags/NormalLogout)[1]', 'varchar(max)') AS NormalLogout, | |
| records.record.value('(/Record/ConnectivityTraceRecord/TdsDisconnectFlags/PhysicalConnectionIsKilled)[1]', 'int') AS PhysicalConnectionIsKilled, /* Reported as can be -1 */ | |
| records.record.value('(/Record/ConnectivityTraceRecord/TdsDisconnectFlags/RoutingCompleted)[1]', 'bit') AS RoutingCompleted, | |
| records.record.value('(/Record/ConnectivityTraceRecord/TdsDisconnectFlags/SessionIsKilled)[1]', 'bit') AS SessionIsKilled | |
| -- Stack/frame | |
| -- record_data | |
| FROM ( | |
| SELECT CAST(record AS XML) AS record_data | |
| FROM sys.dm_os_ring_buffers r | |
| WHERE ring_buffer_type = 'RING_BUFFER_CONNECTIVITY' | |
| ) a | |
| CROSS APPLY | |
| record_data.nodes('//Record') AS records (record) | |
| ) | |
| SELECT rb.Id, | |
| rb.Type, | |
| rb.Time, | |
| NULLIF(rb.ClientConnectionId, '00000000-0000-0000-0000-000000000000') AS ClientConnectionId, | |
| rb.IsClient, | |
| rb.LocalHost, | |
| rb.LocalPort, | |
| NULLIF(rb.OSError, 0) AS OSError, | |
| rb.RecordSource, | |
| rb.RecordTime, | |
| rb.RecordType, | |
| rb.RemoteHost, | |
| rb.RemotePort, | |
| s.SniConnectionId, | |
| s.SniConsumerError, | |
| rb.SniProvider, | |
| NULLIF(rb.Spid, 0) AS Spid, | |
| rb.State, | |
| rb.EnqueueTime, | |
| rb.NetReadsTime, | |
| rb.NetWritesTime, | |
| rb.TotalTime, | |
| rb.EnqueueTimeSsl, | |
| rb.NetReadsTimeSsl, | |
| rb.NetWritesTimeSsl, | |
| rb.SecureCallsTimeSsl, | |
| rb.TotalTimeSsl, | |
| rb.EnqueueTimeSspi, | |
| rb.NetReadsTimeSspi, | |
| rb.NetWritesTimeSspi, | |
| rb.SecureCallsTimeSspi, | |
| rb.TotalTimeSspi, | |
| rb.ExecClassifierGov, | |
| rb.FindLoginGov, | |
| rb.LogonTriggersGov, | |
| rb.SessionRecoverGov, | |
| rb.TotalTimeGov, | |
| s.TdsInputBufferBytes, | |
| s.TdsInputBufferError, | |
| s.TdsOutputBufferError, | |
| rb.DisconnectDueToReadError, | |
| rb.ErrorFoundBeforeLogin, | |
| rb.NetworkErrorFoundInInputStream, | |
| rb.NormalDisconnect, | |
| rb.NormalLogout, | |
| rb.PhysicalConnectionIsKilled, | |
| rb.RoutingCompleted, | |
| rb.SessionIsKilled | |
| -- s.CoalesceError | |
| FROM RingBuffer rb | |
| OUTER APPLY ( | |
| SELECT COALESCE(rb.SniConnectionId, rb.SniConnId) AS SniConnectionId, | |
| NULLIF(COALESCE(rb.SniConsumerError, rb.SniError), 0) AS SniConsumerError, | |
| COALESCE(rb.TdsInputBufferBytes, rb.TdsInputBufBytes) AS TdsInputBufferBytes, | |
| NULLIF(COALESCE(rb.TdsInputBufferError, rb.TdsInputBufError), 0) AS TdsInputBufferError, | |
| NULLIF(COALESCE(rb.TdsOutputBufferError, rb.TdsOutputBufError), 0) AS TdsOutputBufferError, | |
| CASE | |
| WHEN (rb.SniConnectionId IS NOT NULL AND rb.SniConnID IS NOT NULL) | |
| OR (rb.SniConsumerError IS NOT NULL AND rb.SniError IS NOT NULL) | |
| OR (rb.TdsInputBufferBytes IS NOT NULL AND rb.TdsInputBufBytes IS NOT NULL) | |
| OR (rb.TdsInputBufferError IS NOT NULL AND rb.TdsInputBufError IS NOT NULL) | |
| OR (rb.TdsOutputBufferError IS NOT NULL AND rb.TdsOutputBufError IS NOT NULL) | |
| THEN 1 | |
| END AS CoalesceError | |
| ) s | |
| ORDER BY | |
| rb.RecordTime, rb.Id | |
| ; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
One change that worked for me: PhysicalConnectionIsKilled does get -1 value so I changed the data type from bit to int