SDKのカスタマイズ

SDKのカスタマイズ

お知らせ:当社は、お客様により充実したサポート情報を迅速に提供するため、本ページのコンテンツは機械翻訳を用いて日本語に翻訳しています。正確かつ最新のサポート情報をご覧いただくには、本内容の英語版を参照してください。

概要

SDKのカスタマイズとは、アプリケーションや開発環境固有の要件に合わせてソフトウェア開発キット(SDK)を調整することです。SDKには通常、開発者によるアプリケーションの構築を支援するためのツール、ライブラリー、ドキュメント、コードサンプルが含まれます。

PageSense SDKを初期設定で初期化すると、次の設定でPageSenseClientインスタンスが作成されます。
  1. ポーリング間隔:10秒(10,000ミリ秒)に設定されます。SDKは10秒ごとにPageSenseサーバーを確認し、プロジェクト設定の更新を取得します。
  2. ログレベル:INFOに設定されます。SEVERE、ERROR、WARNING、INFOの各レベルのログメッセージがすべて記録されます。
  3. ロガー:SDKは、すべてのログをアプリケーションのコンソールに出力する組み込みロガーを使用します。ログの記録を開始するための追加設定は必要ありません。
これらの初期設定は、迅速な連携に適しており、一般的な利用用途の大半に対応しています。

カスタマイズ可能な設定

柔軟性とカスタマイズ性を高めるため、PageSense SDKには複数のオプション設定用関数が用意されています。これらの関数を使用すると、SDKの動作をさまざまな面から制御できます。SDKの初期化時にこれらのオプションを指定することで、アプリケーション固有の要件や環境に合わせてSDKの動作を調整できます。

関数

説明

ポーリング間隔

SDKがPageSenseサーバーにプロジェクト設定の更新を問い合わせる頻度を指定します。これにより、SDKインスタンスとPageSenseアプリケーションで設定された最新のプロジェクト設定が同期されます。

ロガー

カスタムロガーを連携し、SDKログの記録先、記録方法、保存方法を制御できます。SDKログをエンタープライズ全体のログ記録フレームワークと統合する場合に特に便利です。

ユーザーストレージサービス

個別指定のユーザーストレージ機能を使用して、複数のA/Bテスト間でバリエーションの割り当てを保持できます。

ログレベル

記録するログメッセージの最低レベルを設定します。対応しているレベルは次のとおりです。 TRACEDEBUGINFOWARNERRORSEVERE

ポーリング間隔

addPollingInterval関数を使用すると、PageSense SDKのポーリングサービスのポーリング間隔を設定できます。
ポーリング間隔の初期値は10秒です。次のようにaddPollingInterval関数を呼び出すことで、ポーリング間隔を変更できます。

サンプルコード

  1. PageSenseClient pageSenseClient = PageSenseClientBuilder.GetBuilder(projectSettings).AddPollingInterval(60000).BuildClient();

パラメーターの詳細

パラメーター
種類
説明
addPollingInterval
整数
SDKのポーリングサービスのポーリング間隔を設定します

APIでは、ポーリング間隔をミリ秒単位で指定します。上記の例では、ポーリング間隔が60,000ミリ秒60秒)に設定されています。
1. アプリケーションの更新頻度、想定されるトラフィック量、サーバーの処理能力に基づいて、ポーリング間隔を選択します。
2. 間隔が短い場合(10秒未満)、次の問題が発生する可能性があります。
a. サーバーの負荷が増加する。
b. ネットワークトラフィックが増加する。
c. 更新頻度が高い場合、競合状態が発生する可能性がある。
3. 間隔が長い場合(5分超)、次の問題が発生する可能性があります。
a. PageSenseから最新のプロジェクト設定の変更が反映されるまでに遅延が生じる。
b. 古いプロジェクト設定に基づくA/Bテストがユーザーに配信される。

ログレベル

