我正在尝试构建一个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
答案 0 :(得分:0)
啊哈!它是登录,而不是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