While using dynaTrace with our app, we needed a way to inject markers dynamically. We also wanted the profiling code to have a minimal footprint, not run in production, give us the most accurate measurements, and not interact with production code.

This example might help someone else with similar requirements:

/**
* Creates and manages markers for dynaTrace
* @class MARKER
* @param name {String}
* @param fn {Function} initializing function
* this should add an event handler eventually calling 
* .wait() or .stop()
* @param time {Number} the polling interval while
* trying to add the fn handler (default is 500 ms)
* @constructor
* @example MARKER("myMark");
*/
var MARKER = function (name, fn, time) {
    if (!(this instanceof MARKER)) {
        return new MARKER(name, fn, time);
    }
	MARKER.instance = this;
	this.name = name;
	this.start(fn, time);
};
/**
* Creates a marker or logs to console
* @method addMessage
* @param msg {String}
* @return {Void}
*/
MARKER.prototype.addMessage = function (msg) {
	return (typeof _dt_addMark !== "undefined") ? _dt_addMark(msg) : console.log(msg, this.time || "");
};
/**
* Starts timing a marker
* @method start
* @param fn {Function}
* @param time {Number}
*/
MARKER.prototype.start = function (fn, time) {
	this.addMessage(this.name + " start");
	this.started = +new Date();
	this.running = fn ? setInterval(fn, time || 500) : true;
};
/**
* Clears a running interval
* @method wait
*/
MARKER.prototype.wait = function () {
	if (typeof this.running === "number") {
		clearInterval(this.running);
	}
};
/**
* Clears a running interval and stops timing
* @method stop
*/
MARKER.prototype.stop = function () {
	this.wait();
	this.running = false;
	this.stopped = +new Date();
	this.time = (this.stopped - this.started) / 1000;
	this.addMessage(this.name + " stop");
};
/*
example of usage:
if dynaTrace is running, invocation adds a jQuery event handler (polling every 500ms until jQuery is available)
on document.ready to listen for certain user interactions.  New markers are created based on hash.
*/
if (typeof _dt_addMark !== "undefined") {
	new MARKER("inital load", function () {
		if (typeof jQuery !== "undefined") {
			jQuery(function () {
				jQuery(this).delegate("input, select, button", "focus, click", function (e) {
					var M = MARKER, m = M.instance;
					if (m && m.running) {
						m.stop();
					}
					if (this.id && this.id === "<<an id that users click to move the app along>>" && e.type === "click") {
						new M(window.location.hash.replace(/^#\//, ""));
					}
				});
			});
			MARKER.instance.wait();
			MARKER.initialized = true;
		}
	});
}
Be Sociable, Share!

    Leave a reply

    required

    <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>