ポーリング間隔
SDKがPageSenseの設定更新を確認する頻度です。デフォルトは10秒です。
メソッド
- .addPollingInterval(intervalInSeconds)
パラメーター
|
パラメーター
|
型
|
説明
|
|
intervalInSeconds
|
整数
|
秒単位のポーリング頻度です。
|
例
- const sdkOptions = new PageSenseSDKOptions()
- .addPollingInterval(60);
注意事項。
-
10秒未満:サーバー負荷、ネットワークトラフィック、リソース使用量が増加します。
-
5分超:テスト設定の変更がユーザーに反映されるまでに、明らかな遅延が生じます。
-
ほとんどの本番環境では、30~120秒が適しています。
ログレベル
SDKログに記録する最低重要度を設定します。指定したレベル以上のメッセージのみが記録されます。
メソッド
.addLogLevel(logLevel)
対応レベル
TRACE· DEBUG· INFO· WARN· ERROR· FATAL
例
- const sdkOptions = new PageSenseSDKOptions()
- .addLogLevel('DEBUG');
DEBUGでは、DEBUG以上のすべてのログが記録されます。開発時や本番環境でのデバッグに適しています。
カスタムロガー
SDKでは、初期設定でコンソールにログが出力されます。アプリで既存のログ記録フレームワークを使用している場合は、PageSenseLoggerを実装するカスタムロガーを使用して連携できます。
メソッド
- .addCustomLogger(customLogger)
使用例
- const sdkOptions = new PageSenseSDKOptions()
- .addCustomLogger(customLogger);
Winston、Bunyan、Pinoなど、あらゆるエンタープライズ向けログ記録システムに対応しています。
実装例(Winston)
- const fs = require('fs');
- const FileSys = require('fs');
- const Path = require('path');
- const Winston = require('winston');
- const { PageSenseLogger } = require('@zohopagesense/pagesense-node-sdk');
- /**
- * FileSystemLogger — Winstonを使用してSDKのログをファイルに書き込みます。
- * @implements PageSenseLogger
- */
- class FileSystemLogger extends PageSenseLogger {
- constructor() {
- super();
- const logDir = Path.join(__dirname, '../../tests/logs');
- if (!FileSys.existsSync(logDir)) {
- FileSys.mkdirSync(logDir, { recursive: true });
- }
- this.logFilePath = Path.join(logDir, 'pagesense_custom_activity_log.log');
- if (!FileSys.existsSync(this.logFilePath)) {
- FileSys.writeFileSync(this.logFilePath, '');
- FileSys.chmodSync(this.logFilePath, 0o666);
- }
- this.logger = Winston.createLogger({
- level: 'debug',
- format: Winston.format.combine(
- Winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
- Winston.format.printf(
- ({ timestamp, level, message, className }) =>
- `[${timestamp}] [${className}] [${level.toUpperCase()}] ${message}`
- )
- ),
- transports: [
- new Winston.transports.File({
- filename: this.logFilePath,
- level: 'debug'
- })
- ]
- });
- }
- writeLog(levelName, message, className) {
- this.logger.log({ level: levelName.toLowerCase(), message, className });
- }
- trace(className, logMessage) { this.writeLog('silly', logMessage, className); }
- debug(className, logMessage) { this.writeLog('debug', logMessage, className); }
- info(className, logMessage) { this.writeLog('info', logMessage, className); }
- warning(className, logMessage) { this.writeLog('warn', logMessage, className); }
- error(className, logMessage) { this.writeLog('error', logMessage, className); }
- fatal(className, logMessage) { this.writeLog('error', logMessage, className); }
- // WinstonにはFATALレベルがないため、errorに割り当てています。
- }
- module.exports = FileSystemLogger;
ユーザーストレージサービス
ユーザーストレージサービス(USS)はバリエーションの割り当てを保存し、実験の設定が訪問間で変更された場合でも、ユーザーにセッションをまたいで同じバリエーションを表示します。
USSを使用しない場合、SDKはアクセスのたびにMurmurHashを使用して割り当てを最初から再計算します。バリエーションを追加したり、トラフィックの配分を調整したりしない限り問題ありませんが、変更すると実験の途中で一部のユーザーが別のバリエーションに切り替わる可能性があります。
メソッド
- .addCustomStorage(userStorageService)
使用例
- const sdkOptions = new PageSenseSDKOptions()
- .addCustomStorage(userStorageService);
実装は、UserStorageServiceインターフェースに準拠する必要があります。このインターフェースには、既存の割り当てを検索するメソッドと、新しい割り当てを保存するメソッドの2つがあります。保存先には、JSONファイル、リレーショナルデータベース、Redis、クラウドストレージを使用できます。
実装例(ファイルベース)
- const fs = require('fs');
- const path = require('path');
- const Winston = require('winston');
- const { UserStorageService } = require('@zohopagesense/pagesense-node-sdk');
- /**
- * FileUserStorageService — 実験とパターンの対応関係をJSONファイルに保存します。
- * @implements UserStorageService
- */
- class FileUserStorageService extends UserStorageService {
- constructor(storageDirectory) {
- super();
- this.storageDir = storageDirectory;
- this.userFile = path.join(storageDirectory, 'user_storage.json');
- this.logFile = path.join(storageDirectory, 'user_storage.log');
- this.initializeStorage();
- this.initializeLogger();
- }
- initializeStorage() {
- if (!fs.existsSync(this.storageDir)) {
- fs.mkdirSync(this.storageDir, { recursive: true });
- }
- if (!fs.existsSync(this.userFile)) {
- fs.writeFileSync(this.userFile, JSON.stringify({}, null, 2));
- }
- }
- initializeLogger() {
- this.logger = Winston.createLogger({
- level: 'info',
- format: Winston.format.combine(Winston.format.timestamp(), Winston.format.json()),
- transports: [new Winston.transports.File({ filename: this.logFile })]
- });
- }
- lookUp(userId) {
- if (!fs.existsSync(this.userFile)) return null;
- const data = this.safeJsonDecode(fs.readFileSync(this.userFile, 'utf8'));
- return data && data[userId] ? JSON.stringify(data[userId]) : null;
- }
- async save(userProfile) {
- const userId = userProfile.getUserId();
- const profileData = this.safeJsonDecode(userProfile.getUserProfileJSONString());
- if (!profileData) return;
- const fileContent = await fs.promises.readFile(this.userFile, 'utf8').catch(() => '{}');
- const existingData = this.safeJsonDecode(fileContent) || {};
- existingData[userId] = profileData;
- await fs.promises.writeFile(this.userFile, JSON.stringify(existingData, null, 2));
- }
- safeJsonDecode(jsonString) {
- try { return jsonString ? JSON.parse(jsonString) : null; }
- catch { return null; }
- }
- }
- module.exports = FileUserStorageService;
ストレージファイルの例
- {
- 'User123': {
- 'userId': 'User123',
- 'experiments': [
- {
- 'experiment_key': 'expkey0001',
- 'variation_key': 'varkey001'
- }
- ]
- }
- }