addlogLevel関数を使用すると、PageSense SDKの組み込みロガーのログレベルを設定できます。この設定により、PageSenseClientが出力するログの詳細度を制御し、ファイルシステムの容量に応じてログの保存領域を効率的に管理できます。
ログレベルを指定すると、記録するログメッセージの最低重要度が設定されます。ログレベルは文字列として指定し、TRACE、DEBUG、INFO、WARNING、ERROR、SEVEREのいずれかの値を設定できます。大文字と小文字は区別されません。

サンプルコード

  1. PageSenseClient pageSenseClient = PageSenseClientBuilder.GetBuilder(projectSettings).AddLogLevel(“DEBUG”).BuildClient();

パラメーターの詳細

パラメーター
種類
説明
logLevel
文字列
記録するログの最低重要度を指定します

上記の例では、ログレベルがDEBUGに設定されています。そのため、重要度がDEBUG、INFO、WARNING、ERROR、SEVEREのすべてのログメッセージが記録され、顧客のコンソールに出力されます。

カスタムロガー

PageSense SDKでは、SDKの組み込みロガーに加えて、独自のカスタムロガーを連携してアプリケーションイベントを記録できます。既存のログ記録フレームワークを使用する場合や、ログの処理方法をより細かく制御する必要がある場合に便利です。

addCustomLogger関数を使用すると、PageSense SDKですべてのイベントを記録するためのユーザー定義ロガーを登録できます。カスタムロガーを指定すると、PageSense SDKは組み込みロガーではなく、指定された実装を通じてすべてのログメッセージを処理します。

サンプルコード

  1. PageSenseClient pageSenseClient = PageSenseClientBuilder.getBuilder(projectSettings).addCustomLogger(customLogger).buildClient();

パラメーターの詳細

パラメーター
種類
説明
customLogger
PageSenseLoggerのインスタンス
記録するログの最低重要度を指定します

上記の例では、customLoggerはPageSenseLoggerインターフェースを実装するクラスのインスタンスです。addCustomLoggerに渡す前に、必要なログ記録処理を実行できるよう、このインターフェースをカスタムロガーに実装する必要があります。

