Based on DataDog and required Megatron clientHash as session ID.
Documentation: https://docs.datadoghq.com/logs/error_tracking/browser_and_mobile?tab=browser
Install package:
npm install @global-savings-group/extension-logs
Import log service and init in project:
// Logger.ts
import { ExtensionLogsService } from '@global-savings-group/extension-logs';
// IMPORTANT:
// If using more than one instance of ExtensionLogsService,
// each instance must have a unique store key.
// In the example below, the default store key is "DataDogLogger".
export const logsService = new ExtensionLogsService();
/**
* init() can be called asynchronously and any log calls (debug, error, info, warn) will be queued until then
* init() can be called multiple times to change options or enable/disable logging
* if init() is not called within 60s, it logs error to console as reminder to avoid memory leaks
*/
logsService.init({
// required for enabling logging to DataDog API
// if omitted or set to undefined - logging is disabled
clientToken: '{DataDog client token}',
// optional; values: 'local' | 'production' | 'staging'
env: 'production',
// required
service: '{brand}:extension',
// optional session ID
sessionId: '{Megatron clientHash}',
// optional - send logs for X% of sessions
// value [0..1] - 0%..100%; default value - 1 (send logs for all sessions)
sessionSampleRate: 0.2, // log 20% of all sessions
// optional - limit logs per 24h that are sent to DataDog
// default value - undefined (send all logs)
threshold: 2000,
// optional version
version: chrome.runtime.getManifest().version,
});
logsService.logConsoleErrors();
logsService.logUnhandledErrors();
/**
* ExtensionLogsService logs
*
* Every log method accepts these params:
* - message: string
* - data?: object - additional data
* - forceLog?: boolean - set to true to always log, overriding the sessionSampleRate set in init() or threshold value
*/
logsService.debug({
message: 'Debug message',
data: { 'x': 'y' }, // addtional log data
forceLog: true, // force logging; ignores sessionSampleRate or threshold
});
logsService.error({
message: 'Error message',
origin: 'custom',
stack: '{call stack as string}'
});
logsService.info({
message: 'Info message',
});
logsService.warn({
message: 'Warn message',
});
Enable session logging:
// background.ts
const sessionTrackAlarmName = 'session:track';
chrome.alarms.onAlarm.addListener(async (alarm) => {
if (alarm.name === sessionTrackAlarmName) {
logsService.ping();
}
});
chrome.alarms.create(sessionTrackAlarmName, { periodInMinutes: 10 });
Optionally, ping()
supports callback to add custom session data:
const getSessionData = () => ({
my_custom_session_data: 'some data',
another_key: 'more data',
});
logsService.ping(getSessionData);