All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.glowroot.ui.app-dist.scripts.scripts.cf9d33e9.js Maven / Gradle / Ivy

There is a newer version: 0.9.28
Show newest version
var glowroot=angular.module("glowroot",["ui.router","ui.bootstrap.buttons","ui.bootstrap.dropdown","ui.bootstrap.popover","ui.bootstrap.typeahead","ui.bootstrap.modal"]),Glowroot;glowroot.config(["$locationProvider","$httpProvider",function(a,b){a.html5Mode(!0);var c=["$rootScope","$injector","$location","$q","$timeout","login",function(a,b,c,d,e,f){return{response:function(c){var d=c.headers("Glowroot-Layout-Version");return d&&a.layout&&d!==a.layout.version&&b.get("$http").get("backend/layout").success(function(b){a.layout=b}),c},responseError:function(a){if(401===a.status){var b=c.path();return"/login"===b?d.defer().promise:(a.data.timedOut?f.goToLogin("Your session has timed out"):f.goToLogin(),d.defer().promise)}if(0===a.status){var g=d.defer();return e(function(){g.reject(a)},500),g.promise}return d.reject(a)}}}];b.interceptors.push(c)}]),glowroot.run(["$rootScope","$http","$location","$state","login",function(a,b,c,d,e){function f(b){a.layout=b,a.layout.needsAuthentication?e.goToLogin():"/login"===c.path()&&a.authenticatedUser&&c.path("/").replace()}a.serverId="",a.$on("$locationChangeSuccess",function(){a.serverRollup=c.search()["server-rollup"]||""}),a.transactionTypes=function(){if(!a.layout)return[];var b=a.layout.serverRollups[a.serverRollup];return b?b.transactionTypes:[]},a.defaultTransactionType=function(){if(!a.layout)return"";if(!a.layout.central)return a.layout.defaultTransactionType;var b=a.transactionTypes();return-1!==b.indexOf(a.layout.defaultTransactionType)?a.layout.defaultTransactionType:0===b.length?"":b[0]},a.showSignIn=function(){return!a.authenticatedUser&&a.layout&&a.layout.adminPasswordEnabled},a.showSignOut=function(){return a.authenticatedUser&&a.layout&&a.layout.adminPasswordEnabled},a.goToLogin=function(a){return a.ctrlKey?void 0:(e.goToLogin(),!1)},a.signOut=function(){var c=$(".navbar-collapse");c.removeClass("in"),c.addClass("collapse"),b.post("backend/sign-out").success(function(){a.authenticatedUser=void 0,"none"===a.layout.anonymousAccess?e.goToLogin("You have been signed out",!0):d.reload()}).error(function(){alert("An error occurred during log out")})},a.hideNavbar=function(){return"/login"===c.path()};var g=$("#container"),h=$(window);a.containerWidth=g.width(),a.windowHeight=h.height(),$(window).resize(function(){var b=g.width(),c=h.height();(b!==a.containerWidth||c!==a.windowHeight)&&a.$apply(function(){a.containerWidth=b,a.windowHeight=c})}),window.layout?(f(window.layout),a.authenticatedUser=window.authenticatedUser):b.get("backend/authenticated-user").success(function(c){a.authenticatedUser=c,b.get("backend/layout").success(function(a){f(a)})}),a.$on("$stateChangeSuccess",function(){window.ga&&window.ga("send","pageview",{page:c.path()})});var i="([1-9]?[0-9]?(\\.[0-9]*)?|100(\\.0*)?)";a.pattern={percentile:new RegExp("^"+i+"$"),percentileList:new RegExp("^("+i+" *, *)*"+i+"$"),integer:/^(0|[1-9][0-9]*)$/,double:/^(0|[1-9][0-9]*)?(\.[0-9]*)?$/},ZeroClipboard.config({bubbleEvents:!1,cacheBust:!1}),$(document).on("focusin","#global-zeroclipboard-html-bridge",!1)}]),Glowroot=function(){function a(a,c){$(a).each(function(){var a=$(this);a.data("gtTimeout")&&clearTimeout(a.data("gtTimeout")),a.stop().animate({opacity:"100"}),a.removeClass("hide");var d=this;a.data("gtTimeout",setTimeout(function(){b(d,1e3)},c))})}function b(a,b){var c=$(a);c.fadeOut(b,function(){c.addClass("hide"),c.css("display","")})}function c(a,b){b=b||{lines:9,radius:8,width:5,zIndex:1020};var c=$(a)[0],d=new Spinner(b),e=setTimeout(function(){$(c).removeClass("hide"),d.spin(c)},100);return{stop:function(){clearTimeout(e),$(c).addClass("hide"),d.stop()}}}return{showAndFadeSuccessMessage:function(b){a(b,1500)},fadeOut:b,showSpinner:c}}(),$(document).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(a){$(a.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(a.type))}),glowroot.config(["$provide","$stateProvider","$urlRouterProvider",function(a,b,c){var d=function(a){return["$q","$rootScope","$location",function(b,c,d){if(window.layout)return a&&!d.search()["transaction-type"]&&(d.search("transaction-type",c.defaultTransactionType()),d.replace()),function(){};var e=b.defer(),f=c.$watch("layout",function(b){a&&!d.search()["transaction-type"]&&(d.search("transaction-type",c.defaultTransactionType()),d.replace()),b&&(e.resolve(),f())});return e.promise}]};c.otherwise(function(a){var b=a.get("$rootScope");return b.layout&&b.layout.central?"/server-rollups":"transaction/average"}),b.state("transaction",{abstract:!0,url:"/transaction?server-rollup&transaction-type",templateUrl:"views/transaction.html",controller:"TransactionCtrl",resolve:{headerDisplay:function(){return"Transactions"},shortName:function(){return"transaction"},defaultSummarySortOrder:function(){return"total-time"},waitForLayout:d(!0)}}),b.state("transaction.detail",{abstract:!0,views:{sidebar:{templateUrl:"views/transaction/sidebar.html",controller:"TransactionSidebarCtrl",resolve:{summarySortOrders:function(){return{"total-time":"By percent of total time","average-time":"By average time",throughput:"By throughput (per min)"}},summaryValueFn:["$filter",function(a){return function(b,c,d,e){return"total-time"===c?(100*b.totalNanos/d.totalNanos).toFixed(1)+" %":"average-time"===c?a("gtMillis")(b.totalNanos/(1e6*b.transactionCount))+" ms":"throughput"===c?(6e4*b.transactionCount/e).toFixed(1)+"/min":void 0}}]}},tabs:{templateUrl:"views/transaction/tabs.html",controller:"TransactionTabCtrl"}}}),b.state("transaction.detail.average",{url:"/average?transaction-name",views:{"main@transaction":{templateUrl:"views/transaction/average.html",controller:"TransactionAverageCtrl"}}}),b.state("transaction.detail.percentiles",{url:"/percentiles?transaction-name",views:{"main@transaction":{templateUrl:"views/transaction/percentiles.html",controller:"TransactionPercentilesCtrl"}}}),b.state("transaction.detail.throughput",{url:"/throughput?transaction-name",views:{"main@transaction":{templateUrl:"views/transaction/throughput.html",controller:"TransactionThroughputCtrl"}}}),b.state("transaction.detail.queries",{url:"/queries?transaction-name",views:{"main@transaction":{templateUrl:"views/transaction/queries.html",controller:"TransactionQueriesCtrl"}}}),b.state("transaction.detail.profile",{url:"/profile?transaction-name",views:{"main@transaction":{templateUrl:"views/transaction/profile.html",controller:"TransactionProfileCtrl"}}}),b.state("transaction.detail.traces",{url:"/traces?transaction-name",views:{"main@transaction":{templateUrl:"views/transaction/traces.html",controller:"TracesCtrl",resolve:{slowOnly:function(){return!0},errorOnly:function(){return!1}}}}}),b.state("transaction-flame-graph",{url:"/transaction/flame-graph",templateUrl:"views/transaction/flame-graph.html",controller:"TransactionFlameGraphCtrl",resolve:{dummy:["$q","$timeout",function(a,b){function c(){window.d3?d.resolve():b(c,100)}var d=a.defer();return b(c,100),d.promise}],waitForLayout:d(!0)}}),b.state("error",{abstract:!0,url:"/error?server-rollup&transaction-type",templateUrl:"views/transaction.html",controller:"TransactionCtrl",resolve:{headerDisplay:function(){return"Errors"},shortName:function(){return"error"},defaultSummarySortOrder:function(){return"error-count"},waitForLayout:d(!0)}}),b.state("error.detail",{abstract:!0,views:{sidebar:{templateUrl:"views/transaction/sidebar.html",controller:"TransactionSidebarCtrl",resolve:{summarySortOrders:function(){return{"error-count":"By error count","error-rate":"By error rate"}},summaryValueFn:function(){return function(a,b){return"error-count"===b?a.errorCount:"error-rate"===b?(100*a.errorCount/a.transactionCount).toFixed(1)+" %":void 0}}}},tabs:{templateUrl:"views/transaction/error-tabs.html",controller:"TransactionTabCtrl"}}}),b.state("error.detail.messages",{url:"/messages?transaction-name",views:{"main@error":{templateUrl:"views/transaction/error-messages.html",controller:"ErrorMessagesCtrl"}}}),b.state("error.detail.traces",{url:"/traces?transaction-name",views:{"main@error":{templateUrl:"views/transaction/traces.html",controller:"TracesCtrl",resolve:{slowOnly:function(){return!1},errorOnly:function(){return!0}}}}}),b.state("jvm",{url:"/jvm",templateUrl:"views/jvm.html",controller:"JvmCtrl"}),b.state("jvm.gauges",{url:"/gauges",templateUrl:"views/jvm/gauge-values.html",controller:"JvmGaugeValuesCtrl",resolve:{waitForLayout:d(!1)}}),b.state("jvm.processInfo",{url:"/process-info",templateUrl:"views/jvm/process-info.html",controller:"JvmProcessInfoCtrl"}),b.state("jvm.threadDump",{url:"/thread-dump",templateUrl:"views/jvm/thread-dump.html",controller:"JvmThreadDumpCtrl"}),b.state("jvm.heapDump",{url:"/heap-dump",templateUrl:"views/jvm/heap-dump.html",controller:"JvmHeapDumpCtrl"}),b.state("jvm.mbeanTree",{url:"/mbean-tree",templateUrl:"views/jvm/mbean-tree.html",controller:"JvmMBeanTreeCtrl"}),b.state("jvm.capabilities",{url:"/capabilities",templateUrl:"views/jvm/capabilities.html",controller:"JvmCapabilitiesCtrl"}),b.state("jvm.glowrootLog",{url:"/glowroot-log",templateUrl:"views/jvm/glowroot-log.html",controller:"JvmGlowrootLogCtrl"}),b.state("config",{url:"/config",templateUrl:"views/config.html",controller:"ConfigCtrl"}),b.state("config.transaction",{url:"/transaction",templateUrl:"views/config/transaction.html",controller:"ConfigCommonCtrl",resolve:{backendUrl:function(){return"backend/config/transaction"}}}),b.state("config.instrumentationList",{url:"/instrumentation-list",templateUrl:"views/config/instrumentation-list.html",controller:"ConfigInstrumentationListCtrl"}),b.state("config.instrumentation",{url:"/instrumentation?v",templateUrl:"views/config/instrumentation.html",controller:"ConfigInstrumentationCtrl"}),b.state("config.gaugeList",{url:"/gauge-list",templateUrl:"views/config/gauge-list.html",controller:"ConfigGaugeListCtrl"}),b.state("config.gauge",{url:"/gauge",templateUrl:"views/config/gauge.html",controller:"ConfigGaugeCtrl"}),b.state("config.alertList",{url:"/alert-list",templateUrl:"views/config/alert-list.html",controller:"ConfigAlertListCtrl"}),b.state("config.alert",{url:"/alert",templateUrl:"views/config/alert.html",controller:"ConfigAlertCtrl",resolve:{waitForLayout:d(!1)}}),b.state("config.pluginList",{url:"/plugin-list",templateUrl:"views/config/plugin-list.html",controller:"ConfigPluginListCtrl"}),b.state("config.plugin",{url:"/plugin?id",templateUrl:"views/config/plugin.html",controller:"ConfigPluginCtrl"}),b.state("config.advanced",{url:"/advanced",templateUrl:"views/config/advanced.html",controller:"ConfigCommonCtrl",resolve:{backendUrl:function(){return"backend/config/advanced"}}}),b.state("config.smtp",{url:"/smtp",templateUrl:"views/config/smtp.html",controller:"ConfigSmtpCtrl"}),b.state("config.userRecording",{url:"/user-recording",templateUrl:"views/config/user-recording.html",controller:"ConfigUserRecordingCtrl"}),b.state("config.userInterface",{url:"/ui",templateUrl:"views/config/user-interface.html",controller:"ConfigUserInterfaceCtrl"}),b.state("config.storage",{url:"/storage",templateUrl:"views/config/storage.html",controller:"ConfigStorageCtrl"}),b.state("login",{url:"/login",templateUrl:"views/login.html",controller:"LoginCtrl",resolve:{waitForLayout:d(!1)}})}]),glowroot.factory("gtButtonGroupControllerFactory",["$q",function(a){return{create:function(b,c){var d=$(b),e=!1;return{onClick:function(b){if(!e){var f=d.find(".gt-button-message"),g=d.find(".gt-button-spinner");f.addClass("hide");var h;c||(h=Glowroot.showSpinner(g));var i=a.defer();i.promise.then(function(a){h&&h.stop(),f.text(a||""),f.removeClass("gt-button-message-error"),f.addClass("gt-button-message-success"),Glowroot.showAndFadeSuccessMessage(f),e=!1},function(a){h&&h.stop(),f.text(a),f.removeClass("gt-button-message-success"),f.addClass("gt-button-message-error"),f.removeClass("hide"),e=!1}),e=!0,b({deferred:i})}}}}}}]),glowroot.directive("gtButtonGroup",["gtButtonGroupControllerFactory",function(a){return{scope:{},transclude:!0,template:'
',controller:["$element",function(b){var c=a.create(b);this.onClick=c.onClick}]}}]),glowroot.directive("gtButton",["gtButtonGroupControllerFactory","modals",function(a,b){return{scope:{gtLabel:"@",gtClick:"&",gtBtnClass:"@",gtDisabled:"&",gtNoSpinner:"@",gtConfirmHeader:"@",gtConfirmBody:"@"},templateUrl:"template/gt-button.html",require:"^?gtButtonGroup",link:function(c,d,e,f){f||(c.noGroup=!0,f=a.create(d,c.gtNoSpinner)),c.onClick=function(){if(c.gtConfirmHeader){var a=$("#confirmationModal");a.find(".modal-header h3").text(c.gtConfirmHeader),a.find(".modal-body p").text(c.gtConfirmBody),b.display("#confirmationModal",!0),$("#confirmationModalButton").off("click"),$("#confirmationModalButton").on("click",function(){c.$apply(function(){$("#confirmationModal").modal("hide"),f.onClick(c.gtClick)})})}else f.onClick(c.gtClick)}}}}]),glowroot.directive("gtFormGroup",["conversions",function(a){return{scope:{gtType:"@",gtLabel:"@",gtCheckboxLabel:"@",gtModel:"=",gtWidth:"@",gtAddon:"@",gtPattern:"@",gtRequired:"&",gtDisabled:"&",gtPlaceholder:"@",gtNumber:"&",gtRows:"@",gtColClass1:"@",gtColClass2:"@"},transclude:!0,require:"^form",templateUrl:"template/gt-form-group.html",link:function(b,c,d,e){b.formCtrl=e,b.gtId=b.$id,b.gtType||(b.gtType="text"),b.$watch("gtModel",function(c){a.toNumber(b.ngModel)!==c&&(b.ngModel=c)}),b.$watch("ngModel",function(c){b.gtNumber()?b.gtModel=a.toNumber(c):b.gtModel=c}),b.$watch("gtPattern",function(a){if(a){var c=a.match(/^\/(.*)\/$/);c?b.ngPattern=new RegExp(c[1]):b.ngPattern=b.$parent.$eval(a)}else b.ngPattern=/.?/})}}}]),glowroot.directive("gtInputGroupDropdown",function(){return{scope:{gtModel:"=",gtItems:"&",gtClass:"@"},templateUrl:"template/gt-input-group-dropdown.html",replace:!0,link:function(a){a.$watch("gtModel",function(b){angular.forEach(a.gtItems(),function(c){c.value===b&&(a.gtDisplay=c.display)})}),a.gtClass?a.classes="input-group-btn "+a.gtClass:a.classes="input-group-btn"}}}),glowroot.directive("gtNavbarItem",["$location","$state",function(a,b){return{scope:{gtDisplay:"@",gtItemName:"@",gtUrl:"@",gtState:"@"},replace:!0,transclude:!0,templateUrl:"template/gt-navbar-item.html",link:function(a){a.isActive=function(){return a.$parent.activeNavbarItem===a.gtItemName},a.ngClick=function(c){var d=$(".navbar-collapse");return d.removeClass("in"),d.addClass("collapse"),b.current.name!==a.gtState||c.ctrlKey?void 0:(b.go(a.gtState,null,{reload:!0}),c.preventDefault(),!1)}}}}]),glowroot.directive("gtSidebarItem",["$location","$state",function(a,b){return{scope:{gtDisplay:"@",gtDisplayRight:"@",gtUrl:"@",gtActive:"&",gtSubActive:"&",gtActiveRefresh:"&"},replace:!0,templateUrl:"template/gt-sidebar-item.html",link:function(c,d,e){c.isActive=function(){return e.gtActive?c.gtActive():a.path()==="/"+c.gtUrl},c.isSubActive=function(){return e.gtSubActive&&c.gtSubActive()},c.ngClick=function(a){return c.isActive()&&!a.ctrlKey?(e.gtActiveRefresh?c.gtActiveRefresh():b.reload(),a.preventDefault(),!1):void 0}}}}]),glowroot.directive("gtDisplayWhitespace",function(){return{scope:{gtBind:"&"},link:function(a,b){var c=a.gtBind();b.text(c);var d=b.html();d=d.replace("\n","\\n").replace("\r","\\r").replace(" ","\\t"),d=d.replace("",""),b.html(d)}}}),glowroot.directive("gtSpinner",function(){return function(a,b,c){var d,e;b.addClass("hide"),a.$watch(c.gtShow,function(a){if(a){if(d)return;var f;c.gtSpinnerInline&&(f=10),d=new Spinner({lines:9,radius:8,width:5,left:f,zIndex:1020}),c.gtNoDelay?(b.removeClass("hide"),d.spin(b[0])):(clearTimeout(e),e=setTimeout(function(){b.removeClass("hide"),d.spin(b[0])},100))}else void 0!==d&&(clearTimeout(e),b.addClass("hide"),d.stop(),d=void 0)})}}),glowroot.directive("gtFormWithPrimaryButton",function(){return function(a,b){b.on("keypress","input",function(a){13===a.which&&b.find(".btn-primary:enabled").first().click()})}}),glowroot.directive("gtFormAutofocusOnFirstInput",["$timeout",function(a){return function(b,c){a(function(){var a="input:not(.gt-autofocus-ignore)",d=b.$watch(function(){return c.find(a).length&&c.find("input").first().is(":visible")},function(b){b&&(c.find(a).first().focus(),d())})},100)}}]),glowroot.directive("gtSmartClick",function(){return{scope:{gtSmartClick:"&"},link:function(a,b){b.mousedown(function(b){a.mousedownPageX=b.pageX,a.mousedownPageY=b.pageY}),b.click(function(b,c){(c||!(Math.abs(b.pageX-a.mousedownPageX)>5||Math.abs(b.pageY-a.mousedownPageY)>5))&&a.$apply(function(){a.gtSmartClick({$event:b})})})}}}),glowroot.directive("gtSelectpicker",["$timeout",function(a){return{scope:{ngModel:"=",gtSelectpickerOptions:"&"},link:function(b,c){a(function(){c.selectpicker(b.gtSelectpickerOptions()),c.selectpicker("val",b.ngModel),c.selectpicker("refresh")}),b.$on("$destroy",function(){c.selectpicker("destroy")})}}}]),glowroot.filter("gtBytes",function(){return HandlebarsRendering.formatBytes}),glowroot.filter("gtMillis",function(){return HandlebarsRendering.formatMillis}),glowroot.filter("gtCount",function(){return HandlebarsRendering.formatCount}),glowroot.filter("gtDuration",function(){return function(a){if(void 0===a)return"";var b=moment.duration(a),c=[];return b.days()>=1&&c.push(Math.floor(b.days())+"d"),b.hours()>=1&&c.push(Math.floor(b.hours())+"h"),b.minutes()>=1&&c.push(Math.floor(b.minutes())+"m"),b.seconds()>=1&&c.push(Math.floor(b.seconds())+"s"),c.join(" ")}}),glowroot.filter("gtOnOff",function(){return function(a){return a?"ON":"OFF"}}),glowroot.filter("gtTypeaheadClassHighlight",["$sce",function(a){function b(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(c,d){return d?(c=c.replace(new RegExp("^"+b(d),"gi"),"$&"),c=c.replace(new RegExp("\\.("+b(d)+")","gi"),".$1"),c=c.replace(new RegExp("\\$("+b(d)+")","gi"),"$$1"),a.trustAsHtml(c)):c}}]);var HandlebarsRendering,SHOW_ELLIPSED_NODE_MARKERS=!1;HandlebarsRendering=function(){function a(b,c){function d(a){return c?''+a+":":a+":"}var e="";return $.each(b,function(b,f){$.isArray(f)?$.each(f,function(d,f){var g={};g[b]=f,e+=a(g,c)}):e+="object"==typeof f&&null!==f?d(b)+'
'+a(f)+"
":'
'+d(b)+' 
'+f+"
"}),e}function b(a,b,c,d){var e=$(b);if(!e.data("gtLoading"))if(e.data("gtLoaded"))e.hasClass("hide")?e.removeClass("hide"):e.addClass("hide");else if(c)i(c,e),e.removeClass("hide"),e.data("gtLoaded",!0);else{e.data("gtLoading",!0);var f,g;setTimeout(function(){f||(g=Glowroot.showSpinner(a.parent().find(".gt-trace-detail-spinner")))},100),$.get(d).done(function(a){a.overwritten?e.find(".gt-profile").html('
The profile has expired, see Configuration > Storage > Trace detail data
'):a.expired?e.find(".gt-profile").html.append('
This trace has expired
'):i(a,e),e.removeClass("hide")}).fail(function(){e.find(".gt-profile").html('
An error occurred retrieving the profile
'),e.removeClass("hide")}).always(function(){f=!0,g&&g.stop(),e.data("gtLoading",!1),e.data("gtLoaded",!0)})}}function c(){$("body").prepend('o');var a=$("#bodyFontCharWidth").width();o=($("#sps").width()-170)/a,o=Math.max(o,80)}function d(a){function b(a,d){var e,f;for(e=0;e';for(f=a.length-1;f>=0&&!(i=a[f].startOffsetNanos);f--);var k=l(i/1e6).length/2+p;for(f=b;f",$("#sps").append(j),b+100 [0-9]+ rows?$/,""),i=h.replace(/ \[.*?]$/,""),j=SqlPrettyPrinter.format(i);if("object"==typeof j)window.console&&(console.log(j.message),console.log(i));else{var k=g.substring(h.length),l=h.substring(i.length),m="jdbc execution:\n\n";m+=''+j+"",l&&(m+='\n\nparameters:\n\n '+l+""),k&&(m+='\n\nrows:\n\n '+k+""),b.css("padding-bottom","10px");var n=b.find(".gt-clip");n.css("top","10px"),n.css("right","10px");var o=b.find(".gt-pre-wrap");o.html(m),o.css("min-width",.6*c.parent().width())}}b.data("gtExpandedPreviously",!0)}c.toggleClass("hide"),b.toggleClass("hide"),b.width()>=b.parent().width()&&b.css("display","block"),c.hasClass("hide")?(b.attr("tabindex",-1),b.css("outline","none"),b.focus()):(c.attr("tabindex",-1),c.css("outline","none"),c.focus())}function g(a,b,c){return c?void f(a):void(Math.abs(b.pageX-q)>5||Math.abs(b.pageY-r)>5||f(a))}function h(a){return Handlebars.Utils.escapeExpression(a)}function i(a,b){function c(){function a(c){if(c.id=b++,c.childNodes){var d;for(d=0;d"+h(a.substring(e[0],e[1]))+""+d(a.substring(e[1]))}function e(c,f){function g(a){var b,c=a.toUpperCase();for(b=0;b1&&j===h.length-1&&$("#gtProfileNodeTextUnexpanded"+m.id).html(o)}var p=m.filteredSampleCount/a.unfilteredSampleCount*100;if($("#gtProfileNodePercent"+m.id).text(n(p)+"%"),$("#gtProfileNode"+m.id).show(),h.length>1){var q=$("#gtProfileNodeText"+m.id).parent(),r=$("#gtProfileNodeText"+m.id).parent().parent(),t=r.find(".gt-unexpanded-content");l&&b.length?(t.addClass("hide"),q.removeClass("hide")):(t.removeClass("hide"),q.addClass("hide"))}return m.leafThreadState&&$("#gtProfileNodeThreadState"+m.id).html(d(m.leafThreadState)),m.filteredSampleCount}var g,i=[];for(g=0;g';j+='';var k=g/a.unfilteredSampleCount*100;if(j+=n(k),j+="% ",1===i.length?(j+='... ',j+='',j+=''+h(d.stackTraceElement),j+="
"):(j+="",j+='',j+='... ',j+='',j+=h(i[i.length-1].stackTraceElement)+"
",j+='... ',j+='',$.each(i,function(a,b){j+=''+h(b.stackTraceElement)+"
"}),j+="

"),d.leafThreadState&&(j+='',j+='... ',j+='',j+=h(d.leafThreadState),j+="
"),d.childNodes){var l=d.childNodes;l.sort(function(a,c){return b?(c.timerCounts[b]||0)-(a.timerCounts[b]||0):c.sampleCount-a.sampleCount});for(var m=0;m',j+='',j+='... ',j+='(one or more branches ~ ',j+=n(o),j+="%)
"}return SHOW_ELLIPSED_NODE_MARKERS||d.childNodes||d.leafThreadState||(j+='
',j+='',j+='... ',j+='(truncated branches)',j+="
"),j+=""}return f.childNodes?c(f,0):""}var f={stackTraceElement:"",sampleCount:0,ellipsedSampleCount:0,childNodes:[]};$.each(a.rootNodes,function(a,b){f.sampleCount+=b.sampleCount,f.ellipsedSampleCount+=b.ellipsedSampleCount,(!b.ellipsedSampleCount||b.sampleCount>b.ellipsedSampleCount)&&f.childNodes.push(b)}),f.childNodes&&1===f.childNodes.length&&!f.ellipsedSampleCount?f=f.childNodes[0]:f.stackTraceElement=s;var g=$(b);c();var i=e();g.find(".gt-profile").html(i);var k,l=j(f,[]),m=g.find(".gt-profile-text-filter"),o=g.find(".gt-profile-text-filter-refresh"),p=g.find(".gt-profile-text-filter-help");m.off("input.gtProfileFilter"),o.length||m.on("input.gtProfileFilter",function(){clearTimeout(k),k=setTimeout(function(){var a=m.val();d(a?[a]:[])},50)});var q=m.val(),r=gtParseIncludesExcludes(q);r.error||!r.includes.length&&!r.excludes.length||(d(r.includes,!0),g.data("gtTextFilterOverride",!0));var t=g.find(".gt-profile-filter"),u=t.parent().find(".gt-profile-view-toggle");if(!$.isEmptyObject(l)){if(!m.val()){var v={name:"",childNodes:{}};$.each(f.timerCounts,function(a){if(a.match(/ \/ other$/)){var b=a.split(" / "),c=v,d="";$.each(b,function(a,b){a>0&&(d+=" / "),d+=b,c.childNodes[b]||(c.childNodes[b]={name:d,childNodes:{}}),c=c.childNodes[b]})}});var w=function(a){var b=[a],c=[];return $.each(a.childNodes,function(a,b){c.push(b)}),c.sort(function(a,b){return f.timerCounts[b.name]-f.timerCounts[a.name]}),1===c.length&&c[0].name.match(/ \/ other$/)?b:($.each(c,function(a,c){b=b.concat(w(c))}),b)},x=w(v);if(1===Object.keys(v.childNodes).length)x.splice(0,1);else{var y=0;$.each(v.childNodes,function(a,b){y+=f.timerCounts[b.name]}),f.timerCounts[v.name]=y}t.html(""),$.each(x,function(a,b){var c=b.name||s;t.append($("
')}),f.html('
'),e=Glowroot.showSpinner(f.children().first())}return{displayModal:c}}]),glowroot.factory("confirmIfHasChanges",["$rootScope","$location","modals",function(a,b,c){return function(d){var e;return function(f,g){if((!a.layout.adminPasswordEnabled||"admin"===a.authenticatedUser)&&!d.httpError&&!e&&d.hasChanges()){f.preventDefault();var h=$("#confirmationModal");h.find(".modal-header h3").text("You have unsaved changes"),h.find(".modal-body p").text("Are you sure you want to navigate away from this page?"),c.display("#confirmationModal",!0),$("#confirmationModalButton").off("click"),$("#confirmationModalButton").on("click",function(){a.$apply(function(){e=!0,$("#confirmationModal").modal("hide"),b.$$parse(g)})})}}}}]),glowroot.factory("httpErrors",[function(){function a(a,b){if(0===b||-1===b)return{headline:"Unable to connect to server"};var c=a.message;return c||a.stackTrace||(c=a),{headline:"An error occurred",message:c,stackTrace:a.stackTrace}}return{get:a,handler:function(b,c){return c?function(d,e){403===e?c.reject("You don't have permission for this action"):412===e?c.reject("Someone else has updated the data on this page, please reload and try again"):(b.httpError=a(d,e),b.$on("$locationChangeSuccess",function(){b.httpError=void 0}),c.reject(b.httpError.headline))}:function(c,d){b.httpError=a(c,d),b.$on("$locationChangeSuccess",function(){b.httpError=void 0})}}}}]),glowroot.factory("login",["$location",function(a){var b,c;return{goToLogin:function(d,e){c=d,b=e?"/":a.path(),"/login"!==b&&a.path("/login").replace()},getMessage:function(){return c},returnToOriginalPath:function(){b&&"/login"!==b?a.path(b).replace():a.path("/").replace()}}}]),glowroot.factory("charts",["$http","$location","$rootScope","keyedColorPools","queryStrings","httpErrors",function(a,b,c,d,e,f){function g(){return{plot:void 0,keyedColorPool:d.create()}}function h(a,b,c){c.showChartSpinner=0,b.bind("plotzoom",function(a,b,d){var e=d.amount&&d.amount<1;c.$apply(function(){var a=b.getAxes().xaxis.options.min,d=b.getAxes().xaxis.options.max;j(c,a,d,e)})}),b.bind("plotselected",function(b,d){c.$apply(function(){a.plot.clearSelection();var b=d.xaxis.from,e=d.xaxis.to;j(c,b,e,!1,!0)})}),c.zoomOut=function(){var a=c.chartFrom,b=c.chartTo,d=b-a;j(c,a-d/2,b+d/2,!0)},c.refresh=function(){c.applyLast(),c.chartRefresh++}}function i(a,b){b.$watchGroup(["containerWidth","windowHeight"],function(){a.resize(),a.setupGrid(),a.draw()})}function j(a,b,c,d,e,f){if(a.chartRefresh++,d&&a.last)return a.last=k(2*a.last),void a.applyLast();var g,h,i=l(b,c);if(d||f){g=Math.floor(b/i)*i,h=Math.ceil(c/i)*i;var j=l(g,h);j!==i&&(g=Math.floor(b/j)*j,h=Math.ceil(c/j)*j)}else g=Math.ceil(b/i)*i,h=Math.floor(c/i)*i,g>=h&&(c-h>g-b?(g=Math.floor(b/i)*i,h=g+i):(h=Math.ceil(c/i)*i,g=h-i));var m=(new Date).getTime();if(h>m||c>m){if(!d&&!e&&a.last)return a.last=k(a.last/2),void a.applyLast();a.last=k(m-g,e),a.applyLast()}else a.chartFrom=g,a.chartTo=h,a.last=0}function k(a,b){var c=36e5,d=24*c;if(a>d)return b?Math.floor(a/c)*c:Math.ceil(a/d)*d;if(a>c&&!b)return Math.ceil(a/c)*c;var e=6e4;return b?Math.floor(a/e)*e:Math.ceil(a/e)*e}function l(a,b){var d,e=b-a,f=Date.now()-a,g=c.layout.rollupConfigs;for(d=0;df)return h.intervalMillis}return g[g.length-1].intervalMillis}function m(a,b,c,d,e){var f={grid:{minBorderMargin:0,borderColor:"#7d7358",borderWidth:1,hoverable:!0},xaxis:{mode:"time",timezone:"browser",twelveHourClock:!0,ticks:5,min:e.chartFrom,max:e.chartTo,reserveSpace:!1},yaxis:{ticks:10,zoomRange:!1,min:0,max:10,label:"milliseconds"},zoom:{interactive:!0,ctrlKey:!0,amount:2,skipDraw:!0},selection:{mode:"x"},series:{stack:!0,lines:{show:!0,fill:!0},points:{radius:8}},legend:{show:!1}};c.plot=$.plot(d,a,$.extend(!0,f,b)),c.plot.getAxes().yaxis.options.max=void 0}function n(b,c,d,g,h){var i=d.chartFrom,j=d.chartTo,k={serverRollup:d.serverRollup,transactionType:d.transactionType,transactionName:d.transactionName,from:i,to:j};g&&g(k),d.showChartSpinner++,a.get(b+e.encodeObject(k)).success(function(a){if(d.showChartSpinner--,!d.showChartSpinner){d.chartNoData=!a.dataSeries.length,h(a),c.plot.getAxes().xaxis.options.min=i,c.plot.getAxes().xaxis.options.max=j,c.dataPointIntervalMillis=l(k.from,k.to);var b=[],e=[];angular.forEach(a.dataSeries,function(a){e.push(a.name?a.name:"Other")}),c.keyedColorPool.reset(e),angular.forEach(a.dataSeries,function(a,d){var f=e[d],g={data:a.data,label:f,shortLabel:a.shortLabel,color:c.keyedColorPool.get(f),points:{fillColor:c.keyedColorPool.get(f)}};b.push(g)}),b.length?c.plot.setData(b):c.plot.setData([[]]),c.plot.setupGrid(),c.plot.draw(),o(c,d)}}).error(function(a,b){d.showChartSpinner--,f.handler(d)(a,b)})}function o(a,b){var c=a.plot.getData();b.seriesLabels=[];var d;for(d=0;d'+h+""),j+="",void 0!==c&&(j+='',j+=c,j+=" transactions",j+=""),j+="";var k,l,m,n,o,p=f.getData(),q=!1;for(k=0;k'+n+''+o+"";return q?j+="":"No data"}return{createState:g,init:h,initResize:i,plot:m,refreshData:n,renderTooltipHtml:p,updateRange:j,getDataPointIntervalMillis:l}}]),glowroot.factory("keyedColorPools",[function(){function a(a){function b(a){var b=a.toString(16);return 1===b.length?"0"+b:b}return"#"+b(a.r)+b(a.g)+b(a.b)}function b(b){if(bf&&(f+=1));var g=a(c.scale("rgb",f));return e.push(g),g}function c(){function a(){for(var a=0;a":a.headerDisplay=f,a.shortName=g,a.defaultSummarySortOrder=h,a.hideServerRollupDropdown=function(){return!a.layout.central||1===a.layout.serverRollups.length},a.hideTransactionTypeDropdown=function(){var b=a.layout.serverRollups[a.serverRollup];if(!b)return!0;var c=b.transactionTypes;return c?1===c.length&&c[0]===a.transactionType?!0:!1:!0},a.headerQueryString=function(b,c){var e={};a.layout.central&&(e["server-rollup"]=b);var f=a.layout.serverRollups[b].transactionTypes;return 0===f.length?e["transaction-type"]="":-1!==f.indexOf(c)?e["transaction-type"]=c:-1!==f.indexOf(a.layout.defaultTransactionType)?e["transaction-type"]=a.layout.defaultTransactionType:e["transaction-type"]=f[0],a.last?144e5!==a.last&&(e.last=a.last):(e.from=a.chartFrom,e.to=a.chartTo),d.encodeObject(e)},a.applyLast=function(){if(a.last){var b=e.getDataPointIntervalMillis(0,1.1*a.last),c=moment().startOf("second").valueOf(),d=c-a.last,f=c+a.last/10,g=Math.floor(d/b)*b,h=Math.ceil(f/b)*b,i=e.getDataPointIntervalMillis(g,h);i!==b&&(g=Math.floor(d/i)*i,h=Math.ceil(f/i)*i),a.chartFrom=g,a.chartTo=h}},c(function(){a.$on("$locationChangeSuccess",i)}),i(),a.$watchGroup(["last","chartFrom","chartTo","summarySortOrder"],function(c,d){c!==d&&b.search(a.buildQueryObject())}),a.tabQueryString=function(){return d.encodeObject(a.buildQueryObject({}))},a.buildQueryObject=function(c){var d=c||angular.copy(b.search());return a.layout.central&&(d["server-rollup"]=a.serverRollup),d["transaction-type"]=a.transactionType,d["transaction-name"]=a.transactionName,a.last?144e5!==a.last&&(d.last=a.last,delete d.from,delete d.to):(d.from=a.chartFrom,d.to=a.chartTo,delete d.last),a.summarySortOrder!==a.defaultSummarySortOrder?d["summary-sort-order"]=a.summarySortOrder:delete d["summary-sort-order"],d},a.currentTabUrl=function(){return b.path().substring(1)}}]),glowroot.controller("TransactionSidebarCtrl",["$scope","$location","$http","$timeout","queryStrings","httpErrors","summarySortOrders","summaryValueFn",function(a,b,c,d,e,f,g,h){function i(b,d){var g={serverRollup:a.serverRollup,transactionType:a.transactionType,from:a.chartFrom,to:a.chartTo,sortOrder:a.summarySortOrder,limit:a.summaryLimit};b?a.summariesLoadingInitial=!0:d?a.summariesLoadingMore++:a.summariesRefreshing++,l++,c.get(a.backendSummariesUrl+e.encodeObject(g)).success(function(c){b?a.summariesLoadingInitial=!1:d?a.summariesLoadingMore--:a.summariesRefreshing--,l--,l||(j=g.sortOrder,k=g.to-g.from,a.summariesNoData=!c.transactions.length,a.overallSummary=c.overall,a.transactionSummaries=c.transactions,a.moreSummariesAvailable=c.moreAvailable)}).error(function(c,e){b?a.summariesLoadingInitial=!1:d?a.summariesLoadingMore--:a.summariesRefreshing--,f.handler(a)(c,e)})}var j,k,l=0;a.summarySortOrders=g,a.backendSummariesUrl="backend/"+a.shortName+"/summaries",a.summaryLimit=10,a.summariesLoadingMore=0,a.summariesRefreshing=0,a.overallSummaryValue=function(){return a.overallSummary?h(a.overallSummary,j,a.overallSummary,k):void 0},a.transactionSummaryValue=function(b){return h(b,j,a.overallSummary,k)},a.sidebarQueryString=function(a){var c=angular.copy(b.search());return c["transaction-name"]=a,e.encodeObject(c)},a.showMoreSummaries=function(){a.summaryLimit*=2,i(!1,!0)},a.refreshActiveItem=function(){a.$parent.chartRefresh++},a.$watchGroup(["chartFrom","chartTo","summarySortOrder","chartRefresh"],function(a,b){a!==b&&d(function(){i()},100)}),a.$on("$stateChangeStart",function(){var a=document.activeElement;if(a&&$(a).closest(".gt-sidebar").length){var c=a.getAttribute("gt-url");c&&c!==b.url()&&a.blur()}}),d(function(){i(!0)},100)}]),glowroot.controller("TransactionTabCtrl",["$scope","$location","$http","$timeout","queryStrings","httpErrors","shortName",function(a,b,c,d,e,f,g){function h(){var b={serverRollup:a.serverRollup,transactionType:a.transactionType,transactionName:a.transactionName,from:a.chartFrom,to:a.chartTo};j++,c.get("backend/"+g+"/tab-bar-data"+e.encodeObject(b)).success(function(b){j--,j||("traces"!==a.activeTabItem&&(i=void 0),a.tabBarData=b)}).error(f.handler(a))}var i,j=0;a.$watchGroup(["chartFrom","chartTo","transactionName","chartRefresh"],function(a,b){a!==b&&d(function(){h()},100)}),a.$on("updateTraceTabCount",function(a,b){i=b}),a.traceCount=function(){return a.tabBarData?void 0!==i?i:a.tabBarData.traceCount:"..."},a.clickTab=function(b,c){return b!==a.activeTabItem||c.ctrlKey?void 0:(a.$parent.chartRefresh++,c.preventDefault(),!1)},a.keydownTab=function(a,b,c){37!==c.which||c.altKey||c.ctrlKey||!a?39!==c.which||c.altKey||c.ctrlKey||!b||(c.preventDefault(),d(function(){var a=$("#"+b);a.click(),a.focus()})):(c.preventDefault(),d(function(){var b=$("#"+a);b.click(),b.focus()}))},a.$on("$stateChangeStart",function(){var a=document.activeElement;if(a&&$(a).closest(".gt-transaction-tabs").length){var c=a.getAttribute("ng-href");c&&c!==b.url().substring(1)&&a.blur()}}),d(function(){h()},100)}]),glowroot.controller("TransactionAverageCtrl",["$scope","$location","charts",function(a,b,c){function d(){c.refreshData("backend/transaction/average",h,a,void 0,e)}function e(b){var c=b.mergedAggregate.rootTimers;if(1===c.length)b.mergedAggregate.rootTimer=c[0];else{var d,e={name:"",totalNanos:0,count:0,childTimers:c};for(d=0;d';return j+='
',j+=e(g),j+=" to ",j+=e(i),j+="
",j+="
",j+=c("gtMillis")(f),j+=" transactions per minute",j+="
",j+=""}}};e.init(h,$("#chart"),a.$parent),e.plot([[]],i,h,$("#chart"),a.$parent),e.initResize(h.plot,a)}]),glowroot.controller("TransactionProfileCtrl",["$scope","$http","$location","queryStrings","httpErrors",function(a,b,c,d,e){function f(){var b=h;h=c.search().filter||"",void 0!==b&&h!==b&&a.$parent.chartRefresh++,a.filter=h,a.truncateBranchPercentage=c.search()["truncate-branch-percentage"]||.1}function g(){a.parsingError=void 0;var c=gtParseIncludesExcludes(a.filter);if(c.error)return a.parsingError=c.error,a.showProfile=!0,a.sampleCount=0,$("#profileOuter").removeData("gtLoaded"),void HandlebarsRendering.profileToggle(void 0,"#profileOuter",{stackTraceElement:"",sampleCount:0});var f={serverRollup:a.serverRollup,transactionType:a.transactionType,transactionName:a.transactionName,from:a.chartFrom,to:a.chartTo,include:c.includes,exclude:c.excludes,truncateBranchPercentage:a.truncateBranchPercentage};a.showSpinner++,b.get("backend/transaction/profile"+d.encodeObject(f)).success(function(b){return a.showSpinner--,b.overwritten?(a.showOverwrittenMessage=!0,void(a.showProfile=!1)):(a.showProfile=b.unfilteredSampleCount,void(a.showProfile&&(a.sampleCount=b.unfilteredSampleCount,$("#profileOuter").removeData("gtLoaded"),HandlebarsRendering.profileToggle(void 0,"#profileOuter",b))))}).error(function(b,c){a.showSpinner--,e.handler(a)(b,c)})}a.$parent.activeTabItem="profile",a.last&&a.$parent.chartRefresh++;var h;a.showProfile=!1,a.showSpinner=0,a.$watchGroup(["chartFrom","chartTo","chartRefresh"],function(){c.search("filter",a.filter||null),g()}),a.flameGraphQueryString=function(){var b={};return a.layout.central&&(b["server-rollup"]=a.serverRollup),b["transaction-type"]=a.transactionType,b["transaction-name"]=a.transactionName,a.last?144e5!==a.last&&(b.last=a.last):(b.from=a.chartFrom,b.to=a.chartTo),a.filter&&(b.filter=a.filter),d.encodeObject(b)},a.refreshButtonClick=function(){a.applyLast(),h=a.filter,a.$parent.chartRefresh++},a.$on("$locationChangeSuccess",f),f(),$(".gt-profile-text-filter").on("gtClearProfileFilter",function(b,c){a.$apply(function(){a.filter="",a.refreshButtonClick()}),c.handled=!0})}]),glowroot.controller("TracesCtrl",["$scope","$location","$http","$q","charts","httpErrors","traceModal","queryStrings","slowOnly","errorOnly",function(a,b,c,d,e,f,g,h,i,j){function k(b){var d=s.from,e=s.to,g=s.limit;s.responseTimeMillisLow?s.responseTimeMillisLow=Number(s.responseTimeMillisLow):""===s.responseTimeMillisLow&&(s.responseTimeMillisLow=0), s.responseTimeMillisHigh?s.responseTimeMillisHigh=Number(s.responseTimeMillisHigh):""===s.responseTimeMillisHigh&&(s.responseTimeMillisHigh=void 0);var k=s.responseTimeMillisLow,m=s.responseTimeMillisHigh,n=angular.copy(s);a.transactionName&&(n.transactionNameComparator="equals",n.transactionName=a.transactionName),i&&(n.slowOnly=!0),j&&(n.errorOnly=!0),n.serverRollup=a.serverRollup,a.showChartSpinner++,c.get("backend/trace/points"+h.encodeObject(n)).success(function(c){function f(a,b){var c;for(c=0;c=3e5?(b.from=a.chartFrom,b.to=a.chartTo,delete a.traceChartFrom,delete a.traceChartTo):(b.from=Math.max(b.from,a.chartFrom),b.to=Math.min(b.to,a.chartTo),a.traceChartFrom=b.from,a.traceChartTo=b.to,delete a.$parent.last)}function n(b,c,d,e){s.from=b,s.to=c,s.responseTimeMillisLow=a.filter.responseTimeMillisLow=d,s.responseTimeMillisHigh=a.filter.responseTimeMillisHigh=e,e&&0!==d?a.filterResponseTimeComparator="between":e?a.filterResponseTimeComparator="less":a.filterResponseTimeComparator="greater"}function o(){var b,c,d=r.getAxes().xaxis.options.min,e=r.getAxes().xaxis.options.max,f=r.getAxes().yaxis.options.min,g=r.getAxes().yaxis.options.realMax||Number.MAX_VALUE,h=[],i=!0;for(b=0;b=d&&k[0]<=e&&k[1]>=f&&k[1]<=g&&(h[b].push(k),i=!1)}}return a.chartNoData=i,h}function p(){var c=s;s={},s.transactionType=a.transactionType,a.traceChartFrom=Number(b.search()["trace-chart-from"]),a.traceChartTo=Number(b.search()["trace-chart-to"]),s.from=a.traceChartFrom||a.chartFrom,s.to=a.traceChartTo||a.chartTo,s.responseTimeMillisLow=Number(b.search()["response-time-millis-low"])||0,s.responseTimeMillisHigh=Number(b.search()["response-time-millis-high"])||void 0,s.headlineComparator=b.search()["headline-comparator"]||"begins",s.headline=b.search().headline||"",s.errorComparator=b.search()["error-comparator"]||"begins",s.error=b.search().error||"",s.userComparator=b.search()["user-comparator"]||"begins",s.user=b.search().user||"",s.attributeName=b.search()["custom-attribute-name"]||"",s.attributeValueComparator=b.search()["custom-attribute-value-comparator"]||"begins",s.attributeValue=b.search()["custom-attribute-value"]||"",s.limit=Number(b.search().limit)||v,void 0===c||angular.equals(s,c)||a.$parent.chartRefresh++,a.filter=angular.copy(s),delete a.filter.from,delete a.filter.to,0!==s.responseTimeMillisLow&&s.responseTimeMillisHigh?a.filterResponseTimeComparator="between":s.responseTimeMillisHigh?a.filterResponseTimeComparator="less":a.filterResponseTimeComparator="greater";var d=b.search()["modal-server-id"]||"",e=b.search()["modal-trace-id"];e?(t=e,$("#traceModal").data("location-query",["modal-server-id","modal-trace-id"]),g.displayModal(d,e)):$("#traceModal").modal("hide")}function q(){var c=a.buildQueryObject({});a.traceChartFrom&&(c["trace-chart-from"]=a.traceChartFrom),a.traceChartTo&&(c["trace-chart-to"]=a.traceChartTo),Number(s.responseTimeMillisLow)&&(c["response-time-millis-low"]=s.responseTimeMillisLow),Number(s.responseTimeMillisHigh)&&(c["response-time-millis-high"]=s.responseTimeMillisHigh),s.headline&&(c["headline-comparator"]=s.headlineComparator,c.headline=s.headline),s.error&&(c["error-comparator"]=s.errorComparator,c.error=s.error),s.user&&(c["user-comparator"]=s.userComparator,c.user=s.user),s.attributeName&&(c["custom-attribute-name"]=s.attributeName),s.attributeValue&&(c["custom-attribute-value-comparator"]=s.attributeValueComparator,c["custom-attribute-value"]=s.attributeValue),Number(s.limit)!==v&&(c.limit=s.limit),c["modal-server-id"]=b.search()["modal-server-id"],c["modal-trace-id"]=b.search()["modal-trace-id"],b.search(c)}a.$parent.activeTabItem="traces",a.last&&a.$parent.chartRefresh++;var r,s,t,u=$("#chart"),v=500;a.showChartSpinner=0,a.showErrorFilter=j,a.filterLimitOptions=[{text:"100",value:100},{text:"200",value:200},{text:"500",value:500},{text:"1,000",value:1e3},{text:"2,000",value:2e3},{text:"5,000",value:5e3}],a.$watchGroup(["chartFrom","chartTo","chartRefresh"],function(){return s.from=a.traceChartFrom||a.chartFrom,s.to=a.traceChartTo||a.chartTo,q(),a.suppressChartRefresh?void(a.suppressChartRefresh=!1):void k()}),a.refreshButtonClick=function(){a.applyLast(),angular.extend(s,a.filter),a.$parent.chartRefresh++},a.clearCriteria=function(){a.filter.responseTimeMillisLow=0,a.filter.responseTimeMillisHigh=void 0,a.filterResponseTimeComparator="greater",a.filter.headlineComparator="begins",a.filter.headline="",a.filter.errorComparator="begins",a.filter.error="",a.filter.userComparator="begins",a.filter.user="",a.filter.attributeName="",a.filter.attributeValueComparator="begins",a.filter.attributeValue="",a.filter.limit=v,a.refreshButtonClick()},u.bind("plotzoom",function(b,c,d){var f=d.amount&&d.amount<1;a.$apply(function(){var b={from:c.getAxes().xaxis.options.min,to:c.getAxes().xaxis.options.max};if(e.updateRange(a.$parent,b.from,b.to,f),m(b),f?n(b.from,b.to,0,void 0):(s.from=b.from,s.to=b.to),f||a.chartLimitExceeded)q();else{a.suppressChartRefresh=!0;var d=o();c.setData(d),c.setupGrid(),c.draw(),l(),q()}})}),u.bind("plotselected",function(b,c){a.$apply(function(){r.clearSelection();var b={from:c.xaxis.from,to:c.xaxis.to};e.updateRange(a.$parent,b.from,b.to,!1,!0,!0),m(b),n(b.from,b.to,c.yaxis.from,c.yaxis.to),a.chartLimitExceeded?q():(a.suppressChartRefresh=!0,r.getAxes().xaxis.options.min=b.from,r.getAxes().xaxis.options.max=b.to,r.getAxes().yaxis.options.min=c.yaxis.from,r.getAxes().yaxis.options.realMax=c.yaxis.to,r.setData(o()),r.setupGrid(),r.draw(),l(),q())})}),a.zoomOut=function(){var b=a.chartFrom,c=a.chartTo,d=c-b,f={from:b-d/2,to:c+d/2};e.updateRange(a.$parent,f.from,f.to,!0),m(f),a.traceChartFrom&&a.traceChartTo&&(a.traceChartFrom=Math.max(f.from,a.chartFrom),a.traceChartTo=Math.min(f.to,a.chartTo))},u.bind("plotclick",function(c,d,e,f){if(e){r.unhighlight(),r.highlight(e.series,e.datapoint);var g=r.getData()[e.seriesIndex].data[e.dataIndex][2],h=r.getData()[e.seriesIndex].data[e.dataIndex][3];if(f.ctrlKey){var i=b.url();i+=-1===i.indexOf("?")?"?":"&",g&&(i+="modal-server-id="+g+"&"),i+="modal-trace-id="+h,window.open(i)}else a.$apply(function(){g&&b.search("modal-server-id",g),b.search("modal-trace-id",h)});t=2===e.seriesIndex?h:null}}),a.filterResponseTimeComparatorOptions=[{display:"Greater than",value:"greater"},{display:"Less than",value:"less"},{display:"Between",value:"between"}],a.filterTextComparatorOptions=[{display:"Begins with",value:"begins"},{display:"Equals",value:"equals"},{display:"Ends with",value:"ends"},{display:"Contains",value:"contains"},{display:"Does not contain",value:"not-contains"}],a.$on("$locationChangeSuccess",p),p(),a.$watch("filterResponseTimeComparator",function(b){"greater"===b?a.filter.responseTimeMillisHigh=void 0:"less"===b&&(a.filter.responseTimeMillisLow=0)}),function(){var a={legend:{show:!1},series:{points:{show:!0}},grid:{hoverable:!0,clickable:!0,minBorderMargin:0,borderColor:"#7d7358",borderWidth:1},xaxis:{mode:"time",timezone:"browser",twelveHourClock:!0,ticks:5,borderGridLock:1e3,min:s.from,max:s.to,reserveSpace:!1},yaxis:{ticks:10,zoomRange:!1,borderGridLock:1,min:0,max:10,label:"milliseconds"},zoom:{interactive:!0,ctrlKey:!0,amount:2,skipDraw:!0},colors:[$("#offscreenNormalColor").css("border-top-color"),$("#offscreenErrorColor").css("border-top-color"),$("#offscreenActiveColor").css("border-top-color")],selection:{mode:"xy"}};r=$.plot(u,[[]],a)}(),r.getAxes().yaxis.options.max=void 0,e.initResize(r,a)}]),glowroot.controller("TransactionQueriesCtrl",["$scope","$http","$location","$timeout","modals","queryStrings","httpErrors",function(a,b,c,d,e,f,g){function h(){a.sortAttribute=c.search()["sort-attribute"]||"total-time",a.sortReverse="asc"===c.search()["sort-direction"],"total-time"===a.sortAttribute?a.sortAttr="-totalNanos":"execution-count"===a.sortAttribute?a.sortAttr="-executionCount":"time-per-execution"===a.sortAttribute?a.sortAttr="-timePerExecution":"rows-per-execution"===a.sortAttribute&&(a.sortAttr="-rowsPerExecution")}function i(){var c={serverRollup:a.serverRollup,transactionType:a.transactionType,transactionName:a.transactionName,from:a.chartFrom,to:a.chartTo};a.showSpinner++,b.get("backend/transaction/queries"+f.encodeObject(c)).success(function(b){return a.showSpinner--,b.overwritten?(a.showOverwrittenMessage=!0,a.showQueries=!1,void(a.queries=[])):(a.showQueries=b.length,a.queries=b,void angular.forEach(a.queries,function(a){a.timePerExecution=a.totalNanos/(1e6*a.executionCount),a.rowsPerExecution=a.totalRows/a.executionCount}))}).error(function(b,c){a.showSpinner--,g.handler(a)(b,c)})}a.$parent.activeTabItem="queries",a.last&&a.$parent.chartRefresh++,a.showQueries=!1,a.showSpinner=0,a.$watchGroup(["chartFrom","chartTo","chartRefresh"],function(){i()}),a.sort=function(){c.search("sort-attribute",null),c.search("sort-direction",null)},a.sortQueryString=function(b){var c=a.buildQueryObject({});return"total-time"!==b&&(c["sort-attribute"]=b),a.sortAttribute!==b||a.sortReverse||(c["sort-direction"]="asc"),f.encodeObject(c)},a.sortIconClass=function(b){return a.sortAttribute!==b?"":a.sortReverse?"caret gt-caret-reversed":"caret"},a.$on("$locationChangeSuccess",h),h(),a.showQueryModal=function(b){var c=$("#queryModal .modal-dialog");c.removeAttr("style");var d=$("#queryModal button.close");d.removeAttr("style");var f=$("#queryModal .fa-clipboard");f.removeAttr("style");var g=$("#unformattedQuery"),h=$("#formattedQuery");if(g.text(""),h.html(""),a.unformattedQuery=b.queryText,a.formattedQuery="",a.showFormatted=!1,g.text(a.unformattedQuery),g.show(),h.hide(),gtClipboard(f,function(){return a.showFormatted?h[0]:g[0]},function(){return a.showFormatted?a.formattedQuery:a.unformattedQuery}),"SQL"!==b.queryType)return void e.display("#queryModal");var i=SqlPrettyPrinter.format(b.queryText);if("object"==typeof i)return window.console&&(console.log(i.message),console.log(b.queryText)),void e.display("#queryModal");a.formattedQuery=i,a.showFormatted=!0,h.html(a.formattedQuery),g.hide(),h.show(),e.display("#queryModal");var j=Math.max(h.width()+80,500),k=h.height()+141,l=j>$(window).width()-50;l&&(k+=17);var m=k>$(window).height()-50;if(j",value:b.totalSampleCount,children:b.rootNodes},d++);var e=d3.flameGraph().height(18*d).width(960).cellHeight(18).tooltip(!0).tooltipDirection("s").tooltipOffset([8,0]).transitionDuration(750).transitionEase("cubic-in-out").title("");d3.select("#chart").datum(c).call(e)}}).error(d.handler(a))}}]),glowroot.controller("ErrorMessagesCtrl",["$scope","$http","$location","charts","queryStrings","httpErrors",function(a,b,c,d,e,f){function g(c){a.parsingError=void 0;var g=gtParseIncludesExcludes(a.filter);if(g.error)return void(a.parsingError=g.error);var h={serverRollup:a.serverRollup,transactionType:a.transactionType,transactionName:a.transactionName,from:a.chartFrom,to:a.chartTo,include:g.includes,exclude:g.excludes,errorMessageLimit:l};c?a.showChartOverlay++:a.showChartSpinner++,b.get("backend/error/messages"+e.encodeObject(h)).success(function(b){c?a.showChartOverlay--:a.showChartSpinner--,a.showChartOverlay||a.showChartSpinner||(a.chartNoData=!b.dataSeries.data.length,j.plot.getAxes().xaxis.options.min=h.from,j.plot.getAxes().xaxis.options.max=h.to,j.dataPointIntervalMillis=d.getDataPointIntervalMillis(h.from,h.to),b.dataSeries.data.length?j.plot.setData([{data:b.dataSeries.data}]):j.plot.setData([[]]),j.plot.setupGrid(),j.plot.draw(),k=b.dataSeriesExtra,a.moreErrorMessagesAvailable=b.moreErrorMessagesAvailable,a.errorMessages=b.errorMessages,c&&c.resolve())}).error(function(b,d){c?a.showChartOverlay--:a.showChartSpinner--,f.handler(a,c)(b,d)})}function h(){var b=i;i=c.search().filter||"",void 0!==b&&i!==b&&a.$parent.chartRefresh++,a.filter=i}a.$parent.activeTabItem="messages",a.last&&a.$parent.chartRefresh++;var i,j=d.createState();a.showChartOverlay=0,a.showChartSpinner=0;var k,l=25;a.$watchGroup(["chartFrom","chartTo","chartRefresh"],function(){c.search("filter",a.filter||null),g()}),a.tracesQueryString=function(b){var c={};return a.layout.central&&(c["server-rollup"]=a.serverRollup),c["transaction-type"]=a.transactionType,c["transaction-name"]=a.transactionName,c.from=a.chartFrom,c.to=a.chartTo,b.message.length<=1e3?(c.errorComparator="equals",c.error=b.message):(c.errorComparator="begins",c.error=b.message.substring(0,1e3)),e.encodeObject(c)},a.showMoreErrorMessages=function(a){l*=2,g(a)},a.refreshButtonClick=function(){a.applyLast(),i=a.filter,a.$parent.chartRefresh++},a.$on("$locationChangeSuccess",h),h();var m={yaxis:{max:100,label:"error percentage"},tooltip:!0,tooltipOpts:{content:function(a,b,c){function d(a){return a%6e4===0?moment(a).format("LT"):moment(a).format("LTS")}if(0===c&&!k[b])return"No errors";var e=b-j.dataPointIntervalMillis;e=Math.ceil(e/j.dataPointIntervalMillis)*j.dataPointIntervalMillis;var f=b,g='
'+d(e)+" to "+d(f)+"
Error percentage: "+c.toFixed(1)+"
Error count: "+k[b][0]+"
Transaction count: "+k[b][1]+"
";return g}}};d.init(j,$("#chart"),a.$parent),d.plot([[]],m,j,$("#chart"),a.$parent),d.initResize(j.plot,a)}]),glowroot.controller("JvmCtrl",["$scope","$location",function(a,b){document.title="JVM · Glowroot",a.$parent.activeNavbarItem="jvm",a.$on("$stateChangeStart",function(){if(document.activeElement){var a=document.activeElement.getAttribute("gt-url");a&&a!==b.path().substring(1)&&document.activeElement.blur()}})}]),glowroot.controller("JvmGaugeValuesCtrl",["$scope","$location","$filter","$http","$timeout","charts","keyedColorPools","queryStrings","httpErrors",function(a,b,c,d,e,f,g,h,i){function j(){f.refreshData("backend/jvm/gauge-values",w,a,k,l)}function k(b){b.gaugeNames=a.gaugeNames}function l(a){var b,c,d,e;for(b=0;b=a*b*10;)b*=10;return b=parseFloat(b.toPrecision(1))}function o(a){y={},x={},z={};for(var b=0;bd&&(d=e)}var f=n(d);if(1!==f)for(b=0;ba?parseFloat(a.toPrecision(6)):Math.round(a),c("number")(b)}var v=["java.lang:type=Memory:HeapMemoryUsage/used"],w=f.createState(),x={},y={},z={},A={},B={};a.gaugeFilter="",a.currentTabUrl=function(){return"jvm/gauges"},a.$watch("[last, chartFrom, chartTo, gaugeNames, chartRefresh]",function(c,d){c!==d&&(b.search(a.buildQueryObject()),a.gaugeNames.length?j():(j(),a.chartNoData=!0))},!0),a.$watch("seriesLabels",function(a,b){if(a!==b){var c;for(c=0;ce;e++)b+="0";return b+"1"},a.clickGaugeName=function(b){var c=a.gaugeNames.indexOf(b);-1===c?a.gaugeNames.push(b):(a.gaugeNames.splice(c,1),delete y[b])},a.showingAllGauges=function(){if(!a.allGauges)return!0;var b=c("filter")(a.allGauges,{display:a.gaugeFilter});return b.length===a.allGauges.length},a.selectAllGauges=function(){var b=c("filter")(a.allGauges,{display:a.gaugeFilter});angular.forEach(b,function(b){var c=a.gaugeNames.indexOf(b.name);-1===c&&a.gaugeNames.push(b.name)})},a.deselectAllGauges=function(){var b=c("filter")(a.allGauges,{display:a.gaugeFilter});angular.forEach(b,function(b){var c=a.gaugeNames.indexOf(b.name);-1!==c&&a.gaugeNames.splice(c,1)})};var D={tooltip:!0,yaxis:{label:""},series:{stack:!1,lines:{fill:!1}},tooltipOpts:{content:function(b,d,e,g){function h(a){var b="";return a.match(/java.lang:type=Memory:(Non)?HeapMemoryUsage\/(init|used|committed|max)/)&&(b=" bytes"),a.match(/java.lang:type=OperatingSystem:(Free|Total)(Physical|Swap)MemorySize/)&&(b=" bytes"),a.match(/java.lang:type=Runtime:Uptime/)&&(b=" milliseconds"),a.match(/java.lang:type=Threading:CurrentThread(Cpu|User)Time/)&&(b=" nanoseconds"),a.match(/java.lang:type=MemoryPool,name=[a-zA-Z0-9 ]+:(Peak)?Usage\/(init|used|committed|max)/)&&(b=" bytes"),a.match(/java.lang:type=GarbageCollector,name=[a-zA-Z0-9 ]+:LastGcInfo\/duration/)&&(b=" milliseconds"),a.match(/java.lang:type=GarbageCollector,name=[a-zA-Z0-9 ]+:CollectionTime/)&&(b=" milliseconds"),a.match(/java.lang:type=Compilation:TotalCompilationTime/)&&(b=" milliseconds"),B[a]&&(b+=" per second"),b}var i=a.layout.rollupConfigs[0];if(f.getDataPointIntervalMillis(a.chartFrom,a.chartTo)===i.intervalMillis&&a.chartTo-a.chartFrom';return k+=''+A[b],k+='Time:',k+=moment(d).format("h:mm:ss.SSS a (Z)")+"",k+='Value:',k+=c("number")(j)+h(b)+"",k+=""}var l=d-w.dataPointIntervalMillis;l=Math.ceil(l/w.dataPointIntervalMillis)*w.dataPointIntervalMillis;var m=d;return f.renderTooltipHtml(l,m,void 0,g.dataIndex,g.seriesIndex,w.plot,function(a,b){var c=x[b][d];return u(c)+h(b)}," (average value over this interval)")}}};f.init(w,$("#chart"),a),f.plot([[]],D,w,$("#chart"),a),f.initResize(w.plot,a),m()}]),glowroot.controller("JvmProcessInfoCtrl",["$scope","$http","httpErrors",function(a,b,c){b.get("backend/jvm/process-info?server-id="+a.serverId).success(function(b){a.loaded=!0,a.data=b}).error(c.handler(a))}]),glowroot.controller("JvmThreadDumpCtrl",["$scope","$http","$location","$q","traceModal","httpErrors",function(a,b,c,d,e,f){function g(){var b=c.search()["modal-trace-id"];b?($("#traceModal").data("location-query","modal-trace-id"),e.displayModal(a.serverId,b)):$("#traceModal").modal("hide")}var h;Handlebars.registerHelper("ifBlocked",function(a,b){return"BLOCKED"===a?b.fn(this):b.inverse(this)}),Handlebars.registerHelper("ifWaiting",function(a,b){return"WAITING"===a||"TIMED_WAITING"===a?b.fn(this):b.inverse(this)}),a.exportAsText=function(){var a=window.open(),b=h.replace(/ ]*>view trace<\/a>/g,"");$(a.document.body).html("
"+b+"
")},a.$on("$locationChangeSuccess",g),g(),a.refresh=function(c){b.get("backend/jvm/thread-dump?server-id="+a.serverId).success(function(b){a.loaded=!0,h=$.trim(JST["thread-dump"](b)),$("#threadDump").html("
"+h),c&&c.resolve("Refreshed")}).error(f.handler(a,c))},a.refresh()}]),glowroot.controller("JvmHeapDumpCtrl",["$scope","$http","httpErrors",function(a,b,c){a.checkDiskSpace=function(d){var e={serverId:a.serverId,directory:a.directory};a.availableDiskSpace=!1,a.heapDumpResponse=!1,b.post("backend/jvm/available-disk-space",e).success(function(b){b.error?d.reject(b.error):(a.availableDiskSpace=b,d.resolve("See disk space below"))}).error(c.handler(a,d))},a.heapDump=function(d){var e={serverId:a.serverId,directory:a.directory};a.availableDiskSpace=!1,a.heapDumpResponse=!1,b.post("backend/jvm/heap-dump",e).success(function(b){b.error?d.reject(b.error):(d.resolve("Heap dump created"),a.heapDumpResponse=b)}).error(c.handler(a,d))},b.get("backend/jvm/heap-dump-default-dir?server-id="+a.serverId).success(function(b){a.loaded=!0,a.directory=b}).error(c.handler(a))}]),glowroot.controller("JvmMBeanTreeCtrl",["$scope","$location","$http","httpErrors","queryStrings",function(a,b,c,d,e){function f(){var a={expanded:g};b.search(a).replace()}var g=b.search().expanded||[];angular.isArray(g)||(g=[g]),a.toggleMBean=function(b){if(b.expanded){var h=g.indexOf(b.objectName);return g.splice(h,1),f(),b.expanded=!1,void(b.attributeMap=void 0)}g.push(b.objectName),f(),b.loading=!0,b.expanded=!0;var i={serverId:a.serverId,objectName:b.objectName};c.get("backend/jvm/mbean-attribute-map"+e.encodeObject(i)).success(function(a){b.loading=!1,b.attributeMap=a}).error(function(c,e){b.loading=!1,d.handler(a)(c,e)})},a.isSimpleValue=function(a){return!angular.isObject(a)&&!angular.isArray(a)},a.indentedJson=function(a){return JSON.stringify(a,null,4)},a.refresh=function(b){var f={serverId:a.serverId,expanded:g};c.get("backend/jvm/mbean-tree"+e.encodeObject(f)).success(function(c){a.loaded=!0,a.mbeanTree=c,b&&b.resolve("Refreshed")}).error(d.handler(a,b))},a.refresh()}]),glowroot.controller("JvmCapabilitiesCtrl",["$scope","$http","httpErrors",function(a,b,c){b.get("backend/jvm/capabilities?server-id="+a.serverId).success(function(b){a.loaded=!0,a.capabilities=b}).error(c.handler(a))}]),glowroot.controller("JvmGlowrootLogCtrl",["$scope","$http","httpErrors",function(a,b,c){a.exportAsText=function(){var b=window.open();$(b.document.body).html(a.glowrootLog.replace(/\n/g,"
").replace(/ /g," "))},a.refresh=function(d){b.get("backend/jvm/glowroot-log").success(function(b){a.loaded=!0,a.glowrootLog=b,d&&d.resolve("Refreshed")}).error(c.handler(a,d))},a.refresh()}]),glowroot.controller("ConfigCtrl",["$scope","$location",function(a,b){document.title="Configuration · Glowroot",a.$parent.activeNavbarItem="config",a.percentileSuffix=function(a){var b=String(a);if("11"===b||/\.11$/.test(b))return"th";if("12"===b||/\.12$/.test(b))return"th";if("13"===b||/\.13$/.test(b))return"th";var c=b.charAt(b.length-1);return"1"===c?"st":"2"===c?"nd":"3"===c?"rd":"th"},a.currentUrl=function(){return b.path().substring(1)},a.isAlerts=function(){return"/config/alert-list"===b.path()||"/config/alert"===b.path()||"/config/smtp"===b.path()},a.$on("$stateChangeStart",function(){if(document.activeElement){var a=document.activeElement.getAttribute("gt-url");a&&a!==b.path().substring(1)&&document.activeElement.blur()}})}]),glowroot.controller("ConfigCommonCtrl",["$scope","$http","backendUrl","confirmIfHasChanges","httpErrors",function(a,b,c,d,e){function f(b){a.loaded=!0,b.config?(a.originalData=angular.copy(b),delete a.originalData.config,a.config=b.config):a.config=b,a.originalConfig=angular.copy(a.config)}a.hasChanges=function(){return a.originalConfig&&!angular.equals(a.config,a.originalConfig)},a.$on("$locationChangeStart",d(a)),a.save=function(d){var g=angular.copy(a.config);b.post(c,g).success(function(a){f(a),d.resolve("Saved")}).error(e.handler(a,d))},b.get(c).success(f).error(e.handler(a))}]),glowroot.controller("ConfigUserRecordingCtrl",["$scope","$http","$rootScope","$location","$timeout","confirmIfHasChanges","httpErrors",function(a,b,c,d,e,f,g){function h(b){a.loaded=!0,a.config=b,a.originalConfig=angular.copy(b),a.page.users=a.config.users.join(", ")}a.page={},a.$watch("page.users",function(b){if(a.config){var c=[];angular.forEach(b.split(","),function(a){a=a.trim(),a.length&&c.push(a)}),a.config.users=c}}),a.hasChanges=function(){return a.originalConfig&&!angular.equals(a.config,a.originalConfig)},a.$on("$locationChangeStart",f(a)),a.save=function(c){var d=angular.copy(a.config);b.post("backend/config/user-recording",d).success(function(a){h(a),c.resolve("Saved")}).error(g.handler(a,c))},b.get("backend/config/user-recording").success(h).error(g.handler(a))}]),glowroot.controller("ConfigUserInterfaceCtrl",["$scope","$http","$rootScope","$location","$timeout","confirmIfHasChanges","httpErrors",function(a,b,c,d,e,f,g){function h(b){a.loaded=!0,a.config=b.config,a.originalConfig=angular.copy(b.config),a.activePort=b.activePort,a.page={},a.page.defaultDisplayedPercentiles=a.config.defaultDisplayedPercentiles.join(", ")}a.page={},a.$watch("page.defaultDisplayedPercentiles",function(b){if(a.config){var c=[];angular.forEach(b.split(","),function(a){a=a.trim(),a.length&&c.push(Number(a))}),a.config.defaultDisplayedPercentiles=c}}),a.showChangeAdminPassword=function(){return a.config&&a.config.adminPasswordEnabled&&a.originalConfig.adminPasswordEnabled},a.showChangeReadOnlyPassword=function(){return a.config&&a.config.readOnlyPasswordEnabled&&a.originalConfig.readOnlyPasswordEnabled&&a.config.adminPasswordEnabled},a.$watch("config.anonymousAccess",function(b,c){b!==c&&(a.config.adminPasswordEnabled="admin"!==b,"read-only"===b&&(a.config.readOnlyPasswordEnabled=!1))}),a.$watch("config.adminPasswordEnabled",function(b,c){b!==c&&(a.config.adminPasswordEnabled&&"admin"===a.config.anonymousAccess?a.config.anonymousAccess="none":a.config.adminPasswordEnabled||(a.config.readOnlyPasswordEnabled=!1,a.config.anonymousAccess="admin"))}),a.$watch("config.readOnlyPasswordEnabled",function(b){b&&"read-only"===a.config.anonymousAccess&&(a.config.anonymousAccess="none")}),a.hasChanges=function(){if(!a.originalConfig)return!1;if(!a.originalConfig.adminPasswordEnabled&&a.config.adminPasswordEnabled&&(!a.page.initialAdminPassword||!a.page.verifyInitialAdminPassword))return!1;if(a.originalConfig.adminPasswordEnabled&&!a.config.adminPasswordEnabled&&!a.page.verifyCurrentAdminPassword)return!1;if(a.originalConfig.adminPasswordEnabled&&a.config.adminPasswordEnabled){var b=a.page.currentAdminPassword,c=a.page.newAdminPassword,d=a.page.verifyNewAdminPassword;if((b||c||d)&&!(b&&c&&d))return!1}if(!a.originalConfig.readOnlyPasswordEnabled&&a.config.readOnlyPasswordEnabled&&(!a.page.initialReadOnlyPassword||!a.page.verifyInitialReadOnlyPassword))return!1;if(a.originalConfig.readOnlyPasswordEnabled&&a.config.readOnlyPasswordEnabled){var e=a.page.newReadOnlyPassword,f=a.page.verifyNewReadOnlyPassword;if((e||f)&&(!e||!f))return!1}return!angular.equals(a.config,a.originalConfig)||a.page.newAdminPassword||a.page.newReadOnlyPassword},a.$on("$locationChangeStart",f(a)),a.save=function(f){var i,j=angular.copy(a.config),k=!1,l=!1,m=!1;if(!a.originalConfig.adminPasswordEnabled&&a.config.adminPasswordEnabled){if(a.page.initialAdminPassword!==a.page.verifyInitialAdminPassword)return void f.reject("Passwords do not match");j.currentAdminPassword="",j.newAdminPassword=a.page.initialAdminPassword,k=!0}else if(a.originalConfig.adminPasswordEnabled&&!a.config.adminPasswordEnabled)j.currentAdminPassword=a.page.verifyCurrentAdminPassword,j.newAdminPassword="",l=!0;else if(a.originalConfig.adminPasswordEnabled&&a.config.adminPasswordEnabled&&a.page.currentAdminPassword){if(a.page.newAdminPassword!==a.page.verifyNewAdminPassword)return void f.reject("Passwords do not match");j.currentAdminPassword=a.page.currentAdminPassword,j.newAdminPassword=a.page.newAdminPassword}if(!a.originalConfig.readOnlyPasswordEnabled&&a.config.readOnlyPasswordEnabled){if(a.page.initialReadOnlyPassword!==a.page.verifyInitialReadOnlyPassword)return void f.reject("Passwords do not match"); j.newReadOnlyPassword=a.page.initialReadOnlyPassword}else if(a.originalConfig.readOnlyPasswordEnabled&&!a.config.readOnlyPasswordEnabled)j.newReadOnlyPassword="";else if(a.originalConfig.readOnlyPasswordEnabled&&a.config.readOnlyPasswordEnabled&&a.page.newReadOnlyPassword){if(a.page.newReadOnlyPassword!==a.page.verifyNewReadOnlyPassword)return void f.reject("Passwords do not match");j.newReadOnlyPassword=a.page.newReadOnlyPassword}a.originalConfig.port!==a.config.port&&(m=!0,i=a.activePort),b.post("backend/config/ui",j).success(function(a){return a.currentPasswordIncorrect?void f.reject("Current password is incorrect"):(h(a),k&&(c.authenticatedUser="admin"),l&&(c.authenticatedUser=void 0),m?m&&a.portChangeFailed?void f.reject("Save succeeded, but switching over to the new port failed"):d.port()!==i?void f.reject("The save succeeded, and switching the http listener over to the new port succeeded, but you are not being redirected to the new port since it seems you are using an intermediary proxy?"):(f.resolve("Saved, redirecting to new port ..."),void e(function(){var b=d.protocol()+"://"+d.host();80!==a.activePort&&(b+=":"+a.activePort),b+=d.path(),document.location.href=b},500)):void f.resolve("Saved"))}).error(g.handler(a,f))},b.get("backend/config/ui").success(h).error(g.handler(a))}]),glowroot.controller("ConfigStorageCtrl",["$scope","$http","$location","$timeout","confirmIfHasChanges","httpErrors",function(a,b,c,d,e,f){function g(b){a.loaded=!0,a.config=b,a.originalConfig=angular.copy(b),a.page.rollupExpirationDays=[],angular.forEach(b.rollupExpirationHours,function(b){a.page.rollupExpirationDays.push(b/24)}),a.page.traceExpirationDays=b.traceExpirationHours/24}a.page={},a.hasChanges=function(){return a.originalConfig&&!angular.equals(a.config,a.originalConfig)},a.$on("$locationChangeStart",e(a)),a.$watchCollection("page.rollupExpirationDays",function(b){a.config&&(a.config.rollupExpirationHours=[],angular.forEach(b,function(b){a.config.rollupExpirationHours.push(24*b)}))}),a.$watchCollection("page.traceExpirationDays",function(b){a.config&&(a.config.traceExpirationHours=24*b)}),a.save=function(c){b.post("backend/config/storage",a.config).success(function(a){g(a),c.resolve("Saved")}).error(f.handler(a,c))},a.defragData=function(c){b.post("backend/admin/defrag-data").success(function(){c.resolve("Defragmented")}).error(f.handler(a,c))},a.deleteAllData=function(c){b.post("backend/admin/delete-all-data",{serverRollup:a.serverRollup}).success(function(){c.resolve("Deleted")}).error(f.handler(a,c))},b.get("backend/config/storage").success(g).error(f.handler(a));var h="input:not(.gt-autofocus-ignore)";"rollup-capped-database-size"===c.hash()?h=".gt-rollup-capped-database-size input":"trace-capped-database-size"===c.hash()&&(h=".gt-trace-capped-database-size input");var i=$(".form-horizontal"),j=a.$watch(function(){return i.find(h).length&&i.find("input").first().is(":visible")},function(a){a&&(i.find(h).first().focus(),j())})}]),glowroot.controller("ConfigSmtpCtrl",["$scope","$http","modals","confirmIfHasChanges","httpErrors",function(a,b,c,d,e){function f(b){a.loaded=!0,a.config=b.config,a.originalConfig=angular.copy(b.config),b.config.passwordExists&&(a.password="********"),a.localServerName=b.localServerName}a.hasChanges=function(){return a.originalConfig&&!angular.equals(a.config,a.originalConfig)},a.$on("$locationChangeStart",d(a)),a.onPasswordChange=function(){a.config.newPassword=a.password,a.config.passwordExists=""!==a.password},a.onPasswordClick=function(){$("#password").select()},a.openTestEmailModal=function(){c.display("#sendTestEmailModal",!0)},a.sendTestEmail=function(c){var d=angular.copy(a.config);d.testEmailRecipient=a.testEmailRecipient,b.post("backend/config/send-test-email",d).success(function(){c.resolve("Sent")}).error(e.handler(a,c))},a.save=function(c){b.post("backend/config/smtp",a.config).success(function(a){f(a),c.resolve("Saved")}).error(e.handler(a,c))},b.get("backend/config/smtp").success(f).error(e.handler(a))}]),glowroot.controller("ConfigInstrumentationListCtrl",["$scope","$location","$http","$timeout","$q","httpErrors","modals",function(a,b,c,d,e,f,g){function h(b){c.get("backend/config/instrumentation").success(function(d){a.loaded=!0,a.configs=d.configs,a.dirty=d.jvmOutOfSync,a.jvmRetransformClassesSupported=d.jvmRetransformClassesSupported,b?b.resolve():c.get("backend/config/preload-classpath-cache")}).error(f.handler(a,b))}function i(){b.search().import?(a.jsonToImport="",a.importErrorMessage="",a.importing=!1,$("#importModal").data("location-query","import"),g.display("#importModal",!0),d(function(){$("#importModal textarea").focus()})):$("#importModal").modal("hide")}a.display=function(a){return a.className+"::"+a.methodName},a.displayExtra=function(a){var b=a.captureKind;return"timer"===b?"Timer":"trace-entry"===b?"Trace entry":"transaction"===b?"Transaction":"Other"},a.displayImportModal=function(){b.search("import",!0)},a.$watch("jsonToImport",function(){a.importErrorMessage=""}),a.importFromJson=function(){a.importErrorMessage="";var b;try{b=angular.fromJson(a.jsonToImport)}catch(b){return void(a.importErrorMessage="Invalid json")}var d=[];return void 0===b.className&&d.push("Missing className"),void 0===b.methodName&&d.push("Missing methodName"),void 0===b.captureKind&&d.push("Missing captureKind"),d.length?void(a.importErrorMessage=d.join(", ")):(a.importing=!0,void c.post("backend/config/instrumentation/add",b).success(function(b){if(b.errors)return a.importing=!1,void(a.importErrorMessage=b.errors.join(", "));var c=e.defer();c.promise.finally(function(){a.importing=!1,$("#importModal").modal("hide")}),h(c)}).error(function(b,c){a.importing=!1,$("#importModal").modal("hide"),f.handler(a)(b,c)}))},a.retransformClasses=function(b){c.post("backend/admin/reweave").success(function(c){if(a.dirty=!1,c.classes){var d="re-transformed "+c.classes+" class"+(c.classes>1?"es":"");b.resolve("Success ("+d+")")}else b.resolve("Success (no classes needed re-transforming)")}).error(f.handler(a,b))},h(),a.$on("$locationChangeSuccess",i),i()}]),glowroot.controller("ConfigInstrumentationCtrl",["$scope","$location","$http","$rootScope","$timeout","confirmIfHasChanges","httpErrors","queryStrings","modals",function(a,b,c,d,e,f,g,h,i){function j(b){function c(a){var b=a.lastIndexOf(".");return-1!==b?a.substring(b+1):a}if(a.config=b.config,a.originalConfig=angular.copy(b.config),b.config.className){a.heading=c(b.config.className)+"::"+b.config.methodName;var d=b.config.captureKind;a.selectedClassName=b.config.className,a.selectedMethodName=b.config.methodName,a.methodSignatures=b.methodSignatures||[],a.captureKindTransaction="transaction"===d,a.showTimer="timer"===d||"trace-entry"===d||"transaction"===d,a.showTraceEntry="trace-entry"===d||"transaction"===d,a.showTraceEntryStackThreshold="trace-entry"===d,a.methodSignatures.unshift({name:a.config.methodName,parameterTypes:[".."],returnType:"",modifiers:[]});for(var e=0;e0&&(c+=", "),c+=a.parameterTypes[b];return c+=")"},a.save=function(d){var f,h=angular.copy(a.config);f=n?"backend/config/instrumentation/update":"backend/config/instrumentation/add",c.post(f,h).success(function(a){j(a),d.resolve(n?"Saved":"Added"),n=a.version,e(function(){b.search({v:n}).replace(),e(function(){b.url("config/instrumentation-list")})})}).error(g.handler(a,d))},a.delete=function(d){var e={version:a.config.version};c.post("backend/config/instrumentation/remove",e).success(function(){o(),b.url("config/instrumentation-list").replace()}).error(g.handler(a,d))},a.exportToJson=function(){var b=angular.copy(a.config);delete b.version,b.methodReturnType||delete b.methodReturnType,b.methodModifiers.length||delete b.methodModifiers,b.timerName||delete b.timerName,b.traceEntryMessageTemplate||delete b.traceEntryMessageTemplate,b.traceEntryStackThresholdMillis||delete b.traceEntryStackThresholdMillis,b.traceEntryCaptureSelfNested||delete b.traceEntryCaptureSelfNested,b.transactionType||delete b.transactionType,b.transactionNameTemplate||delete b.transactionNameTemplate,b.transactionSlowThresholdMillis||delete b.transactionSlowThresholdMillis,b.transactionUserTemplate||delete b.transactionUserTemplate,b.transactionAttributeTemplates&&Object.keys(b.transactionAttributeTemplates).length||delete b.transactionAttributeTemplates,b.enabledProperty||delete b.enabledProperty,b.traceEntryEnabledProperty||delete b.traceEntryEnabledProperty,a.jsonExport=JSON.stringify(b,null,2),gtClipboard("#jsonExportModal .fa-clipboard",function(){return document.getElementById("jsonExport")},function(){return a.jsonExport}),e(function(){i.display("#jsonExportModal",!0)})},a.$watch("config.captureKind",function(b){a.config&&(a.captureKindTransaction="transaction"===b,a.showTimer="timer"===b||"trace-entry"===b||"transaction"===b,a.showTraceEntry="trace-entry"===b||"transaction"===b,a.showTraceEntryStackThreshold="trace-entry"===b,a.showTimer||(a.config.timerName=""),a.showTraceEntry||(a.config.traceEntryMessageTemplate="",a.config.traceEntryCaptureSelfNested=!1),a.showTraceEntryStackThreshold||(a.config.traceEntryStackThresholdMillis=""))}),a.$watch("selectedMethodSignature",function(b,c){b!==c&&(b?(a.config.methodParameterTypes=b.parameterTypes,a.config.methodReturnType="",a.config.methodModifiers=[]):(a.config.methodParameterTypes=[],a.config.methodReturnType="",a.config.methodModifiers=[]))})}]),glowroot.controller("ConfigGaugeListCtrl",["$scope","$location","$http","httpErrors",function(a,b,c,d){a.display=function(a){return a.config.display.replace(/\//g,"​/")},c.get("backend/config/gauges").success(function(b){a.loaded=!0,a.gauges=b}).error(d.handler(a))}]),glowroot.controller("ConfigGaugeCtrl",["$scope","$location","$http","$timeout","confirmIfHasChanges","httpErrors","queryStrings",function(a,b,c,d,e,f,g){function h(b){if(b.config.mbeanAttributes&&b.config.mbeanAttributes.sort(function(a,b){return a.nameb.name?1:0}),a.config=b.config,a.originalConfig=angular.copy(b.config),b.config.mbeanObjectName){a.heading=b.config.display,a.heading=a.heading.replace(/\//g,"​/"),a.heading=a.heading.replace(/ /g," "),a.selectedMBeanObjectName=b.config.mbeanObjectName,a.mbeanUnavailable=b.mbeanUnavailable,a.mbeanUnmatched=b.mbeanUnmatched;var c={};angular.forEach(b.mbeanAvailableAttributeNames,function(a){c[a]={checked:!1,counter:!1,available:!0}}),angular.forEach(b.config.mbeanAttributes,function(a){var b=c[a.name];b?(b.checked=!0,b.counter=a.counter):c[a.name]={checked:!0,counter:a.counter,available:!1}}),a.allMBeanAttributes=[],angular.forEach(c,function(b,c){a.allMBeanAttributes.push({name:c,checked:b.checked,counter:b.counter,available:b.available})})}else a.heading=""}function i(b){var d={mbeanObjectName:b,gaugeVersion:a.config.version||""};a.mbeanAttributesLoading=!0,c.get("backend/config/mbean-attributes"+g.encodeObject(d)).success(function(b){a.mbeanAttributesLoading=!1,a.mbeanUnavailable=b.mbeanUnavailable,a.mbeanUnmatched=b.mbeanUnmatched,a.duplicateMBean=b.duplicateMBean,a.allMBeanAttributes=[],angular.forEach(b.mbeanAttributes,function(b){a.allMBeanAttributes.push({name:b,checked:!1,counter:!1,available:!0})})}).error(function(b,c){a.mbeanAttributesLoading=!1,f.handler(a)(b,c)})}var j=b.search().v;j?c.get("backend/config/gauges?version="+j).success(function(b){a.loaded=!0,h(b)}).error(f.handler(a)):(a.loaded=!0,h({config:{mbeanAttributes:[]},mbeanAvailable:!1,mbeanAvailableAttributeNames:[]})),a.$watch("allMBeanAttributes",function(b,c){b!==c&&(a.config.mbeanAttributes=[],angular.forEach(a.allMBeanAttributes,function(b){b.checked&&a.config.mbeanAttributes.push({name:b.name,counter:b.counter})}),a.config.mbeanAttributes.sort(function(a,b){return a.nameb.name?1:0}))},!0),a.hasChanges=function(){return!angular.equals(a.config,a.originalConfig)};var k=a.$on("$locationChangeStart",e(a));a.showMBeanObjectNameSpinner=0,a.mbeanObjectNames=function(b){if(-1!==b.indexOf("*"))return[b];var d={partialMBeanObjectName:b,limit:10};return a.showMBeanObjectNameSpinner++,c.get("backend/config/matching-mbean-objects"+g.encodeObject(d)).then(function(b){return a.showMBeanObjectNameSpinner--,b.data},function(b,c){a.showMBeanObjectNameSpinner--,f.handler(a)(b,c)})},a.onSelectMBeanObjectName=function(){var b=a.config.mbeanObjectName;b!==a.selectedMBeanObjectName&&(a.selectedMBeanObjectName=b,i(b))},a.onBlurMBeanObjectName=function(){a.config.mbeanObjectName||(a.mbeanUnavailable=!1,a.mbeanUnmatched=!1,a.duplicateMBean=!1,a.allMBeanAttributes=[])},a.hasMBeanObjectNameError=function(){return a.config&&(!a.config.mbeanObjectName||a.mbeanUnavailable||a.mbeanUnmatched||a.duplicateMBean)},a.saveDisabled=function(){return!a.hasChanges()||!a.config.mbeanAttributes.length||a.formCtrl.$invalid||a.mbeanUnavailable||a.mbeanUnmatched||a.duplicateMBean},a.save=function(e){var g=angular.copy(a.config);g.mbeanAttributes=a.config.mbeanAttributes;var i;i=j?"backend/config/gauges/update":"backend/config/gauges/add",c.post(i,g).success(function(a){h(a),e.resolve(j?"Saved":"Added"),j=a.config.version,d(function(){b.search({v:j}).replace(),d(function(){b.url("config/gauge-list")})})}).error(function(b,c){return 409===c&&"mbeanObjectName"===b.message?(a.duplicateMBean=!0,void e.reject("There is already a gauge for this MBean")):void f.handler(a,e)(b,c)})},a.delete=function(d){var e={version:a.config.version};c.post("backend/config/gauges/remove",e).success(function(){k(),b.url("config/gauge-list").replace()}).error(f.handler(a,d))}}]),glowroot.controller("ConfigAlertListCtrl",["$scope","$location","$http","httpErrors",function(a,b,c,d){c.get("backend/config/alerts").success(function(b){a.loaded=!0,a.alerts=b}).error(d.handler(a))}]),glowroot.controller("ConfigAlertCtrl",["$scope","$location","$http","$timeout","confirmIfHasChanges","httpErrors",function(a,b,c,d,e,f){function g(b){a.config=b,a.originalConfig=angular.copy(b),b.emailAddresses.length?(a.heading=b.transactionType+" - "+b.percentile+a.percentileSuffix(b.percentile)+" percentile over a "+b.timePeriodMinutes+" minute period",a.emailAddresses=b.emailAddresses.join(", ")):a.heading=""}var h=b.search().v;h?c.get("backend/config/alerts?version="+h).success(function(b){a.loaded=!0,g(b)}).error(f.handler(a)):(a.loaded=!0,g({transactionType:a.layout.defaultTransactionType,minTransactionCount:1,emailAddresses:[]})),a.$watch("emailAddresses",function(b){if(b){var c=[];angular.forEach(b.split(","),function(a){a=a.trim(),a.length&&c.push(a)}),a.config.emailAddresses=c}else a.config&&(a.config.emailAddresses=[])}),a.hasChanges=function(){return!angular.equals(a.config,a.originalConfig)};var i=a.$on("$locationChangeStart",e(a));a.saveDisabled=function(){return!a.hasChanges()||a.formCtrl.$invalid},a.save=function(e){var i,j=angular.copy(a.config);i=h?"backend/config/alerts/update":"backend/config/alerts/add",c.post(i,j).success(function(a){g(a),e.resolve(h?"Saved":"Added"),h=a.version,d(function(){b.search({v:h}).replace(),d(function(){b.url("config/alert-list")})})}).error(function(b,c){f.handler(a,e)(b,c)})},a.delete=function(d){var e={version:a.config.version};c.post("backend/config/alerts/remove",e).success(function(){i(),b.url("config/alert-list").replace()}).error(f.handler(a,d))}}]),glowroot.controller("ConfigPluginListCtrl",["$scope","$location","$http","httpErrors",function(a,b,c,d){c.get("backend/config/plugins").success(function(b){a.loaded=!0,a.plugins=b}).error(d.handler(a))}]),glowroot.controller("ConfigPluginCtrl",["$scope","$stateParams","$http","$location","confirmIfHasChanges","httpErrors",function(a,b,c,d,e,f){function g(b){a.loaded=!0,a.plugin=b,a.config={enabled:b.config.enabled,version:b.config.version},a.config.properties=angular.copy(b.propertyDescriptors);for(var c=0;cMatched threads (matched to currently executing transactions):
\n"+(null!=(f=c.each.call(null!=b?b:{},null!=b?b.matchedThreads:b,{name:"each",hash:{},fn:a.program(2,e,0),inverse:a.noop,data:e}))?f:"")},2:function(a,b,c,d,e){var f,g,h=null!=b?b:{},i=c.helperMissing,j="function",k=a.escapeExpression;return(null!=(f=c.if.call(h,null!=b?b.transactionType:b,{name:"if",hash:{},fn:a.program(3,e,0),inverse:a.noop,data:e}))?f:"")+'"'+k((g=null!=(g=c.name||(null!=b?b.name:b))?g:i,typeof g===j?g.call(h,{name:"name",hash:{},data:e}):g))+'"\n   java.lang.Thread.State: '+k((g=null!=(g=c.state||(null!=b?b.state:b))?g:i,typeof g===j?g.call(h,{name:"state",hash:{},data:e}):g))+"\n"+(null!=(f=(c.ifBlocked||b&&b.ifBlocked||i).call(h,null!=b?b.state:b,{name:"ifBlocked",hash:{},fn:a.program(6,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=(c.ifWaiting||b&&b.ifWaiting||i).call(h,null!=b?b.state:b,{name:"ifWaiting",hash:{},fn:a.program(8,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=c.each.call(h,null!=b?b.stackTraceElements:b,{name:"each",hash:{},fn:a.program(11,e,0),inverse:a.noop,data:e}))?f:"")+"
"},3:function(a,b,c,d,e){var f,g,h=null!=b?b:{},i=c.helperMissing,j="function",k=a.escapeExpression;return"Transaction type: "+k((g=null!=(g=c.transactionType||(null!=b?b.transactionType:b))?g:i,typeof g===j?g.call(h,{name:"transactionType",hash:{},data:e}):g))+"\nTransaction name: "+k((g=null!=(g=c.transactionName||(null!=b?b.transactionName:b))?g:i,typeof g===j?g.call(h,{name:"transactionName",hash:{},data:e}):g))+"\nTransaction duration: "+k((c.nanosToMillis||b&&b.nanosToMillis||i).call(h,null!=b?b.transactionDuration:b,{name:"nanosToMillis",hash:{},data:e}))+" milliseconds "+(null!=(f=c.if.call(h,null!=b?b.traceId:b,{name:"if",hash:{},fn:a.program(4,e,0),inverse:a.noop,data:e}))?f:"")+"\n"},4:function(a,b,c,d,e){var f;return'
view trace'},6:function(a,b,c,d,e){var f;return" - blocked on "+a.escapeExpression((f=null!=(f=c.lockName||(null!=b?b.lockName:b))?f:c.helperMissing,"function"==typeof f?f.call(null!=b?b:{},{name:"lockName",hash:{},data:e}):f))+"\n"},8:function(a,b,c,d,e){var f;return null!=(f=c.if.call(null!=b?b:{},null!=b?b.lockName:b,{name:"if",hash:{},fn:a.program(9,e,0),inverse:a.noop,data:e}))?f:""},9:function(a,b,c,d,e){var f;return" - waiting on "+a.escapeExpression((f=null!=(f=c.lockName||(null!=b?b.lockName:b))?f:c.helperMissing,"function"==typeof f?f.call(null!=b?b:{},{name:"lockName",hash:{},data:e}):f))+"\n"},11:function(a,b,c,d,e){return" "+a.escapeExpression(a.lambda(b,b))+"\n"},13:function(a,b,c,d,e){var f;return"Unmatched threads (this may possibly include currently executing transactions that just started or just ended):
\n"+(null!=(f=c.each.call(null!=b?b:{},null!=b?b.unmatchedThreads:b,{name:"each",hash:{},fn:a.program(14,e,0),inverse:a.noop,data:e}))?f:"")},14:function(a,b,c,d,e){var f,g,h=null!=b?b:{},i=c.helperMissing,j="function",k=a.escapeExpression;return'"'+k((g=null!=(g=c.name||(null!=b?b.name:b))?g:i,typeof g===j?g.call(h,{name:"name",hash:{},data:e}):g))+'"\n   java.lang.Thread.State: '+k((g=null!=(g=c.state||(null!=b?b.state:b))?g:i,typeof g===j?g.call(h,{name:"state",hash:{},data:e}):g))+"\n"+(null!=(f=(c.ifBlocked||b&&b.ifBlocked||i).call(h,null!=b?b.state:b,{name:"ifBlocked",hash:{},fn:a.program(6,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=(c.ifWaiting||b&&b.ifWaiting||i).call(h,null!=b?b.state:b,{name:"ifWaiting",hash:{},fn:a.program(8,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=c.each.call(h,null!=b?b.stackTraceElements:b,{name:"each",hash:{},fn:a.program(11,e,0),inverse:a.noop,data:e}))?f:"")+"
"},16:function(a,b,c,d,e){var f,g=a.lambda,h=a.escapeExpression,i=null!=b?b:{},j=c.helperMissing;return'Thread dump request thread (producing this thread dump):
\n"'+h(g(null!=(f=null!=b?b.currentThread:b)?f.name:f,b))+'"\n   java.lang.Thread.State: '+h(g(null!=(f=null!=b?b.currentThread:b)?f.state:f,b))+"\n"+(null!=(f=(c.ifBlocked||b&&b.ifBlocked||j).call(i,null!=(f=null!=b?b.currentThread:b)?f.state:f,{name:"ifBlocked",hash:{},fn:a.program(17,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=(c.ifWaiting||b&&b.ifWaiting||j).call(i,null!=(f=null!=b?b.currentThread:b)?f.state:f,{name:"ifWaiting",hash:{},fn:a.program(19,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=c.each.call(i,null!=(f=null!=b?b.currentThread:b)?f.stackTraceElements:f,{name:"each",hash:{},fn:a.program(11,e,0),inverse:a.noop,data:e}))?f:"")},17:function(a,b,c,d,e){var f;return" - blocked on "+a.escapeExpression(a.lambda(null!=(f=null!=b?b.currentThread:b)?f.lockName:f,b))+"\n"},19:function(a,b,c,d,e){var f;return null!=(f=c.if.call(null!=b?b:{},null!=(f=null!=b?b.currentThread:b)?f.lockName:f,{name:"if",hash:{},fn:a.program(20,e,0),inverse:a.noop,data:e}))?f:""},20:function(a,b,c,d,e){var f;return" - waiting on "+a.escapeExpression(a.lambda(null!=(f=null!=b?b.currentThread:b)?f.lockName:f,b))+"\n"},compiler:[7,">= 4.0.0"],main:function(a,b,c,d,e){var f,g=null!=b?b:{};return(null!=(f=c.if.call(g,null!=b?b.matchedThreads:b,{name:"if",hash:{},fn:a.program(1,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=c.if.call(g,null!=b?b.unmatchedThreads:b,{name:"if",hash:{},fn:a.program(13,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=c.if.call(g,null!=b?b.currentThread:b,{name:"if",hash:{},fn:a.program(16,e,0),inverse:a.noop,data:e}))?f:"")+"\n"},useData:!0}),this.JST["trace-entry"]=Handlebars.template({1:function(a,b,c,d,e){return".."},3:function(a,b,c,d,e){var f,g=null!=b?b:{},h=c.helperMissing;return(null!=(f=(c.ifLongMessage||b&&b.ifLongMessage||h).call(g,null!=b?b.message:b,{name:"ifLongMessage",hash:{},fn:a.program(4,e,0),inverse:a.program(6,e,0),data:e}))?f:"")+(null!=(f=(c.ifNonEmptyObject||b&&b.ifNonEmptyObject||h).call(g,null!=b?b.detail:b,{name:"ifNonEmptyObject",hash:{},fn:a.program(8,e,0),inverse:a.noop,data:e}))?f:"")},4:function(a,b,c,d,e){var f,g=null!=b?b:{},h=c.helperMissing,i=a.escapeExpression;return'
\n
\n'+i((c.firstPart||b&&b.firstPart||h).call(g,null!=b?b.message:b,{name:"firstPart",hash:{},data:e}))+'\n...\n'+i((c.lastPart||b&&b.lastPart||h).call(g,null!=b?b.message:b,{name:"lastPart",hash:{},data:e}))+'\n
\n\n
\n\n
'+i((f=null!=(f=c.message||(null!=b?b.message:b))?f:h,"function"==typeof f?f.call(g,{name:"message",hash:{},data:e}):f))+"
\n
\n
\n"},6:function(a,b,c,d,e){var f,g=null!=b?b:{},h=c.helperMissing,i="function",j=a.escapeExpression;return'
\n
\n'+j((f=null!=(f=c.message||(null!=b?b.message:b))?f:h,typeof f===i?f.call(g,{name:"message",hash:{},data:e}):f))+'\n
\n
\n\n
'+j((f=null!=(f=c.message||(null!=b?b.message:b))?f:h,typeof f===i?f.call(g,{name:"message",hash:{},data:e}):f))+"
\n
\n
\n"},8:function(a,b,c,d,e){var f;return'
\ndetail\n\n'+(null!=(f=(c.entryDetailHtml||b&&b.entryDetailHtml||c.helperMissing).call(null!=b?b:{},null!=b?b.detail:b,{name:"entryDetailHtml",hash:{},data:e}))?f:"")+"\n\n
\n"},10:function(a,b,c,d,e){var f,g=null!=b?b:{};return'
\n
\n\n'+a.escapeExpression(a.lambda(null!=(f=null!=b?b.error:b)?f.message:f,b))+"\n\n
\n"+(null!=(f=c.if.call(g,null!=(f=null!=b?b.error:b)?f.exception:f,{name:"if",hash:{},fn:a.program(11,e,0),inverse:a.noop,data:e}))?f:"")+"
\n"},11:function(a,b,c,d,e){var f,g=null!=b?b:{},h=c.helperMissing;return'
\n\n
\n'+(null!=(f=(c.exceptionHtml||b&&b.exceptionHtml||h).call(g,null!=(f=null!=b?b.error:b)?f.exception:f,{name:"exceptionHtml",hash:{},data:e}))?f:"")+'\n\n
\n
\n'},13:function(a,b,c,d,e){var f;return'
\n\n
\n'+(null!=(f=(c.locationStackTraceHtml||b&&b.locationStackTraceHtml||c.helperMissing).call(null!=b?b:{},null!=b?b.locationStackTraceElements:b,{name:"locationStackTraceHtml",hash:{},data:e}))?f:"")+'\n\n
\n
\n'},compiler:[7,">= 4.0.0"],main:function(a,b,c,d,e){var f,g,h=null!=b?b:{},i=c.helperMissing,j="function",k=a.escapeExpression;return'
\n
\n+'+k((c.nanosToMillis||b&&b.nanosToMillis||i).call(h,null!=b?b.startOffsetNanos:b,{name:"nanosToMillis",hash:{},data:e}))+'\n
\n
\n\n'+k((c.nanosToMillis||b&&b.nanosToMillis||i).call(h,null!=b?b.durationNanos:b,{name:"nanosToMillis",hash:{},data:e}))+(null!=(f=c.if.call(h,null!=b?b.active:b,{name:"if",hash:{},fn:a.program(1,e,0),inverse:a.noop,data:e}))?f:"")+'\n\n
\n
\n'+(null!=(f=(c.ifDisplayMessage||b&&b.ifDisplayMessage||i).call(h,b,{name:"ifDisplayMessage",hash:{},fn:a.program(3,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=c.if.call(h,null!=b?b.error:b,{name:"if",hash:{},fn:a.program(10,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=c.if.call(h,null!=b?b.locationStackTraceElements:b,{name:"if",hash:{},fn:a.program(13,e,0),inverse:a.noop,data:e}))?f:"")+"
\n
\n"},useData:!0}),this.JST.trace=Handlebars.template({1:function(a,b,c,d,e){return'
\nERROR\n
\n'; },3:function(a,b,c,d,e){return'
\nACTIVE\n
\n'},5:function(a,b,c,d,e){var f;return null!=(f=c.if.call(null!=b?b:{},null!=b?b.partial:b,{name:"if",hash:{},fn:a.program(6,e,0),inverse:a.noop,data:e}))?f:""},6:function(a,b,c,d,e){return'
\nPARTIAL\n
\n'},8:function(a,b,c,d,e){return'
\nBackground\n
\n'},10:function(a,b,c,d,e){return'\n'},12:function(a,b,c,d,e){var f;return'
Error: 
\n
'+a.escapeExpression(a.lambda(null!=(f=null!=b?b.error:b)?f.message:f,b))+"
\n"+(null!=(f=c.if.call(null!=b?b:{},null!=(f=null!=b?b.error:b)?f.exception:f,{name:"if",hash:{},fn:a.program(13,e,0),inverse:a.noop,data:e}))?f:"")},13:function(a,b,c,d,e){var f;return'
\nexception\n
\n'+(null!=(f=(c.exceptionHtml||b&&b.exceptionHtml||c.helperMissing).call(null!=b?b:{},null!=(f=null!=b?b.error:b)?f.exception:f,{name:"exceptionHtml",hash:{},data:e}))?f:"")+'\n\n
\n
\n'},15:function(a,b,c,d,e){return".."},17:function(a,b,c,d,e){var f;return'
User: 
\n
'+a.escapeExpression((f=null!=(f=c.user||(null!=b?b.user:b))?f:c.helperMissing,"function"==typeof f?f.call(null!=b?b:{},{name:"user",hash:{},data:e}):f))+"
\n"},19:function(a,b,c,d,e){var f,g=null!=b?b:{},h=c.helperMissing,i="function",j=a.escapeExpression;return'
'+j((f=null!=(f=c.key||(null!=b?b.key:b))?f:h,typeof f===i?f.call(g,{name:"key",hash:{},data:e}):f))+': 
\n
'+j((f=null!=(f=c.value||(null!=b?b.value:b))?f:h,typeof f===i?f.call(g,{name:"value",hash:{},data:e}):f))+"
\n"},21:function(a,b,c,d,e){var f;return(null!=(f=(c.headerDetailHtml||b&&b.headerDetailHtml||c.helperMissing).call(null!=b?b:{},null!=b?b.detail:b,{name:"headerDetailHtml",hash:{},data:e}))?f:"")+"\n"},23:function(a,b,c,d,e){var f,g,h=null!=b?b:{},i=c.helperMissing,j=a.escapeExpression,k="function";return'\n\n
\n
'+j((g=null!=(g=c.name||(null!=b?b.name:b))?g:i,typeof g===k?g.call(h,{name:"name",hash:{},data:e}):g))+"
\n
\n\n"+j((c.nanosToMillis||b&&b.nanosToMillis||i).call(h,null!=b?b.totalNanos:b,{name:"nanosToMillis",hash:{},data:e}))+(null!=(f=c.if.call(h,null!=b?b.active:b,{name:"if",hash:{},fn:a.program(15,e,0),inverse:a.noop,data:e}))?f:"")+"\n"+j((g=null!=(g=c.count||(null!=b?b.count:b))?g:i,typeof g===k?g.call(h,{name:"count",hash:{},data:e}):g))+"\n\n\n"},25:function(a,b,c,d,e){var f,g,h=null!=b?b:{},i=c.helperMissing,j=a.escapeExpression,k="function";return'\n\n
\n
\n'+j((g=null!=(g=c.name||(null!=b?b.name:b))?g:i,typeof g===k?g.call(h,{name:"name",hash:{},data:e}):g))+(null!=(f=c.if.call(h,null!=b?b.extended:b,{name:"if",hash:{},fn:a.program(26,e,0),inverse:a.noop,data:e}))?f:"")+"\n
\n
\n\n"+j((c.nanosToMillis||b&&b.nanosToMillis||i).call(h,null!=b?b.totalNanos:b,{name:"nanosToMillis",hash:{},data:e}))+(null!=(f=c.if.call(h,null!=b?b.active:b,{name:"if",hash:{},fn:a.program(15,e,0),inverse:a.noop,data:e}))?f:"")+"\n"+j((g=null!=(g=c.count||(null!=b?b.count:b))?g:i,typeof g===k?g.call(h,{name:"count",hash:{},data:e}):g))+"\n\n\n"},26:function(a,b,c,d,e){return" (extended)"},28:function(a,b,c,d,e){var f,g=null!=b?b:{},h=c.helperMissing;return'
\nJVM thread metrics\n
\n'+(null!=(f=(c.ifNotNA||b&&b.ifNotNA||h).call(g,null!=b?b.threadCpuNanos:b,{name:"ifNotNA",hash:{},fn:a.program(29,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=(c.ifNotNA||b&&b.ifNotNA||h).call(g,null!=b?b.threadBlockedNanos:b,{name:"ifNotNA",hash:{},fn:a.program(31,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=(c.ifNotNA||b&&b.ifNotNA||h).call(g,null!=b?b.threadWaitedNanos:b,{name:"ifNotNA",hash:{},fn:a.program(33,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=(c.ifNotNA||b&&b.ifNotNA||h).call(g,null!=b?b.threadAllocatedBytes:b,{name:"ifNotNA",hash:{},fn:a.program(35,e,0),inverse:a.noop,data:e}))?f:"")},29:function(a,b,c,d,e){return'
\nCPU time:\n'+a.escapeExpression((c.nanosToMillis||b&&b.nanosToMillis||c.helperMissing).call(null!=b?b:{},null!=b?b.threadCpuNanos:b,{name:"nanosToMillis",hash:{},data:e}))+" milliseconds\n
\n"},31:function(a,b,c,d,e){return'
\nBlocked time:\n'+a.escapeExpression((c.nanosToMillis||b&&b.nanosToMillis||c.helperMissing).call(null!=b?b:{},null!=b?b.threadBlockedNanos:b,{name:"nanosToMillis",hash:{},data:e}))+" milliseconds\n
\n"},33:function(a,b,c,d,e){return'
\nWaited time:\n'+a.escapeExpression((c.nanosToMillis||b&&b.nanosToMillis||c.helperMissing).call(null!=b?b:{},null!=b?b.threadWaitedNanos:b,{name:"nanosToMillis",hash:{},data:e}))+" milliseconds\n
\n"},35:function(a,b,c,d,e){return'
\nAllocated memory:\n'+a.escapeExpression((c.formatAllocatedBytes||b&&b.formatAllocatedBytes||c.helperMissing).call(null!=b?b:{},null!=b?b.threadAllocatedBytes:b,{name:"formatAllocatedBytes",hash:{},data:e}))+"\n
\n"},37:function(a,b,c,d,e){var f;return'
\nGC activity\n
\n'+(null!=(f=(c.eachGcActivityOrdered||b&&b.eachGcActivityOrdered||c.helperMissing).call(null!=b?b:{},null!=b?b.gcActivity:b,{name:"eachGcActivityOrdered",hash:{},fn:a.program(38,e,0),inverse:a.noop,data:e}))?f:"")},38:function(a,b,c,d,e){var f,g,h=null!=b?b:{},i=c.helperMissing,j="function",k=a.escapeExpression;return'
\n'+k((g=null!=(g=c.key||(null!=b?b.key:b))?g:i,typeof g===j?g.call(h,{name:"key",hash:{},data:e}):g))+":\n"+k((g=null!=(g=c.collectionTime||(null!=b?b.collectionTime:b))?g:i,typeof g===j?g.call(h,{name:"collectionTime",hash:{},data:e}):g))+" milliseconds ("+k((g=null!=(g=c.collectionCount||(null!=b?b.collectionCount:b))?g:i,typeof g===j?g.call(h,{name:"collectionCount",hash:{},data:e}):g))+" collection"+(null!=(f=(c.ifNotOne||b&&b.ifNotOne||i).call(h,null!=b?b.collectionCount:b,{name:"ifNotOne",hash:{},fn:a.program(39,e,0),inverse:a.noop,data:e}))?f:"")+")\n
\n"},39:function(a,b,c,d,e){return"s"},41:function(a,b,c,d,e){var f;return'
\n\n
\n
\n
\n
\n
\n
\n
\n'},43:function(a,b,c,d,e){var f;return'
\n\n
\n
\n
\n
\n
\n
\n\n\n\n
\n
\n
\n'},45:function(a,b,c,d,e){var f;return null!=(f=(c.ifExistenceExpired||b&&b.ifExistenceExpired||c.helperMissing).call(null!=b?b:{},null!=b?b.profileExistence:b,{name:"ifExistenceExpired",hash:{},fn:a.program(46,e,0),inverse:a.program(48,e,0),data:e}))?f:""},46:function(a,b,c,d,e){return'
\n\nEntries and profile for this trace have expired\n\n\n(see Configuration > Storage > Trace detail data)\n\n
\n'},48:function(a,b,c,d,e){return'
\n\nEntries for this trace have expired\n\n\n(see Configuration > Storage > Trace detail data)\n\n
\n'},50:function(a,b,c,d,e){var f;return null!=(f=(c.ifExistenceExpired||b&&b.ifExistenceExpired||c.helperMissing).call(null!=b?b:{},null!=b?b.profileExistence:b,{name:"ifExistenceExpired",hash:{},fn:a.program(51,e,0),inverse:a.noop,data:e}))?f:""},51:function(a,b,c,d,e){return'
\n\nProfile for this trace has expired\n\n\n(see Configuration > Storage > Trace detail data)\n\n
\n'},compiler:[7,">= 4.0.0"],main:function(a,b,c,d,e){var f,g,h=null!=b?b:{},i=c.helperMissing,j="function",k=a.escapeExpression;return(null!=(f=c.if.call(h,null!=b?b.error:b,{name:"if",hash:{},fn:a.program(1,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=c.if.call(h,null!=b?b.active:b,{name:"if",hash:{},fn:a.program(3,e,0),inverse:a.program(5,e,0),data:e}))?f:"")+(null!=(f=c.if.call(h,null!=b?b.background:b,{name:"if",hash:{},fn:a.program(8,e,0),inverse:a.noop,data:e}))?f:"")+'
\n'+k((g=null!=(g=c.headline||(null!=b?b.headline:b))?g:i,typeof g===j?g.call(h,{name:"headline",hash:{},data:e}):g))+"\n"+(null!=(f=c.if.call(h,null!=b?b.showExport:b,{name:"if",hash:{},fn:a.program(10,e,0),inverse:a.noop,data:e}))?f:"")+'
\n
Transaction type: 
\n
'+k((g=null!=(g=c.transactionType||(null!=b?b.transactionType:b))?g:i,typeof g===j?g.call(h,{name:"transactionType",hash:{},data:e}):g))+'
\n
Transaction name: 
\n
'+k((g=null!=(g=c.transactionName||(null!=b?b.transactionName:b))?g:i,typeof g===j?g.call(h,{name:"transactionName",hash:{},data:e}):g))+"
\n"+(null!=(f=c.if.call(h,null!=b?b.error:b,{name:"if",hash:{},fn:a.program(12,e,0),inverse:a.noop,data:e}))?f:"")+'
\n
Start: 
\n
'+k((c.date||b&&b.date||i).call(h,null!=b?b.startTime:b,{name:"date",hash:{},data:e}))+'
\n
\n
\n
Duration: 
\n
'+k((c.nanosToMillis||b&&b.nanosToMillis||i).call(h,null!=b?b.durationNanos:b,{name:"nanosToMillis",hash:{},data:e}))+(null!=(f=c.if.call(h,null!=b?b.active:b,{name:"if",hash:{},fn:a.program(15,e,0),inverse:a.noop,data:e}))?f:"")+" milliseconds
\n
\n"+(null!=(f=c.if.call(h,null!=b?b.user:b,{name:"if",hash:{},fn:a.program(17,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=(c.eachKeyValuePair||b&&b.eachKeyValuePair||i).call(h,null!=b?b.attributes:b,{name:"eachKeyValuePair",hash:{},fn:a.program(19,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=c.if.call(h,null!=b?b.detail:b,{name:"if",hash:{},fn:a.program(21,e,0),inverse:a.noop,data:e}))?f:"")+'
\nBreakdown:\n
\n
\n\n\n\n\n\n\n\n\n\n\n'+(null!=(f=(c.eachTimerFlattenedOrdered||b&&b.eachTimerFlattenedOrdered||i).call(h,null!=b?b.rootTimer:b,{name:"eachTimerFlattenedOrdered",hash:{},fn:a.program(23,e,0),inverse:a.noop,data:e}))?f:"")+'\n
total (ms)count\n\n
\n\n\n\n\n\n\n\n\n\n\n'+(null!=(f=(c.eachTimerOrdered||b&&b.eachTimerOrdered||i).call(h,null!=b?b.rootTimer:b,{name:"eachTimerOrdered",hash:{},fn:a.program(25,e,0),inverse:a.noop,data:e}))?f:"")+"\n
total (ms)count\n\n
\n
\n"+(null!=(f=(c.ifAnyThreadInfo||b&&b.ifAnyThreadInfo||i).call(h,b,{name:"ifAnyThreadInfo",hash:{},fn:a.program(28,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=(c.ifNonEmptyObject||b&&b.ifNonEmptyObject||i).call(h,null!=b?b.gcActivity:b,{name:"ifNonEmptyObject",hash:{},fn:a.program(37,e,0),inverse:a.noop,data:e}))?f:"")+"
\n"+(null!=(f=(c.ifExistenceYes||b&&b.ifExistenceYes||i).call(h,null!=b?b.entriesExistence:b,{name:"ifExistenceYes",hash:{},fn:a.program(41,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=(c.ifExistenceYes||b&&b.ifExistenceYes||i).call(h,null!=b?b.profileExistence:b,{name:"ifExistenceYes",hash:{},fn:a.program(43,e,0),inverse:a.noop,data:e}))?f:"")+(null!=(f=(c.ifExistenceExpired||b&&b.ifExistenceExpired||i).call(h,null!=b?b.entriesExistence:b,{name:"ifExistenceExpired",hash:{},fn:a.program(45,e,0),inverse:a.program(50,e,0),data:e}))?f:"")},useData:!0}),angular.module("glowroot").run(["$templateCache",function(a){"use strict";a.put("views/config.html",'
Configuration
'),a.put("views/config/advanced.html",'

Advanced

Any transaction that exceeds this amount of time will have its partial trace stored to disk immediately (prior to its completion). This is to guard against transactions which never complete (or at least run long enough and do enough harm to hang the jvm).
The maximum number of different transaction names in a given minute that each have their own aggregates. If this is exceeded in any given minute, then transactions with other transactions names will still be aggregated into the overall bucket, but will not have their own buckets for that minute time period.
The maximum number of different aggregated queries that are stored per query type across transactions of a given transaction name (for display on the Transaction Queries tab). This is used to limit storage and memory when there are lots of dynamically created queries. More than this number of aggregated queries are stored in memory and then this number of the top queries by time are stored. Specifically, 10 times this number are stored in memory for overall aggregates and 2 times this number are stored in memory for aggregates by transaction name.
Maximum number of trace entries collected for a given transaction. This is used to limit the memory of very long transactions that would capture potentially hundreds of thousands of trace entries (e.g. large batch or background operations). Also, the UI is not really optimized for viewing super large numbers of trace entries.
Maximum number of stack trace samples collected for a given transaction. This is used to limit the memory of very long transactions that would capture potentially hundreds of thousands of stack traces (e.g. large batch or background operations).
Capture thread info per transaction (CPU time, blocked time, waited time and allocated memory) if available. See JVM Capabilities.
Capture global garbage collection activity per transaction.
'),a.put("views/config/alert-list.html",' '),a.put("views/config/alert.html",'

Return to list Alerts | {{heading}}

The transaction type that this alert monitors.
Percentile, time period and threshold all work together. Every minute, the given percentile (e.g. 95) will be calculated over the given prior time period (e.g. the last 5 minutes) and if it exceeds the given threshold (e.g. 2000 milliseconds) then the alert will be triggered.
The time period over which the percentile is calculated.
The threshold that will trigger the alert.
Time periods with very few transactions have much less reliable percentiles, so increasing this can be used to suppress alerts from being generated unless the time period meets this minimum transaction count.
Comma separated list of email addresses.
'),a.put("views/config/gauge-list.html",'

Gauges

{{mbeanAttribute.name}}
'),a.put("views/config/gauge.html",'

Return to list Gauges | {{heading}}

MBean not found
No matching MBean found
There is already a gauge for this MBean
There are no number-valued attributes for this MBean
'),a.put("views/config/instrumentation-list.html",'

Instrumentation

{{displayExtra(config)}} {{display(config)}}
Restart the JVM to apply changes. Feeling lucky? Try the red button.
Add new
'),a.put("views/config/instrumentation.html",'

Return to list Instrumentation | {{heading}}

What method(s) to instrument
The class or interface containing the method(s) to instrument.
The method(s) to instrument. All overriding methods will also be instrumented (including all implementations of the method if the class above is an interface).
The wildcard * is supported anywhere in the method name. Multiple method names (including multiple method names with the wildcard * in them) can be listed with the | separator between them.
Only the method name and parameter types are used when evaluating what to instrument (the return type and access modifiers are ignored).
What to capture
The transaction type is used for aggregation and filtering.
This can be one of the current transaction types ({{layout.transactionTypes.join(\', \')}}) or a new transaction type.
The transaction name is used for aggregation and filtering.
This is a template which can be populated with values from the method invocation. The same rules apply as for the trace headline (see below), except that the return value {{_}} cannot be used.
This is a template which can be populated with values from the method invocation:
  • {{0}}, {{1}}, ... resolve to the method parameters
  • {{this}} resolves to the object that the method is invoked on (except for static methods)
  • {{_}} resolves to the return value (if not void)
  • {{methodName}} resolves to the method name, which can be useful if * or | are used to define the method name above
Nested paths are resolved as well, e.g. {{0.size}} and {{this.class.name}}. If a path resolves to null at any point, then the entire path will resolve to null. Finally, resolved value is rendered into the template using String.valueOf().
Multiple instrumentation definitions can share the same timer name, in which case their timers are aggregated together.
If checked, and this custom instrumentation is encountered within one of its own trace entries, a nested trace entry will be captured. This can sometimes lead to a lot of extra noise, e.g. in a fairly common case where the custom instrumentation matches several overloaded methods that cascade to each other.
Any trace entry that exceeds this threshold will have a stack trace captured and attached to it in order to help identify the source of this trace entry. Empty means never capture a stack trace for this trace entry.
Optional transaction overrides
The transaction type is used for aggregation and filtering.
This can be one of the current transaction types ({{layout.transactionTypes.join(\', \')}}) or a new transaction type.
The value provided will override the transaction type for the containing transaction. If the transaction type is overridden more than once for a given transaction, the first non-null/non-empty value will be used.
The transaction name is used for aggregation and filtering.
The value provided will override the transaction name for the containing transaction. If the transaction name is overridden more than once for a given transaction, the first non-null/non-empty value will be used.
This is a template which can be populated with values from the method invocation:
  • {{0}}, {{1}}, ... resolve to the method parameters
  • {{this}} resolves to the object that the method is invoked on (except for static methods)
  • {{methodName}} resolves to the method name, which can be useful if * or | are used to define the method name above
Nested paths are resolved as well, e.g. {{0.size}} and {{this.class.name}}. If a path resolves to null at any point, then the entire path will resolve to null. Finally, resolved value is rendered into the template using String.valueOf().
This will override the slow threshold for the containing transaction. The value can be smaller than the global slow threshold to force slow transaction traces to be stored more often, or larger to force slow transaction traces to be stored less often. If the slow threshold is overridden more than once for a given transaction, the smallest override value will be used.
'), a.put("views/config/plugin-list.html",'

Plugins

{{plugin.name}} {{plugin.enabled ? \'Enabled\' : \'Disabled\'}}
'),a.put("views/config/plugin.html",'

Return to list Plugins | {{plugin.name}}

{{property.description}}
{{property.description}}
{{property.description}}
'),a.put("views/config/smtp.html",'

Return to list Alerts | SMTP configuration

Defaults to glowroot@<server name> (currently glowroot@{{localServerName}}).
Defaults to Glowroot.
This is required in order to send alerts.
Defaults to port 25.
Send test email
'),a.put("views/config/storage.html",'

Storage

data.h2.db
Response time tab data is collected continuously and stored at 1 minute intervals. This setting defines how long to retain this 1 minute interval data.
Response time tab data is rolled up at 5 minute intervals. This setting defines how long to retain this 5 minute rollup data.
Response time tab data is rolled up again at 30 minute intervals. This setting defines how long to retain this 30 minute rollup data.
This setting defines how long to retain the trace tab data.
*.capped.db
Profile and queries tab data is collected continuously and stored at 1 minute intervals. This setting defines the size of the capped data file used to store this 1 minute interval data.
Profile and queries tab data is rolled up at 5 minute intervals. This setting defines the size of the capped data file used to store this 5 minute interval data.
Profile and queries tab data is rolled up at 30 minute intervals. This setting defines the size of the capped data file used to store this 30 minute interval data.
This setting defines the size of the capped data file used to store the trace detail data (trace entries and trace profiles).
'),a.put("views/config/transaction.html",'

Transactions

The interval at which the profiler captures stack traces.
Any transaction that exceeds this amount of time will be viewable immediately as an active trace and the trace will be stored to disk at its completion.
'),a.put("views/config/user-interface.html",'

Glowroot UI

The default transaction type displayed on the transactions and errors page.
The default percentiles displayed on the transaction percentiles tab. HdrHistogram is used to bucket and store the full range of values so that any percentile value can be reported with at most 1% error, e.g. if the 99.9th percentile is reported as 1400 milliseconds, then that would be at most 14 milliseconds from the true 99.9th percentile value.
Active value is {{activePort}}.
Port that the user interface listens on.
Read only users can view everything, including configuration, mbean tree, thread dumps, process info and system properties pages. Read only users cannot update any configuration data and cannot generate heap dumps.
Anonymous users can be granted either admin, read only or no access. The admin account is disabled if anonymous users have admin access, and the read only account is disabled if anonymous users have read only access.
Session timeout only applies if password is enabled. Session timeout 0 means sessions do not time out, except on jvm restart at which time all sessions time out.
Change admin password
Change read only password
'),a.put("views/config/user-recording.html",'

User recording

Comma-separated list of users. All transactions for the given users will be profiled and trace will be stored. The username matching is case-insensitive.
The interval at which the profiler captures stack traces.
'),a.put("views/jvm.html",'
JVM
'),a.put("views/jvm/capabilities.html",'

Capabilities

{{capabilities.threadCpuTime.available | gtOnOff}}
{{capabilities.threadCpuTime.reason}}
{{capabilities.threadContentionTime.available | gtOnOff}}
{{capabilities.threadContentionTime.reason}}
{{capabilities.threadAllocatedBytes.available | gtOnOff}}
{{capabilities.threadAllocatedBytes.reason}}
'),a.put("views/jvm/gauge-values.html",'

Gauges

No gauges configured. See Gauge configuration.
No data
Select one or more gauges below
{{seriesLabel.text}}

Gauge Color Scale
{{gaugeColorText(gauge.name)}}
{{getGaugeScale(gauge.name)}}
'),a.put("views/jvm/glowroot-log.html",'

Glowroot log


{{glowrootLog}}
'),a.put("views/jvm/heap-dump.html",'

Heap dump

Use the jvm arg -XX:HeapDumpPath=<directory> to change the default heap dump location.
Free disk space {{availableDiskSpace | gtBytes}}
Heap dump {{heapDumpResponse.filename}}
File size {{heapDumpResponse.size | gtBytes}}
'),a.put("views/jvm/mbean-tree.html",'

MBean tree

'),a.put("views/jvm/process-info.html",'

Process info

{{data.startTime | date:\'medium\'}}
{{data.uptime | gtDuration}}
{{data.pid}}
{{data.mainClass}}
none
{{argument}}
{{data.jvm}}
{{data.java}}
{{data.javaHome}}
{{argument}}
'),a.put("views/jvm/thread-dump.html",'

Thread dump

'), a.put("views/login.html",'
Login
{{message}}
'),a.put("views/transaction.html",'

{{transactionName ? transactionName : \'All \' + transactionType + \' Transactions\'}}

'),a.put("views/transaction/average.html",'
No data for this time period
{{seriesLabel.text}}
total (ms) count
{{flattenedTimer.name}}
{{flattenedTimer.totalNanos / (1000000 * mergedAggregate.transactionCount) | gtMillis}} {{flattenedTimer.count / mergedAggregate.transactionCount | gtCount}}
total (ms) count
{{treeTimer.name}}{{treeTimer.extended ? \' (extended)\' : \'\'}}
{{treeTimer.totalNanos / (1000000 * mergedAggregate.transactionCount) | gtMillis}} {{treeTimer.count / mergedAggregate.transactionCount | gtCount}}
CPU time: {{threadInfoAggregate.totalCpuNanos / (1000000 * mergedAggregate.transactionCount) | gtMillis}} ms
Blocked time: {{threadInfoAggregate.totalBlockedNanos / (1000000 * mergedAggregate.transactionCount) | gtMillis}} ms
Waited time: {{threadInfoAggregate.totalWaitedNanos / (1000000 * mergedAggregate.transactionCount) | gtMillis}} ms
Allocated memory: {{threadInfoAggregate.totalAllocatedBytes / mergedAggregate.transactionCount | gtBytes}}
'),a.put("views/transaction/error-messages.html",'
{{parsingError}}
No data for this time period
Error Count Traces
{{errorMessage.message}} {{errorMessage.count}} see traces
'),a.put("views/transaction/error-tabs.html",' '),a.put("views/transaction/flame-graph.html",'
Flame graph (experimental)
Profile tree filter: {{filter}}
{{parsingError}}
Hover over a block for summary information. Click a block for details.
No data for this time period
'),a.put("views/transaction/percentiles.html",'
No data for this time period
{{seriesLabel.text}}
 
{{percentileValue.value / 1000000 | gtMillis}} ms
'),a.put("views/transaction/profile.html",'
No data for this time period
There was profile data but it has expired, see Configuration > Storage > Profile and queries tab data
View flame graph (experimental)
Total of {{sampleCount}} sampled stack traces in selected time period
{{parsingError}}
'),a.put("views/transaction/queries.html",'
No data for this time period
There was query data but it has expired, see Configuration > Storage > Profile and queries tab data
Total
time
(ms)
Execution
count
Time per
execution
(ms)
Rows per
execution
{{query.queryText}} {{query.totalNanos / 1000000 | gtMillis}} {{query.executionCount}} {{query.timePerExecution | gtMillis}} {{query.rowsPerExecution | gtCount}}
'),a.put("views/transaction/sidebar.html",'
    No data for this time period
'),a.put("views/transaction/tabs.html",' '),a.put("views/transaction/throughput.html",'
No data for this time period
{{transactionsPerMin.toFixed(1)}} transactions per minute
({{transactionCount}} in this period)
'),a.put("views/transaction/traces.html",'
No data
*There were traces but they have expired, see Configuration > Storage > Trace detail data

Specified limit exceeded, only displaying slowest {{chartLimit}} matching traces
and milliseconds
'), a.put("template/gt-button.html",'
'),a.put("template/gt-chart-range.html",' '),a.put("template/gt-datepicker.html",'
'),a.put("template/gt-form-group.html",'
{{gtAddon}}
'),a.put("template/gt-http-error-overlay.html",'
'),a.put("template/gt-http-error.html",'
{{httpError.headline}}
{{httpError.message}}
{{showHttpErrorStackTrace ? \'hide stack trace\' : \'show stack trace\'}}
{{httpError.stackTrace}}
'),a.put("template/gt-input-group-dropdown.html",'
'),a.put("template/gt-loading-overlay.html",'
'),a.put("template/gt-mbean-node.html",'
{{node.nodeName}}
{{node.nodeName}}
{{key}}
{{value}}
{{indentedJson(value)}}
ObjectName
{{node.objectName}}
'),a.put("template/gt-navbar-item.html",'
  • {{gtDisplay}}
  • '),a.put("template/gt-sidebar-item.html",'
    {{gtDisplay}}
    {{gtDisplay}} {{gtDisplayRight}}
    '),a.put("template/gt-typeahead-class-match.html",''),a.put("template/help/chart.html",'
    Chart navigation tips
    • drag or double click to zoom in
    • use ctrl + scroll wheel to zoom in and out
    '),a.put("template/help/error-message-filter.html",'
    Error message filter
    Use spaces to separate multiple terms. Use quotes for text that has spaces. Add a minus in front of a term to exclude errors containing that text. E.g. one "two with a space" -three
    '),a.put("template/help/profile-filter.html",'
    Profile tree filter
    Use spaces to separate multiple terms. Add a minus in front of a term to exclude stack traces containing that text. E.g. one two -three
    '),a.put("template/help/traces-chart.html",'
    Chart navigation tips
    • click a data point to view the trace
    • drag over a region to zoom in
    • use ctrl + scroll wheel to zoom in and out
    ')}]);




    © 2015 - 2025 Weber Informatics LLC | Privacy Policy