2013-04-03 25 views
0

我正在嘗試構建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

啊哈!這是登錄,而不是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 
相關問題