SDKのカスタマイズ

SDKのカスタマイズ

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

SDKのすべての設定は、PageSenseSDKOptionsオブジェクトを通じて行います。初期化時にこのオブジェクトを渡すことで、ログ、ポーリング頻度、ユーザーストレージの動作を制御できます。

カスタムオプションを使用した初期化  

  1. const sdkOptions = new PageSenseSDKOptions()
  2. .addLogLevel('DEBUG')
  3. .addCustomLogger(customLogger)
  4. .addCustomStorage(customStorage)
  5. .addPollingInterval(60); // 秒

  6. const pageSenseClient = await PageSenseClientBuilder.createNewPageSenseClient(
  7. accountId,
  8. sdkKey,
  9. projectName,
  10. sdkOptions
  11. );

デフォルト値(オプションを渡さない場合)  

設定

デフォルト

説明

ポーリング間隔

30秒

SDKが設定の更新を確認する頻度です。

ログレベル

INFO

INFO、WARN、ERROR、FATALのメッセージを記録します。

ロガー

組み込みコンソールロガー

アプリケーションのコンソールにログを出力します。

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

無効

バリエーションの割り当ては保存されません。


ポーリング間隔  

SDKがPageSenseの設定更新を確認する頻度です。デフォルトは10秒です。
メソッド  
  1. .addPollingInterval(intervalInSeconds)
パラメーター  
パラメーター
説明
intervalInSeconds
整数
秒単位のポーリング頻度です。

  
  1. const sdkOptions = new PageSenseSDKOptions()
  2. .addPollingInterval(60);
注意事項。
  • 10秒未満:サーバー負荷、ネットワークトラフィック、リソース使用量が増加します。
  • 5分超:テスト設定の変更がユーザーに反映されるまでに、明らかな遅延が生じます。
  • ほとんどの本番環境では、30~120秒が適しています。

ログレベル  

SDKログに記録する最低重要度を設定します。指定したレベル以上のメッセージのみが記録されます。
メソッド  
.addLogLevel(logLevel)

対応レベル  
TRACE· DEBUG· INFO· WARN· ERROR· FATAL

  
  1. const sdkOptions = new PageSenseSDKOptions()
  2. .addLogLevel('DEBUG');
DEBUGでは、DEBUG以上のすべてのログが記録されます。開発時や本番環境でのデバッグに適しています。

カスタムロガー  

SDKでは、初期設定でコンソールにログが出力されます。アプリで既存のログ記録フレームワークを使用している場合は、PageSenseLoggerを実装するカスタムロガーを使用して連携できます。
メソッド  
  1. .addCustomLogger(customLogger)
使用例  
  1. const sdkOptions = new PageSenseSDKOptions()
  2. .addCustomLogger(customLogger);
Winston、Bunyan、Pinoなど、あらゆるエンタープライズ向けログ記録システムに対応しています。

実装例(Winston)  
  1. const fs = require('fs');
  2. const FileSys = require('fs');
  3. const Path = require('path');
  4. const Winston = require('winston');
  5. const { PageSenseLogger } = require('@zohopagesense/pagesense-node-sdk');
  6. /**
  7. * FileSystemLogger — Winstonを使用してSDKのログをファイルに書き込みます。
  8. * @implements PageSenseLogger
  9. */
  10. class FileSystemLogger extends PageSenseLogger {
  11. constructor() {
  12. super();
  13. const logDir = Path.join(__dirname, '../../tests/logs');
  14. if (!FileSys.existsSync(logDir)) {
  15. FileSys.mkdirSync(logDir, { recursive: true });
  16. }
  17. this.logFilePath = Path.join(logDir, 'pagesense_custom_activity_log.log');
  18. if (!FileSys.existsSync(this.logFilePath)) {
  19. FileSys.writeFileSync(this.logFilePath, '');
  20. FileSys.chmodSync(this.logFilePath, 0o666);
  21. }
  22. this.logger = Winston.createLogger({
  23. level: 'debug',
  24. format: Winston.format.combine(
  25. Winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
  26. Winston.format.printf(
  27. ({ timestamp, level, message, className }) =>
  28. `[${timestamp}] [${className}] [${level.toUpperCase()}] ${message}`
  29. )
  30. ),
  31. transports: [
  32. new Winston.transports.File({
  33. filename: this.logFilePath,
  34. level: 'debug'
  35. })
  36. ]
  37. });
  38. }
  39. writeLog(levelName, message, className) {
  40. this.logger.log({ level: levelName.toLowerCase(), message, className });
  41. }
  42. trace(className, logMessage) { this.writeLog('silly', logMessage, className); }
  43. debug(className, logMessage) { this.writeLog('debug', logMessage, className); }
  44. info(className, logMessage) { this.writeLog('info', logMessage, className); }
  45. warning(className, logMessage) { this.writeLog('warn', logMessage, className); }
  46. error(className, logMessage) { this.writeLog('error', logMessage, className); }
  47. fatal(className, logMessage) { this.writeLog('error', logMessage, className); }
  48. // WinstonにはFATALレベルがないため、errorに割り当てています。
  49. }
  50. module.exports = FileSystemLogger;

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

