1

どの内部アプリ (アプリ名がないため、.Net SQLClient データ プロバイダーとして表示される) が特定のサーバーにヒットしているかを調べるために、XE を構築しようとしています。理想的には、 Client と Database の名前を取得したいのですが、1 つの XE でそれを実行できるかどうかはわかりません。

使いやすさを考慮して、ヒストグラム/非同期バケタイザーを使用し、ヒットしようとしているものとその頻度のカウントを保存します。ただし、2008年よりもはるかに少ない2012年には機能しないようです。sqlserver.existing_connectionを使用すると機能しますが、接続時にのみカウントされます。日中にカウントを取得し、各サーバーから発生する頻度を確認したいので、preconnect_completed を試しました。これは正しいイベントですか?

また、私が XE を使用している理由の 1 つは、それらのサーバーが 1 分間に数千の呼び出しを受信できることです。

これは私がこれまでに思いついたことです。これは機能しますが、一致する現在の SSMS 接続しか提供しません。明らかに、それを .Net SQLClient Data Provider に変更します。

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
4

1 に答える 1

1

あはは!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
于 2013-04-03T20:27:51.220 に答える