This is the home-brewed version of Node SDK for Sensors Analytics.
Install using npm.
$ npm install sa-sdk-node --save
import SensorsAnalytics from 'sa-sdk-node'
const sa = new SensorsAnalytics()
sa.submitTo('http://xxx.cloud.sensorsdata.cn:8006/sa?token=xxx')
// Super Properties that assigned to every event tracking
sa.registerSuperProperties({ $appVersion: '1.0.0', env: 'production' })
// Track event
sa.track('user-id', 'userHappy')
// Track event with custom properties
sa.track('user-id', 'newOrder', { orderId: '12323' })
// Track Signup
sa.trackSignup('user-id', 'anonymous-id/device-id')
// Track Signup with custom properties
sa.trackSignup('user-id', 'anonymous-id/device-id', { userType: 'administrator' })
// Manipuate user project
sa.profileSet('user-id', { age: 18 })
sa.profileSetOnce('user-id', { registerTime: new Date().valueOf() })
sa.profileIncrement('user-id', { scoreCount: 100, issueCount: -1 })
sa.profileAppend('user-id', { tags: ['student', 'developer'] })
sa.profileUnset('user-id', ['temporaryTag'])
For more detailed information about each api, checkout Sensors Analytics manual
By default, the library uses current time as the time when event occurs,
but the behavior can be overrode by $time
property.
- Both
track
andtrackSignup
support this feature. $time
can beDate
,number
,string
,Moment
instance
import moment from 'moment'
sa.track('user-id', 'newOrder', { orderId: '12323', $time: new Date(2016,7,30) })
sa.track('user-id', 'newOrder', { orderId: '12323', $time: '2016-07-30T00:00:00+08:00' })
sa.track('user-id', 'newOrder', { orderId: '12323', $time: 1469808000000 })
sa.track('user-id', 'newOrder', { orderId: '12323', $time: moment() })
sa.trackSignup('user-id', 'anonymous-id/device-id', { $time: new Date(2016,7,30) })
sa.trackSignup('user-id', 'anonymous-id/device-id', { $time: '2016-07-30T00:00:00+08:00' })
sa.trackSignup('user-id', 'anonymous-id/device-id', { $time: 1469808000000 })
sa.trackSignup('user-id', 'anonymous-id/device-id', { $time: moment() })
SensorsData support parsing user geo location from IP address.
- Both
track
andtrackSignup
support this feature.
router.post('/api/new-order', (req, res) => {
sa.track(req.session.userId, 'newOrder', { $ip: req.ip })
// ...
})
Node SDK supports parsing client OS
, OS version
, Browser
, Browser version
, Browser Engine
, Model
from client's User Agent
- Both
track
andtrackSignup
support this feature.
router.post('/api/new-order', (req, res) => {
sa.track(req.session.userId, 'newOrder', { $userAgent: req.get('user-agent') })
// ...
})
By default, submitter can be created with server url
import SensorsAnalytics from 'sa-sdk-node'
const url = 'http://xxx.cloud.sensorsdata.cn:8006/sa?token=xxx'
const sa = new SensorsAnalytics()
const submitter = sa.submitTo(url)
But it also can be created with explicit config
import SensorsAnalytics from 'sa-sdk-node'
const url = 'http://xxx.cloud.sensorsdata.cn:8006/sa?token=xxx'
const sa = new SensorsAnalytics()
const submitter = sa.submitTo({ url, gzip: true, mode: 'track', timeout: 10 * 1000 })
// gzip: whether enable gzip, default to true
// mode: could be 'track' (production use), 'debug' (diagnosis data), 'dryRun' (diagnosis with no data recorded),
// also supports the values that aligned to other SDKs: debug_off, debug_and_track and debug_only,
// default to track
// mode:
// timeout: Http timeout in ms, default to 10s
Submitter can be create manually and attach to SensorsAnalytics
manually
Created with url with default config
import SensorsAnalytics, { Submitter } from 'sa-sdk-node'
const url = 'http://xxx.cloud.sensorsdata.cn:8006/sa?token=xxx'
const sa = new SensorsAnalytics()
const submitter = new Submitter(url)
sa.subscribe(submitter)
Or with explicit config
import SensorsAnalytics, { Submitter } from 'sa-sdk-node'
const url = 'http://xxx.cloud.sensorsdata.cn:8006/sa?token=xxx'
const sa = new SensorsAnalytics()
const submitter = new Submitter({ url, gzip: true, mode: 'track', timeout: 10 * 1000 })
sa.subscribe(submitter)
Network error handling
submitter.catch((err) => console.error(err))
WARN Batch submit is not supported by debug
or dryRun
mode. It causes 400 bad-request error
Suppose
import SensorsAnalytics, { Submitter } from 'sa-sdk-node'
const url = 'http://xxx.cloud.sensorsdata.cn:8006/sa?token=xxx'
const sa = new SensorsAnalytics()
// Submit when 20 events are tracked
sa.submitTo(url, { count: 20 })
// Submit when every 5 seconds
sa.submitTo(url, { timeSpan: 5 * 1000 })
// Submit every 5 seconds, but also submit immediately if 20 events tracked
sa.submitTo(url, { count: 20, timeSpan: 5 * 1000 })
Batch
can be created manually if needed, which can be subscribed with submitter
later
const batch = sa.inBatch({ count: 20, timeSpan: 5 * 1000 })
batch.subscribe(new Submitter(url))
This library is powered by Microsoft's RxJS.
SensorsAnalytics
is an Observable, which yields tracking data.
Submitter
is an Observer, which consume the tracking data.
Submitter
is also an Observable, which yields next when submitted succeeded, and yields Error
when network errors.
Ideally, you can use all RxJS tricks with this library
// All the event that raised by debug build app won't be submitted
sa.filter((event) => event.properties.releaseType !== 'debug')
.subscribe(submitter)
// Useful while tracking user input or other case
// The event won't be tracked unless user has stopped typing for 500ms
sa.debounce(500)
.subscribe(submitter)
textInput.onChange((text) => sa.track(userId, 'userType', { text }))
For more detail, checkout Microsoft's Rx documentation
MIT