|
3 | 3 | pinpointApp.constant("ThreadDumpInfoLayerDirectiveConfig", { |
4 | 4 | ACTIVE_THREAD_LIGHT_DUMP_URL: "agent/activeThreadLightDump.pinpoint", |
5 | 5 | ACTIVE_THREAD_DUMP_URL: "agent/activeThreadDump.pinpoint", |
6 | | - PADDING_WIDTH: 15, // % |
| 6 | + PADDING_WIDTH: 5, // % |
7 | 7 | PADDING_HEIGHT: 15 // % |
8 | 8 | }); |
9 | | - pinpointApp.directive( "threadDumpInfoLayerDirective", [ "ThreadDumpInfoLayerDirectiveConfig", "$rootScope", "$timeout", "$http", "$window", "CommonUtilService", "AnalyticsService", |
10 | | - function ( cfg, $rootScope, $timeout, $http, $window, CommonUtilService, AnalyticsService ) { |
| 9 | + pinpointApp.directive( "threadDumpInfoLayerDirective", [ "ThreadDumpInfoLayerDirectiveConfig", "$rootScope", "$timeout", "$http", "$window", "CommonUtilService", |
| 10 | + function ( cfg, $rootScope, $timeout, $http, $window, CommonUtilService ) { |
11 | 11 | return { |
12 | 12 | restrict: "EA", |
13 | 13 | replace: true, |
|
18 | 18 | link: function(scope, element) { |
19 | 19 | var $el = $(element); |
20 | 20 | var $elSpin = $el.find("i"); |
21 | | - var $elHeader = $el.find("table"); |
22 | 21 | var $elListWrapper = $el.find(".thread-list"); |
23 | | - var $elList = $elListWrapper.find("tbody"); |
24 | 22 | var $elEmpty = $el.find(".panel-body"); |
| 23 | + var $elDetailMessage = $el.find(".detail-message"); |
25 | 24 | var $elTextarea = $el.find("textarea"); |
26 | 25 | var oRefListAjax = { |
27 | 26 | "obj": null, |
|
31 | 30 | "obj": null, |
32 | 31 | "ing": false |
33 | 32 | }; |
34 | | - var applicationName = ""; |
| 33 | + var currentAgentId = ""; |
| 34 | + var currentApplicationName = ""; |
35 | 35 |
|
36 | 36 | $el.draggable({ |
37 | 37 | handle: ".panel-heading" |
38 | 38 | }); |
| 39 | + scope.threadList = []; |
| 40 | + scope.sortType = "-execTime"; |
39 | 41 |
|
40 | 42 | initLayerSizeNPosition(); |
41 | 43 | function initAjax( oRef, bForceAbort ) { |
|
48 | 50 | oRef.ing = false; |
49 | 51 | } |
50 | 52 | scope.$on( "thread-dump-info-layer.open", function( event, appName, agentId ) { |
51 | | - // 이미 오픈된 상태면 "Loading..."을 어딘가에 표시 |
52 | | - // 기존 요청이 끝나지 않았으면 취소 후 새로운 요청 생성 |
53 | 53 | initAjax( oRefListAjax, true ); |
54 | 54 | if ( $el.is(":visible") ) { |
55 | 55 | $elSpin.show(); |
56 | 56 | } |
57 | | - applicationName = appName; |
| 57 | + currentApplicationName = appName; |
| 58 | + currentAgentId = agentId; |
58 | 59 | oRefListAjax.obj = $http( { |
59 | 60 | "url": cfg.ACTIVE_THREAD_LIGHT_DUMP_URL + |
60 | 61 | "?applicationName=" + appName + |
61 | 62 | "&agentId=" + agentId, |
62 | 63 | "method": "GET" |
63 | 64 | }).then(function ( oResult ) { |
64 | | - var aThread = oResult.data.message.threadDumpData; |
65 | | - if ( aThread.length === 0 ) { |
66 | | - hideContent(); |
67 | | - $elEmpty.show(); |
68 | | - $elTextarea.val(""); |
69 | | - } else { |
70 | | - $elList.empty(); |
71 | | - addThreadDumpData( aThread, agentId ); |
72 | | - $elEmpty.hide(); |
73 | | - showContent(); |
74 | | - } |
| 65 | + scope.threadList = oResult.data.message.threadDumpData; |
| 66 | + $elTextarea.val(""); |
75 | 67 | $elSpin.hide(); |
76 | 68 | $el.show(); |
77 | 69 | initAjax( oRefListAjax ); |
|
86 | 78 | scope.hideThreadDump(); |
87 | 79 | }); |
88 | 80 |
|
| 81 | + scope.changeSortType = function( type ) { |
| 82 | + scope.sortType = ( scope.sortType.indexOf( type ) <= 0 ? "-" : "" ) + type; |
| 83 | + }; |
89 | 84 | scope.hideThreadDump = function() { |
90 | 85 | initAjax( oRefListAjax, true ); |
91 | 86 | initAjax( oRefDetailAjax, true ); |
92 | 87 | $el.hide(); |
93 | 88 | $elSpin.hide(); |
94 | | - hideContent(); |
| 89 | + $elTextarea.val(""); |
95 | 90 | }; |
96 | 91 |
|
97 | 92 | scope.loadDetailMessage = function( $event ) { |
98 | 93 | var $elThread = $($( $event.target ).parents("tr")[0]); |
| 94 | + $elThread.parent().find(".selected").removeClass("selected").end().end().addClass("selected"); |
99 | 95 | if ( $elThread.attr("data-detail-message") ) { |
100 | | - $elTextarea.val($elThread.attr("data-detail-message")).show(); |
| 96 | + $elTextarea.val($elThread.attr("data-detail-message")); |
101 | 97 | } else { |
102 | 98 | $elSpin.show(); |
103 | 99 | initAjax( oRefDetailAjax, true ); |
104 | 100 | oRefDetailAjax.obj = $http( { |
105 | 101 | "url": cfg.ACTIVE_THREAD_DUMP_URL + |
106 | | - "?applicationName=" + applicationName + |
107 | | - "&agentId=" + $elThread.attr("data-agent") + |
108 | | - "&threadName=" + $elThread.next().find("td:nth-child(1)").html() + |
109 | | - "&localTraceId=" + $elThread.next().attr("data-traceId"), |
| 102 | + "?applicationName=" + currentApplicationName + |
| 103 | + "&agentId=" + currentAgentId + |
| 104 | + "&threadName=" + $elThread.find("td:nth-child(3)").html() + |
| 105 | + "&localTraceId=" + $elThread.attr("data-traceId"), |
110 | 106 | "method": "GET" |
111 | 107 | }).then(function ( oResult ) { |
112 | | - $elThread.find("button span").removeClass("glyphicon-repeat").addClass("glyphicon-ok-circle"); |
113 | 108 | var msg = ""; |
114 | 109 | if ( oResult.data.message.threadDumpData.length > 0 ) { |
115 | 110 | msg = oResult.data.message.threadDumpData[0].detailMessage; |
116 | 111 | } else { |
117 | 112 | msg = "There is no message"; |
118 | 113 | } |
119 | 114 | $elThread.attr("data-detail-message", msg ); |
120 | | - $elTextarea.val( msg ).show(); |
| 115 | + $elTextarea.val( msg ); |
121 | 116 | initAjax( oRefDetailAjax ); |
122 | 117 | $elSpin.hide(); |
123 | 118 | }, function () { |
124 | 119 | $elSpin.hide(); |
125 | | - console.log( arguments ); |
126 | 120 | }); |
127 | 121 | oRefDetailAjax.ing = true; |
128 | 122 | } |
129 | 123 | }; |
130 | | - |
131 | | - function addThreadDumpData( aThread, agentId ) { |
132 | | - for( var i = 0 ; i < aThread.length ; i++ ) { |
133 | | - $elList.append( |
134 | | - '<tr data-agent="' + agentId + '">' + |
135 | | - '<td rowspan="2">' + (i + 1 ) + '</td>' + |
136 | | - '<td>' + aThread[i].threadId + '</td>' + |
137 | | - '<td>' + aThread[i].threadState + '</td>' + |
138 | | - '<td>' + CommonUtilService.formatDate(aThread[i].startTime, "MM/DD HH:mm:ss SSS") + '</td>' + |
139 | | - '<td>' + aThread[i].entryPoint + '</td>' + |
140 | | - '<td rowspan="2"><button class="btn btn-xs btn-default"><span class="glyphicon glyphicon-repeat"></span></button></td>' + |
141 | | - '</tr>' + |
142 | | - '<tr data-traceId="' + aThread[i].localTraceId + '">' + |
143 | | - '<td>' + aThread[i].threadName + '</td>' + |
144 | | - '<td>' + aThread[i].sampled + '</td>' + |
145 | | - '<td>' + aThread[i].execTime + '</td>' + |
146 | | - '<td>' + aThread[i].transactionId + '</td>' + |
147 | | - '</tr>' |
148 | | - ); |
149 | | - } |
150 | | - } |
| 124 | + scope.formatDate = function( startTime ) { |
| 125 | + return CommonUtilService.formatDate(startTime, "MM/DD HH:mm:ss SSS"); |
| 126 | + }; |
151 | 127 | function initLayerSizeNPosition() { |
152 | 128 | var docWidth = $window.document.body.clientWidth; |
153 | 129 | var docHeight = $window.document.body.clientHeight; |
154 | 130 | var paddingWidthPixel = parseInt(( cfg.PADDING_WIDTH * docWidth ) / 100); |
155 | 131 | var paddingHeightPixel = parseInt(( cfg.PADDING_HEIGHT * docHeight ) / 100); |
| 132 | + var titleHeight = 78; |
156 | 133 |
|
157 | 134 | var layerWidth = docWidth - ( paddingWidthPixel * 2 ); |
158 | 135 | var layerHeight = docHeight - ( paddingHeightPixel * 2 ); |
159 | | - var layerHeightHalf = parseInt( layerHeight / 2 ); |
| 136 | + var layerHeightHalf = parseInt( (layerHeight - titleHeight) / 2 ); |
160 | 137 |
|
161 | | - // title: 41 |
162 | | - // thead: 50 |
| 138 | + // thead: 67 |
163 | 139 | $el.css({ |
164 | 140 | "top": paddingHeightPixel, |
165 | 141 | "left": paddingWidthPixel, |
166 | 142 | "width": layerWidth, |
167 | | - "height": layerHeightHalf |
| 143 | + "height": layerHeight |
168 | 144 | }); |
169 | 145 | $elListWrapper.css({ |
170 | | - "height": layerHeightHalf - 91 |
| 146 | + "height": layerHeightHalf - 67 - 30 |
171 | 147 | }); |
172 | 148 | $elEmpty.css({ |
173 | | - "height": layerHeightHalf - 41 |
| 149 | + "height": layerHeightHalf |
174 | 150 | }); |
175 | | - $elTextarea.css({ |
| 151 | + $elDetailMessage.css({ |
176 | 152 | "height": layerHeightHalf |
177 | 153 | }); |
178 | 154 | } |
179 | | - function hideContent() { |
180 | | - $elHeader.hide(); |
181 | | - $elListWrapper.hide(); |
182 | | - $elTextarea.hide().val(""); |
183 | | - } |
184 | | - function showContent() { |
185 | | - $elHeader.show(); |
186 | | - $elListWrapper.show(); |
187 | | - } |
188 | 155 | } |
189 | 156 | }; |
190 | 157 | } |
|
0 commit comments