When I was working on the aggregation code for telemetry histograms as displayed on the telemetry dashboard, I also wrote a Javascript library (telemetry.js) to access the aggregated histograms presented in the dashboard. The idea was separate concerns and simplify access to the aggregated histogram data, but also to allow others to write custom dashboards presenting this data in different ways. Since then two custom dashboards have appeared:
- a developer toolbox activity dashboard by Jeff Griffiths, and
- a histogram regression dashboard by Roberto Vitillo.
Both of these dashboards runs a cronjob that downloads the aggregated histogram data using telemetry.js and then aggregates or analyses it in an interesting way before publishing the results on the custom dashboard. However, telemetry.js
was written to be included from telemetry.mozilla.org/v1/telemetry.js, so that we could update the storage format, use a differnet data service, move to a bucket in another region, etc. I still want to maintain the ability to modify telemetry.js
without breaking all the deployments, so I decided to write a node.js module called telemetry-js-node that loads telemetry.js
from telemetry.mozilla.org/v1/telemetry.js.
As evident from the example below, this module is straight forward to use, and exhibits full compatibility with telemetry.js for better and worse.
// Include telemetry.js
var Telemetry = require('telemetry-js-node');
// Initialize telemetry.js just the documentation says to
Telemetry.init(function() {
// Get all versions
var versions = Telemetry.versions();
// Pick a version
var version = versions[0];
// Load measures for version
Telemetry.measures(version, function(measures) {
// Print measures available
console.log("Measures available for " + version);
// List measures
Object.keys(measures).forEach(function(measure) {
console.log(measure);
});
});
});
Whilst there certainly is some valid concerns (and risks) with loading Javascript code over http. This hack allows us to offer a stable API and minimize maintenance for people consuming the telemetry histogram aggregates. And as we’re reusing the existing code the extensive documentation for telemetry is still applicable. See the following links for further details.
Disclaimer: I know it’s not smart to load Javascript code into node.js over http. It’s mostly a security issue as you can’t use telemetry.js
without internet access anyway. But considering that most people will run this as an isolated cron job (using docker, lxc, heroku or an isolated EC2 instance), this seems like an acceptable solution.
By the way, if you make a custom telemetry dashboard, whether it’s using telemetry.js in the browser or Node.js, please file a pull request against telemetry-dashboard on github to have a link for your dashboard included on telemetry.mozilla.org.