Tempo
Scalable time-based counters that meant logging, graphing and providing a realtime statistics. All features in tempo are meant to have a constant size memory footprint defined by configuration.
For a quick example, please look at examples/simple-use-case.js
Features
- simple counters that sync over redis using a hash structure
- counters that keep track of historical data in buckets
- syncing with redis for aggregation on multiple servers
- throttling
Use Case
Lets say you are running a website and want to know in realtime where people are visiting.
var redis = ; var tempo = ; // create middleware to track counts // create time counter, increment and sync var min = tempo; app { min; } { min; console; }
Counter
The tempo TimedCounter class allows you to create a datastore object and keep data in memory.
Instance methods
var counter = new tempo.Counter(options)
- options hash
- per: milliseconds per bucket
- buckets: number of buckets
- timeout (optional): Time to live. Mainly for redis syncing. Defaults to (perbucket)+per2
Example for keeping data up to an hour of history:
var tempo = ;var ds = per: 60000 buckets: 60 ;
counter.inc(key, [n]); O(1)
- key: entity name
- n (optional, defaults to 1): a number to increment by.
Keeping track of how many times a user has logged in in the past hour:
var ds = ; ds;
counter.getHistory(key); O(n)
- key: entity name
Grabbing logged in counts:
var history = ds;
Returns an array of counts (per bucket)
counter.sync([callback]) O(nb)
- redis client
- prefix/namespace for the key to store in redis
* tempo's keys will look something like "<namespace>:<timestamp>"
- O(nt) where n is the number of keys and b is the number of buckets
counter;
counter.getKeys(); O(nb)
returns and array of all the keys in the counter O(nt) where n is the number of keys and b is the number of buckets
counter.eachCount(key1, key2, ... [ callback ])
Runs a callback against every bucket in the counter with arguments (see examples below):
counter.eachCount('key1', 'key2', function (keyCount1, keyCount2, time) {
console.log('key1', keyCount1, ' at ' + (new Date(time)).toString());
console.log('key2', keyCount2, ' at ' + (new Date(time)).toString());
});
# Syncer
```javascript
var tempo = require('tempo');
var syncer = new tempo.Syncer(redisClient);
Instance methods
syncer.addCounter(counter);
Adds a counter to the list of counters to sync at once
var counter = syncer.counter(options)
Shortcut to instantiate counter and add it
syncer.sync([ callback ])
Syncs all counters to redis (push and pull)
syner.push([ callback ])
Pushes data to redis
syncer.pull([ callback ])
Pulls data from redis
syncer.start(type, interval)
Starts running a type of sync at given intervals between syncs
syncerstart'push' 3000 // push to redis every 3 seconds