functions/Watch-DbaXESession.ps1
function Watch-DbaXESession { <# .SYNOPSIS Watch live XEvent Data as it happens .DESCRIPTION Watch live XEvent Data as it happens - this command runs until you kill the PowerShell session or Ctrl-C. Thanks to Dave Mason (@BeginTry) for some straightforward code samples https://itsalljustelectrons.blogspot.be/2017/01/SQL-Server-Extended-Event-Handling-Via-Powershell.html .PARAMETER SqlInstance The SQL Instances that you're connecting to. .PARAMETER SqlCredential Credential object used to connect to the SQL Server as a different user .PARAMETER Session Only return a specific session. This parameter is auto-populated. .PARAMETER Raw Returns the Microsoft.SqlServer.XEvent.Linq.QueryableXEventData enumeration object .PARAMETER SessionObject Internal parameter .PARAMETER Silent If this switch is enabled, the internal messaging functions will be silenced. .NOTES Tags: Xevent Website: https://dbatools.io Copyright: (C) Chrissy LeMaire, clemaire@gmail.com License: GNU GPL v3 https://opensource.org/licenses/GPL-3.0 .LINK https://dbatools.io/Watch-DbaXESession .EXAMPLE Watch-DbaXESession -SqlInstance ServerA\sql987 -Session system_health Shows events for the system_health session as it happens .EXAMPLE Get-DbaXESession -SqlInstance sql2016 -Session system_health | Watch-DbaXESession | Select -ExpandProperty Fields Also shows events for the system_health session as it happens and expands the Fields property. Looks a bit like this Name Type Value ---- ---- ----- id System.UInt32 0 timestamp System.UInt64 0 process_utilization System.UInt32 0 system_idle System.UInt32 99 user_mode_time System.UInt64 8906250 kernel_mode_time System.UInt64 468750 page_faults System.UInt32 60 working_set_delta System.Int64 0 memory_utilization System.UInt32 99 #> [CmdletBinding(DefaultParameterSetName="Default")] param ( [parameter(ValueFromPipeline, ParameterSetName = "instance", Mandatory)] [Alias("ServerInstance", "SqlServer")] [DbaInstanceParameter]$SqlInstance, [PSCredential]$SqlCredential, [string]$Session, [parameter(ValueFromPipeline, ParameterSetName = "piped", Mandatory)] [Microsoft.SqlServer.Management.XEvent.Session]$SessionObject, [switch]$Raw, [switch]$Silent ) process { if (-not $SqlInstance) { $server = $SessionObject.Parent } else { try { Write-Message -Level Verbose -Message "Connecting to $SqlInstance" $server = Connect-SqlInstance -SqlInstance $SqlInstance -SqlCredential $SqlCredential -MinimumVersion 11 } catch { Stop-Function -Message "Failure" -Category ConnectionError -ErrorRecord $_ -Target $SqlInstance -Continue } $SqlConn = $server.ConnectionContext.SqlConnectionObject $SqlStoreConnection = New-Object Microsoft.SqlServer.Management.Sdk.Sfc.SqlStoreConnection $SqlConn $XEStore = New-Object Microsoft.SqlServer.Management.XEvent.XEStore $SqlStoreConnection Write-Message -Level Verbose -Message "Getting XEvents Sessions on $SqlInstance." $SessionObject = $XEStore.sessions | Where-Object Name -eq $Session | Select-Object -First 1 } if ($SessionObject) { try { $xevent = New-Object -TypeName Microsoft.SqlServer.XEvent.Linq.QueryableXEventData( ($server.ConnectionContext.ConnectionString), ($SessionObject.Name), [Microsoft.SqlServer.XEvent.Linq.EventStreamSourceOptions]::EventStream, [Microsoft.SqlServer.XEvent.Linq.EventStreamCacheOptions]::DoNotCache ) if ($raw) { foreach ($row in $xevent) { $row } } else { # make it pretty foreach ($row in $xevent) { Select-DefaultView -InputObject $row -Property Name, Timestamp, Fields, Actions } } } catch { Stop-Function -Message "Failure" -ErrorRecord $_ -Target $session } finally { if ($xevent -is [IDisposable]) { $xevent.Dispose() } } } else { Stop-Function -Message "Session not found" -Target $session } } } |