サンプルコード

  1. using System;
  2. using log4net;
  3.  
  4. /// <summary>
  5. /// PageSenseLoggerシステムと連携する、log4netベースのロガー実装です。
  6. /// log4netで有効になっている最上位のログレベルを自動的に検出し、PageSenseLoggerを設定します。
  7. /// </summary>
  8. public class Log4NetLogger : PageSenseLogger
  9. {
  10.     /// <summary>
  11. /// 実際のログ出力呼び出しを委譲するためのlog4netロガーインスタンスです。
  12. /// 基盤となるlog4net設定で有効になっているレベルに基づいて、メッセージを記録します。
  13. /// </summary>
  14. private readonly ILog logger;
  15.  
  16.     /// <summary>
  17. /// 指定したクラス名に対応するLog4NetLoggerを構築します。
  18. /// </summary>
  19. /// <param name='className'>ログ出力の対象となるクラスです。</param>
  20. public Log4NetLogger(string className)
  21. : base(className, DetermineMaxLogLevel(LogManager.GetLogger(className)))
  22. {
  23. this.logger = LogManager.GetLogger(className);
  24. }
  25.  
  26.     /// <summary>
  27. /// 現在有効になっている最上位のlog4netログレベルを判定し、
  28. /// PageSenseLoggerで想定される形式に一致する文字列として返します。
  29. /// </summary>
  30. /// <param name='logger'>log4netロガーインスタンスです。</param>
  31. /// <returns>有効になっている最上位のログレベル名です。</returns>
  32. private static string DetermineMaxLogLevel(ILog logger)
  33. {
  34. if (logger.IsDebugEnabled) return 'DEBUG';
  35. if (logger.IsInfoEnabled) return 'INFO';
  36. if (logger.IsWarnEnabled) return 'WARNING';
  37. if (logger.IsErrorEnabled) return 'ERROR';
  38. if (logger.IsFatalEnabled) return 'SEVERE'; // SEVEREをFATALにマッピング
  39.  
  40. // 有効なレベルがない場合のフォールバック
  41. return 'INFO'; // 既定のフォールバックレベル
  42. }
  43.  
  44.  
  45.     /// <summary>
  46. /// TRACEレベルのメッセージを記録します。
  47. /// 通常、詳細なデバッグ情報に使用します。
  48. ///
  49. /// メモ:TRACEメッセージは、log4netではALLレベルで記録されます(内部ではDebugにマッピングされます)。
  50. /// </summary>
  51. /// <param name='logMessage'>記録するメッセージです。</param>
  52. public override void Trace(string logMessage)
  53. {
  54. // log4netにはIsTraceEnabledがないため、最も近いIsDebugEnabledを使用
  55. if (logger.IsDebugEnabled)
  56. {
  57. logger.Debug(logMessage); // TRACEを内部でDEBUGとして記録
  58. }
  59. }
  60.  
  61.  
  62.     /// <summary>
  63. /// DEBUGレベルのメッセージを記録します。
  64. /// アプリケーションの処理フローの診断に役立つ一般的なデバッグ情報に使用します。
  65. /// </summary>
  66. /// <param name='logMessage'>記録するメッセージです。</param>
  67. public override void Debug(string logMessage)
  68. {
  69. if (logger.IsDebugEnabled)
  70. {
  71. logger.Debug(logMessage);
  72. }
  73. }
  74.  
  75.     /// <summary>
  76. /// INFOレベルのメッセージをログに記録します。
  77. /// 通常、一般的な実行時イベントに使用します。
  78. /// </summary>
  79. /// <param name='logMessage'>ログに記録するメッセージ。</param>
  80. public override void Info(string logMessage)
  81. {
  82. if (logger.IsInfoEnabled)
  83. {
  84. logger.Info(logMessage);
  85. }
  86. }
  87.  
  88.     /// <summary>
  89. /// WARNINGレベルのメッセージをログに記録します。
  90. /// エラーではないものの、潜在的な問題や予期しない状況が発生したことを示します。
  91. /// </summary>
  92. /// <param name='logMessage'>ログに記録するメッセージ。</param>
  93. public override void Warn(string logMessage)
  94. {
  95. if (logger.IsWarnEnabled)
  96. {
  97. logger.Warn(logMessage);
  98. }
  99. }
  100.  
  101.     /// <summary>
  102. /// ERRORレベルのメッセージをログに記録します。
  103. /// アプリケーションの実行を続けられる可能性があるエラーイベントに使用します。
  104. /// </summary>
  105. /// <param name='logMessage'>ログに記録するメッセージ。</param>
  106. public override void Error(string logMessage)
  107. {
  108. if (logger.IsErrorEnabled)
  109. {
  110. logger.Error(logMessage);
  111. }
  112. }
  113.  
  114.     /// <summary>
  115. /// SEVEREレベルのメッセージをログに記録します。
  116. /// 重大なエラーとして扱われます。明確に識別できるよう、[SEVERE]プレフィックスを付けてlog4netのFATALレベルに割り当てられます。
  117. /// </summary>
  118. /// <param name='logMessage'>ログに記録するメッセージ。</param>
  119. public override void Severe(string logMessage)
  120. {
  121. if (logger.IsFatalEnabled)
  122. {
  123. logger.Fatal('[SEVERE] ' + logMessage);
  124. }
  125. }
  126. }

SDKのログレベルをすでに設定しており、さらにcustomLoggerを使用してSDKを初期化した場合、カスタムロガーのログレベルがPageSense SDKのログレベルより優先されます

ユーザーストレージサービス

ユーザーストレージサービス(USS)は、プロジェクト内の複数のA/Bテストで、ユーザーに割り当てたバリエーションを永続的に保存できる外部ストレージ機能です。この機能は、プロジェクトの設定が変更された場合でも、ユーザーに同じバリエーションを継続して表示し、バリエーションの割り当てを一貫させる場合に特に役立ちます。

