SQLコレクション データベース内の過剰なインタラクション量を持つコンタクトによって引き起こされる問題のトラブルシューティング


解説

過剰なインタラクション量を持つコンタクトがあると、xConnectインスタンスおよびSQLデータベースで大量のリソースが消費される可能性があります。これにより、リクエストの実行に時間がかかるため、HTTPサーバー エラーが発生する可能性があります。
エラーの例:

Sitecore.XConnect.Operations.GetEntityOperation`1[Sitecore.XConnect.Interaction]: Sitecore.Xdb.Collection.Failures.DataProviderException: Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.Data.SqlClient.SqlException: Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception: The wait operation timed out

この記事では、SQLコレクション データベース プロバイダーで過剰なインタラクション量を持つコンタクトを探して分析する方法について解説します。

データの検索

次のクエリを、ソリューションに存在するすべてのシャード データベースに対して実行してください。コンタクトのIDおよびインタラクション数が表示されるはずです。

SELECT TOP (100) ContactId, COUNT(ContactId) as Count
FROM [xdb_collection].[Interactions]
GROUP BY ContactId
ORDER BY Count DESC

数千のインタラクションがあるコンタクトが見つかった場合、システムに害を及ぼす可能性があるため、さらに調査する必要があります。以下のクエリで、前述の操作で発見したコンタクトの上位100件のインタラクションを取得できます。次に、「データの分析」節で説明されている通りに、インタラクションの内容を調査する必要があります。

SELECT TOP (100) *
FROM [xdb_collection].[Interactions]
WHERE ContactId = '6ffc58de-6c56-0000-0000-05d6639738da'

データの分析

検出されたデータを分析するには、次のステップを実行してください。

  1. UserAgent列をチェックして、そのユーザー エージェントがロボットではないことを確認します。ロボットのユーザー エージェントだと確定した場合、以下のリンク先に記載されている方法で除外することができます。
    ロボット検出機能を設定する
  2. いくつかのレコードのEvents列を確認し、コンタクトがどのページにアクセスしたかを確認します(例えば、PageViewEventなど)。よくある原因は以下の通りです:
    • インタラクションごとに一つのページにアクセスする。数千のインタラクションがあり、そのすべてでページが一つしかない場合、コンタクトがロボットである可能性があります。
    • トラッキングされてはならないAPIリクエストを持つインタラクション。よくある事例として、APIの呼び出しがサイトで多用されており、ページへのアクセス数を上回る場合があります。API ControllerアクションでTracker.Current.CurrentPage.Cancel()を呼び出すことでトラッキングからページを除外することができます。
  3. Contact IdentifiersおよびFacetsをチェックし、コンタクトが既知であるかどうかを確認します。以下のクエリを使用して、コンタクトが匿名であるかどうかを確認できます。コンタクトが既知である場合、IdentifierTypeは1になります:
    SELECT *, CONVERT(VARCHAR(MAX), Identifier) as IdentifierString
    FROM [xdb_collection].[ContactIdentifiers]
    WHERE ContactId = 'E24BAC10-CD1B-0000-0000-05D6D3DE8788'
    コンタクトが匿名である場合、コンタクトが誰であるかを調べてみることができます。これを行うには、IdentifierString値を分析するか、次のクエリによって返されるFacetData値を分析します:
    SELECT *
    FROM [xdb_collection].[ContactFacets]
    WHERE ContactId = 'E24BAC10-CD1B-0000-0000-05D6D3DE8788'
    ここでの非常によくある問題は、負荷テストに使用されるコンタクトです。テスト セッション後に削除するか、テスト セッションを下位環境で実行し、操作後にxDBコレクションを再デプロイする必要があります。
  4. コンタクトのIPアドレスを確認します。IPアドレスは、次のクエリを利用してFacetDataから取得することができます:
    SELECT TOP(100) *
    FROM [xdb_collection].[InteractionFacets]
    WHERE ContactId = 'E24BAC10-CD1B-0000-0000-05D6D3DE8788' AND FacetKey = 'IpInfo'
    これにより、IPが既知のものかどうかを分析できます。このIPによるインタラクションが不審または過度なものである場合、「ロボット検出機能を設定する」に記載されている方法に従ってIPを除外することができます。

過剰なインタラクション数を持つコンタクトは削除することをお勧めします。通常、これらはロボットでありレポートに価値を与えない上、システムに余分な負荷がかかるためです。

コンタクトの削除

過剰なインタラクション数を持つコンタクトを削除するには、次のいずれかのオプションを検討してください: