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 ; } }); }