ユーザーストレージサービス(USS)はバリエーションの割り当てを保存し、実験の設定が訪問間で変更された場合でも、ユーザーにセッションをまたいで同じバリエーションを表示します。
USSを使用しない場合、SDKはアクセスのたびにMurmurHashを使用して割り当てを最初から再計算します。バリエーションを追加したり、トラフィックの配分を調整したりしない限り問題ありませんが、変更すると実験の途中で一部のユーザーが別のバリエーションに切り替わる可能性があります。

メソッド  
  1. .addCustomStorage(userStorageService)

使用例  
  1. const sdkOptions = new PageSenseSDKOptions()
  2. .addCustomStorage(userStorageService);
実装は、UserStorageServiceインターフェースに準拠する必要があります。このインターフェースには、既存の割り当てを検索するメソッドと、新しい割り当てを保存するメソッドの2つがあります。保存先には、JSONファイル、リレーショナルデータベース、Redis、クラウドストレージを使用できます。

実装例(ファイルベース)  
  1. const fs = require('fs');
  2. const path = require('path');
  3. const Winston = require('winston');
  4. const { UserStorageService } = require('@zohopagesense/pagesense-node-sdk');
  5. /**
  6. * FileUserStorageService — 実験とパターンの対応関係をJSONファイルに保存します。
  7. * @implements UserStorageService
  8. */
  9. class FileUserStorageService extends UserStorageService {
  10. constructor(storageDirectory) {
  11. super();
  12. this.storageDir = storageDirectory;
  13. this.userFile = path.join(storageDirectory, 'user_storage.json');
  14. this.logFile = path.join(storageDirectory, 'user_storage.log');
  15. this.initializeStorage();
  16. this.initializeLogger();
  17. }
  18. initializeStorage() {
  19. if (!fs.existsSync(this.storageDir)) {
  20. fs.mkdirSync(this.storageDir, { recursive: true });
  21. }
  22. if (!fs.existsSync(this.userFile)) {
  23. fs.writeFileSync(this.userFile, JSON.stringify({}, null, 2));
  24. }
  25. }
  26. initializeLogger() {
  27. this.logger = Winston.createLogger({
  28. level: 'info',
  29. format: Winston.format.combine(Winston.format.timestamp(), Winston.format.json()),
  30. transports: [new Winston.transports.File({ filename: this.logFile })]
  31. });
  32. }
  33. lookUp(userId) {
  34. if (!fs.existsSync(this.userFile)) return null;
  35. const data = this.safeJsonDecode(fs.readFileSync(this.userFile, 'utf8'));
  36. return data && data[userId] ? JSON.stringify(data[userId]) : null;
  37. }
  38. async save(userProfile) {
  39. const userId = userProfile.getUserId();
  40. const profileData = this.safeJsonDecode(userProfile.getUserProfileJSONString());
  41. if (!profileData) return;
  42. const fileContent = await fs.promises.readFile(this.userFile, 'utf8').catch(() => '{}');
  43. const existingData = this.safeJsonDecode(fileContent) || {};
  44. existingData[userId] = profileData;
  45. await fs.promises.writeFile(this.userFile, JSON.stringify(existingData, null, 2));
  46. }
  47. safeJsonDecode(jsonString) {
  48. try { return jsonString ? JSON.parse(jsonString) : null; }
  49. catch { return null; }
  50. }
  51. }
  52. module.exports = FileUserStorageService;
ストレージファイルの例  
  1. {
  2. 'User123': {
  3. 'userId': 'User123',
  4. 'experiments': [
  5. {
  6. 'experiment_key': 'expkey0001',
  7. 'variation_key': 'varkey001'
  8. }
  9. ]
  10. }
  11. }








本ドキュメントは、各手順を順を追ってご案内できるように作成されています。さらにサポートが必要な場合やご不明な点がある場合は、support@zohopagesense.com - までお気軽にお問い合わせください。いつでもこちらでサポートいたします。