このような設定変更には、次のものがあります。
  1. 新しいバリエーションの追加
  2. テストのトラフィックの割り当ての調整
  3. バリエーション間のトラフィック配分の調整

ユーザーストレージサービスを使用すると、ユーザーエクスペリエンスを維持しながら、A/Bテストの結果の整合性を長期にわたって保つことができます。USSの使用は任意です。有効にするには、UserStorageServiceインターフェースを実装し、addUserStorageService関数を使用して、実装したインスタンスをPageSense SDKに渡します。

サンプルコード

  1. PageSenseClient pageSenseClient = PageSenseClientBuilder.GetBuilder(projectSettings).AddUserStorageService(userStorageService).BuildClient();
上記の例で、userStorageServiceは、UserStorageServiceインターフェースを実装するクラスのユーザー定義インスタンスです。

パラメーターの詳細

パラメーター
種類
説明
userStorageService
UserStorageServiceを実装するクラスのインスタンス
フルスタックA/Bテストで、ユーザーに割り当てたバリエーションを永続的に管理するためのカスタム実装

サンプルコード

  1. using System;
  2. using System.Collections.Concurrent;
  3.  
  4. /// <summary>
  5. /// インメモリーの並行ストレージを使用したUserStorageServiceインターフェースの実装。
  6. /// </summary>
  7. public class IntegratedUserStorageService : UserStorageService
  8. {
  9.     /// <summary>
  10. /// スレッドセーフな辞書を使用したユーザープロフィール用ストレージ。
  11. /// </summary>
  12. private readonly ConcurrentDictionary<string, string> userProfileStorage = new ConcurrentDictionary<string, string>();
  13.  
  14.     /// <summary>
  15. /// 指定されたユーザーIDに対応するユーザープロフィールのJSON文字列を検索します。
  16. /// </summary>
  17. /// <param name='userId'>ユーザーのID。</param>
  18. /// <returns>ユーザープロフィールのJSON文字列。見つからない場合はnull。</returns>
  19. /// <exception cref='ArgumentException'>userIdがnullまたは空の場合にスローされます。</exception>
  20. public override string LookUp(string userId)
  21. {
  22. // ユーザーIDを検証
  23. if (string.IsNullOrWhiteSpace(userId))
  24. {
  25. throw new ArgumentException('ユーザーIDをnullまたは空にすることはできません');
  26. }
  27.  
  28. string value;
  29. return userProfileStorage.TryGetValue(userId, out value) ? value : null;
  30. }
  31.  
  32.     /// <summary>
  33. /// ユーザープロフィールをインメモリーストレージに保存します。
  34. /// </summary>
  35. /// <param name='userProfile'>ユーザープロフィールオブジェクト。</param>
  36. /// <exception cref='ArgumentException'>userProfileまたはユーザーIDがnullまたは空の場合にスローされます。</exception>
  37. /// <exception cref='Exception'>保存中にエラーが発生した場合にスローされます。</exception>
  38. public override void Save(IUserProfile userProfile)
  39. {
  40. if (userProfile == null || string.IsNullOrWhiteSpace(userProfile.GetUserId()))
  41. {
  42. throw new ArgumentException('ユーザープロフィールまたはユーザーIDをnullまたは空にすることはできません');
  43. }
  44.  
  45. try
  46. {
  47. // ユーザープロフィールのJSON文字列を取得
  48. string userProfileJSON = userProfile.GetUserProfileJSONString();
  49.  
  50. // ユーザープロフィールのJSON文字列を保存
  51. userProfileStorage[userProfile.GetUserId()] = userProfileJSON;
  52. }
  53. catch (Exception ex)
  54. {
  55. throw new Exception('ユーザープロフィールの保存に失敗しました:' + ex.Message, ex);
  56. }
  57. }
  58. }


このドキュメントが、手順を簡単に進めるためのお役に立てば幸いです。詳しい説明が必要な場合やご質問がある場合は、support@zohopagesense.comまでいつでもメールでお気軽にお問い合わせください。