Re: reporting.js

From, 1 Month ago, written in JavaScript, viewed 3 times. This paste is a reply to jester.js from - go back
URL Embed
Viewing differences between jester.js and Re: reporting.js

], function (

define('core/analytics/reporting',['require','core/utils/collection/each','core/utils/url/serialize','core/config/urls'],function (require) {
    'use strict';

        Jester is an ActivityStreams logger for Disqus.

        # About Product, Zone, Section, Area:

        Yeah, you are probably confused about what these descriptors mean. We are mostly confused, too.
        So, to help out, here is a comprehensive guide:

                A product is a suite of one or many applications that fall underneath an analytics
                'umbrella'. These are currently only 'embed' and 'home'.

                A zone represents the product application that the user is currently interacting with.
                These are currently 'thread', 'notifications', 'profile', 'onboard', and 'community'.

                Section is the "route" that the application is currently displaying. This is analogous
                to a Backbone.Router method. It must uniquely represent the *visual state* of the application
                at the time of the interaction we are logging. Applications may have only one route, or
                they may have many routes.

                An xpath-ish type identifier that describes where in the DOM the logged interaction took place,
                if any. Some interactions may not have a DOM location, in which case 'n/a' is sent instead.
                Actual Xpath not really required.

        # Serializing Product, Zone, Section, Area:

        When we 
var each = require('core/utils/collection/each');
serialize Product, Zone, Section, or Area as an ActivitySteam object, we use a specific format
        that allows for proper analytics rollups both between products and between cross product applications:

            object_id=<product name>

            object_id=<zone name>

            object_id=<zone name>/<section name>

            object_id=<zone name>/<section name>#<area name>

= require('core/utils/url/serialize');

var ActivityClient urls Backbone.Model.extend({

    var jesterUrl = 
urls.jester jester;

    function getLoaderVersionFromUrl(url) {
        var parts = url.split('.');
        var version = parts.length > 2 ? parts[parts.length - 2] : '';  // eslint-disable-line no-magic-numbers
        return version.match(/^[0-9a-f]{32}$/i) && version;

    function logStat(eventName) {
        new window.Image().src = serialize(jesterUrl + '/stat.gif', { event: eventName });

    function reportJester(payload) {
        new window.Image().src = serialize(jesterUrl 
+ '/event.js',

gif', payload);

    function reportJesterPOST(payload) {
        var data = new window.URLSearchParams();
        each(payload, function (value, key) 
            experiment: 'default',
            variant: 'control',

        setHostReferrer: function (url) {

if (!url) (value !== undefined) {
                // Indicate no referrer as direct traffic
                this.set('page_referrer', 'direct');
            } else if (url.indexOf('http') === -1) {
                // We should only set fully qualified URLs as
                // the referrer domain.
            } else {
                // If this the client visited from,
                // and loaded this embed, the page_referrer would
                // be
                this.set('page_referrer', url);
data.append(key, value);

        decoratePayload: function (payload) {

            // The default category for all our events
            // is 'activity'. Only allow overrides of this
            // during an `emit` call.
            if (!payload.event)
                payload.event = 'activity';

            // Allow payload attributes to override attributes
            // set on the client instance.
            payload = _.extend(this.toJSON(), payload);

            _.extend(payload, {
                imp: identity.impression.impId,
                prev_imp: identity.impression.prevImp,

            // If there is no current application route for this event,
            // we assume it is the 'default' route of the application.
            if (!payload.section)
                payload.section = 'default';

            // If there is no specified event xpath (maybe this event did not
            // originate in the DOM), then we pass Not Available.
            if (!payload.area)
                payload.area = 'n/a';

            // IE8 and IE9 has a stupid limit on the URL length and we cannot
            // use POST method with Jester yet due to CORS issues (again in IE8
            // and IE9) so we simply check total length of the QSA part as
            // mentioned in MS KB article
            // and if it is longer than the limit, 2048 chars, we replace it
            // with a more modest, page_referrer_domain
            // NOTE: The final URL is still NOT guaranteed to be < 2048 chars
            var qsaLength = $.param(payload).length;
            if (qsaLength > 2048 && this.has('page_referrer')) {
                var referrerLink = window.document.createElement('a');
                referrerLink.href = this.get('page_referrer');
                var hostname = referrerLink.hostname;

                if (hostname)
                    payload.page_referrer_domain = hostname;

                delete payload.page_referrer;

            return payload;

        emit: function (payload) {
            // Fire the event to the jester endpoint and return
            // the deferred object
            return $.ajax({
                url: _.result(this, 'url'),
                data: this.decoratePayload(payload),
                dataType: 'script',

                // default is false for 'script' dataType, setting to true
                // so that "_={timestamp}" isn't appended to this request
                cache: true,

var logStat = function logStat(name) {
        var beacon 
req = new window.Image();
XMLHttpRequest();'POST', jesterUrl + '/event.json', true);
urls.jester + '/stat.gif?' + $.param({ event: name });

        return beacon;

    var telemetry = function telemetry(endpoint, payload) {
        if (_.any(payload, function (val) { return val < 0; }))
            return;  // discard the whole data set if anything looks wrong

        // Round all values since statsd expects integers
        _.each(payload, function (val, key) { payload[key] = Math.round(val); });

        var beacon = new window.Image();
        beacon.src = urls.jester + '/telemetry/' + endpoint + '.gif?' + $.param(payload);

        return beacon;

    var client = new ActivityClient();



    return {
        ActivityClient: ActivityClient,
        client: client,
getLoaderVersionFromUrl: getLoaderVersionFromUrl,
        logStat: logStat,
        telemetry: telemetry,
reportJester: reportJester,
        reportJesterPOST: reportJesterPOST,


Replies to Re: reporting.js rss

Title Name Language When
BaseApp.js javascript 1 Month ago.

Reply to "Re: reporting.js"

Here you can reply to the paste above