扩展事件-构建与特定应用程序名称连接的服务器的直方图



我试图建立一个XE,以找出我们的内部应用程序(没有应用程序名称,因此显示为。net SQLClient数据提供程序)击中特定的服务器。理想情况下,我想获得客户端和数据库的名称,但不确定是否可以在一个XE中完成。

我想为了方便使用,我会使用直方图/asynchronous_bucketizer,并保存试图命中的内容和频率的计数。然而,我似乎无法在2012年使用它,更不用说2008年了。如果我使用sqlserver。Existing_connection它可以工作,但只在连接时才给我计数。我想在白天获得计数,看看它在每个服务器上发生的频率,所以我尝试了preconnect_completed。这是正确的事件吗?

而且,我使用XE的部分原因是,这些服务器每分钟可以收到数千个调用。

这是我到目前为止想到的,它工作,但只给我当前的SSMS连接匹配-显然,我将把它改为。net SQLClient数据提供程序。

CREATE EVENT SESSION UnknownAppHosts 
ON SERVER 
ADD EVENT sqlserver.existing_connection(
    ACTION(sqlserver.client_hostname)
    WHERE ([sqlserver].[client_app_name] LIKE 'Microsoft SQL Server Management%')
    ) 
ADD TARGET package0.histogram
( SET slots = 50,
      filtering_event_name='sqlserver.existing_connection', 
      source_type=1, 
      source='sqlserver.client_hostname' 
)
WITH(MAX_DISPATCH_LATENCY =1SECONDS); 
GO

啊哈!它是login,而不是preconnect_starting或preconnect_completed。

CREATE EVENT SESSION UnknownAppHosts 
ON SERVER 
ADD EVENT sqlserver.login(
    ACTION(sqlserver.client_hostname)
    WHERE ([sqlserver].[client_app_name] LIKE 'Microsoft SQL Server Management%')
    ) 
ADD TARGET package0.histogram
( SET slots = 50, 
      filtering_event_name='sqlserver.login', 
      source_type=1, 
      source='sqlserver.client_hostname' 
)
WITH(MAX_DISPATCH_LATENCY =1SECONDS); 
GO

然后为了查询它,我编写了一些很棒的代码:

-- Parse the session data to determine the databases being used.
SELECT  slot.value('./@count', 'int') AS [Count] ,
        slot.query('./value').value('.', 'varchar(20)')
FROM
(
    SELECT CAST(target_data AS XML) AS target_data
    FROM sys.dm_xe_session_targets AS t
    INNER JOIN sys.dm_xe_sessions AS s 
        ON t.event_session_address = s.address
    WHERE   s.name = 'UnknownAppHosts'
      AND t.target_name = 'Histogram') AS tgt(target_data)
CROSS APPLY target_data.nodes('/HistogramTarget/Slot') AS bucket(slot)
ORDER BY slot.value('./@count', 'int') DESC

相关内容

最新更新