Skip to content

Commit 8f8bd82

Browse files
committed
Merge pull request pinpoint-apm#1371 from jaehong-kim/jsp-to-json
Jsp to json
2 parents cabedb9 + f8a4b7e commit 8f8bd82

18 files changed

+561
-701
lines changed

‎web/src/main/java/com/navercorp/pinpoint/web/controller/BusinessTransactionController.java‎

Lines changed: 6 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.navercorp.pinpoint.common.util.DefaultSqlParser;
2626
import com.navercorp.pinpoint.common.util.OutputParameterParser;
2727
import com.navercorp.pinpoint.common.util.SqlParser;
28+
import com.navercorp.pinpoint.web.view.TransactionInfoViewModel;
2829
import org.slf4j.Logger;
2930
import org.slf4j.LoggerFactory;
3031
import org.springframework.beans.factory.annotation.Autowired;
@@ -89,61 +90,6 @@ public class BusinessTransactionController {
8990
private SqlParser sqlParser = new DefaultSqlParser();
9091
private OutputParameterParser parameterParser = new OutputParameterParser();
9192

92-
/**
93-
* executed URLs in applicationname query within from ~ to timeframe
94-
*
95-
* @param model
96-
* @param applicationName
97-
* @param from
98-
* @param to
99-
* @return
100-
*/
101-
@Deprecated
102-
@RequestMapping(value = "/transactionList", method = RequestMethod.GET)
103-
@ResponseBody
104-
public Model getBusinessTransactionsData(Model model,
105-
@RequestParam("application") String applicationName,
106-
@RequestParam("from") long from,
107-
@RequestParam("to") long to,
108-
@RequestParam(value = "filter", required = false) String filterText,
109-
@RequestParam(value = "limit", required = false, defaultValue = "10000") int limit) {
110-
limit = LimitUtils.checkRange(limit);
111-
Range range = new Range(from, to);
112-
// TODO more refactoring needed: partially separated out server map lookup logic.
113-
LimitedScanResult<List<TransactionId>> traceIdList = filteredMapService.selectTraceIdsFromApplicationTraceIndex(applicationName, range, limit);
114-
115-
Filter filter = filterBuilder.build(filterText);
116-
BusinessTransactions selectBusinessTransactions = transactionInfoService.selectBusinessTransactions(traceIdList.getScanData(), applicationName, range, filter);
117-
118-
model.addAttribute("lastFetchedTimestamp", traceIdList.getLimitedTime());
119-
model.addAttribute("rpcList", selectBusinessTransactions.getBusinessTransaction());
120-
model.addAttribute("requestList", selectBusinessTransactions.getBusinessTransaction());
121-
model.addAttribute("scatterList", selectBusinessTransactions.getBusinessTransaction());
122-
model.addAttribute("applicationName", applicationName);
123-
model.addAttribute("from", new Date(from));
124-
model.addAttribute("to", new Date(to));
125-
model.addAttribute("urlCount", selectBusinessTransactions.getURLCount());
126-
model.addAttribute("totalCount", selectBusinessTransactions.getTotalCallCount());
127-
model.addAttribute("filterText", filterText);
128-
model.addAttribute("filter", filter);
129-
// Deprecated jsp -> need json dump
130-
return model;
131-
}
132-
133-
@Deprecated
134-
@RequestMapping(value = "/lastTransactionList", method = RequestMethod.GET)
135-
@ResponseBody
136-
public Model getLastBusinessTransactionsData(Model model, HttpServletResponse response,
137-
@RequestParam("application") String applicationName,
138-
@RequestParam("period") long period,
139-
@RequestParam(value = "filter", required = false) String filterText,
140-
@RequestParam(value = "limit", required = false, defaultValue = "10000") int limit) {
141-
limit = LimitUtils.checkRange(limit);
142-
long to = TimeUtils.getDelayLastTime();
143-
long from = to - period;
144-
return getBusinessTransactionsData(model, applicationName, from, to, filterText, limit);
145-
}
146-
14793
/**
14894
* info lookup for a selected transaction
14995
*
@@ -152,63 +98,24 @@ public Model getLastBusinessTransactionsData(Model model, HttpServletResponse re
15298
* @return
15399
*/
154100
@RequestMapping(value = "/transactionInfo", method = RequestMethod.GET)
155-
public ModelAndView transactionInfo(@RequestParam("traceId") String traceIdParam,
101+
@ResponseBody
102+
public TransactionInfoViewModel transactionInfo(@RequestParam("traceId") String traceIdParam,
156103
@RequestParam(value = "focusTimestamp", required = false, defaultValue = "0") long focusTimestamp,
157104
@RequestParam(value = "v", required = false, defaultValue = "0") int viewVersion,
158105
HttpServletResponse response) {
159106
logger.debug("traceId:{}", traceIdParam);
160-
161107
final TransactionId traceId = new TransactionId(traceIdParam);
162108

163109
// select spans
164110
final SpanResult spanResult = this.spanService.selectSpan(traceId, focusTimestamp);
165111
final CallTreeIterator callTreeIterator = spanResult.getCallTree();
166112

167-
if (callTreeIterator.isEmpty()) {
168-
// TODO fix error page.
169-
final ModelAndView error = new ModelAndView();
170-
// redefine errorCode.???
171-
error.addObject("errorCode", 9);
172-
error.addObject("message", "Trace not found. traceId:" + traceId);
173-
error.setViewName("error");
174-
return error;
175-
}
176-
177-
final ModelAndView mv = new ModelAndView();
178-
// debug
179-
mv.addObject("spanList", callTreeIterator.values());
180-
181-
mv.addObject("traceId", traceId);
182-
183113
// application map
184114
ApplicationMap map = filteredMapService.selectApplicationMap(traceId);
185-
mv.addObject("nodes", map.getNodes());
186-
mv.addObject("links", map.getLinks());
187-
188-
// call stacks
189115
RecordSet recordSet = this.transactionInfoService.createRecordSet(callTreeIterator, focusTimestamp);
190-
mv.addObject("recordSet", recordSet);
191-
192-
mv.addObject("applicationName", recordSet.getApplicationName());
193-
mv.addObject("callstack", recordSet.getRecordList());
194-
mv.addObject("timeline", recordSet.getRecordList());
195-
mv.addObject("callstackStart", recordSet.getStartTime());
196-
mv.addObject("callstackEnd", recordSet.getEndTime());
197-
mv.addObject("completeState", spanResult.getCompleteTypeString());
198-
199-
mv.addObject("logLinkEnable", logLinkEnable);
200-
mv.addObject("loggingTransactionInfo", recordSet.isLoggingTransactionInfo());
201-
mv.addObject("logButtonName", logButtonName);
202-
mv.addObject("logPageUrl", logPageUrl);
203-
mv.addObject("disableButtonMessage", disableButtonMessage);
204-
205-
if (viewVersion == 2) {
206-
// TODO remove hashformat
207-
mv.setViewName("transactionInfoJsonHash");
208-
} else {
209-
mv.setViewName("transactionInfoJson");
210-
}
211-
return mv;
116+
117+
TransactionInfoViewModel result = new TransactionInfoViewModel(traceId, map.getNodes(), map.getLinks(), recordSet, spanResult.getCompleteTypeString(), logLinkEnable, logButtonName, logPageUrl, disableButtonMessage);
118+
return result;
212119
}
213120

214121
@RequestMapping(value = "/sqlBind", method = RequestMethod.POST)

‎web/src/main/java/com/navercorp/pinpoint/web/controller/MapController.java‎

Lines changed: 1 addition & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
/**
4949
* @author emeroad
5050
* @author netspider
51+
* @author jaehong.kim
5152
*/
5253
@Controller
5354
public class MapController {
@@ -224,90 +225,4 @@ public MapWrap getLastServerMapData(
224225
Application application = applicationFactory.createApplicationByTypeName(applicationName, serviceTypeName);
225226
return selectApplicationMap(application, range, searchOption);
226227
}
227-
228-
/**
229-
* Possible deprecation expected when UI change push forward to pick a map first from UI
230-
* Unfiltered server map request data query
231-
*
232-
* @param from
233-
* @param to
234-
* @param sourceApplicationName
235-
* @param sourceServiceType
236-
* @param targetApplicationName
237-
* @param targetServiceType
238-
* @return
239-
*/
240-
@Deprecated
241-
@RequestMapping(value = "/linkStatistics", method = RequestMethod.GET, params={"sourceServiceType", "targetServiceType"})
242-
public ModelAndView getLinkStatistics(@RequestParam("from") long from,
243-
@RequestParam("to") long to,
244-
@RequestParam("sourceApplicationName") String sourceApplicationName,
245-
@RequestParam("sourceServiceType") short sourceServiceType,
246-
@RequestParam("targetApplicationName") String targetApplicationName,
247-
@RequestParam("targetServiceType") short targetServiceType) {
248-
final Application sourceApplication = this.applicationFactory.createApplication(sourceApplicationName, sourceServiceType);
249-
final Application destinationApplication = this.applicationFactory.createApplication(targetApplicationName, targetServiceType);
250-
final Range range = new Range(from, to);
251-
return getLinkStatistics(sourceApplication, destinationApplication, range);
252-
}
253-
254-
/**
255-
* Possible deprecation expected when UI change push forward to pick a map first from UI
256-
* Unfiltered server map request data query
257-
*
258-
* @param from
259-
* @param to
260-
* @param sourceApplicationName
261-
* @param sourceServiceTypeName
262-
* @param targetApplicationName
263-
* @param sourceServiceTypeName
264-
* @return
265-
*/
266-
@Deprecated
267-
@RequestMapping(value = "/linkStatistics", method = RequestMethod.GET, params={"sourceServiceTypeName", "targetServiceTypeName"})
268-
public ModelAndView getLinkStatistics(@RequestParam("from") long from,
269-
@RequestParam("to") long to,
270-
@RequestParam("sourceApplicationName") String sourceApplicationName,
271-
@RequestParam("sourceServiceTypeName") String sourceServiceTypeName,
272-
@RequestParam("targetApplicationName") String targetApplicationName,
273-
@RequestParam("targetServiceTypeName") String targetServiceTypeName) {
274-
275-
final Application sourceApplication = this.applicationFactory.createApplicationByTypeName(sourceApplicationName, sourceServiceTypeName);
276-
final Application destinationApplication = this.applicationFactory.createApplicationByTypeName(targetApplicationName, targetServiceTypeName);
277-
final Range range = new Range(from, to);
278-
return getLinkStatistics(sourceApplication, destinationApplication, range);
279-
}
280-
281-
private ModelAndView getLinkStatistics(Application sourceApplication, Application destinationApplication, Range range) {
282-
283-
NodeHistogram nodeHistogram = mapService.linkStatistics(sourceApplication, destinationApplication, range);
284-
285-
final ModelAndView mav = new ModelAndView("linkStatistics");
286-
mav.addObject("range", range);
287-
288-
mav.addObject("sourceApplication", sourceApplication);
289-
290-
mav.addObject("targetApplication", destinationApplication);
291-
292-
Histogram applicationHistogram = nodeHistogram.getApplicationHistogram();
293-
mav.addObject("linkStatistics", applicationHistogram);
294-
295-
296-
List<ResponseTimeViewModel> applicationTimeSeriesHistogram = nodeHistogram.getApplicationTimeHistogram();
297-
String applicationTimeSeriesHistogramJson = null;
298-
try {
299-
applicationTimeSeriesHistogramJson = MAPPER.writeValueAsString(applicationTimeSeriesHistogram);
300-
} catch (IOException e) {
301-
throw new RuntimeException(e.getMessage(), e);
302-
}
303-
mav.addObject("timeSeriesHistogram", applicationTimeSeriesHistogramJson);
304-
305-
// looks like we need to specify "from, to" to the result. but data got passed thru as it is.
306-
mav.addObject("resultFrom", range.getFrom());
307-
mav.addObject("resultTo", range.getTo());
308-
309-
return mav;
310-
}
311-
@Deprecated
312-
private final static ObjectMapper MAPPER = new ObjectMapper();
313228
}

‎web/src/main/java/com/navercorp/pinpoint/web/controller/ScatterChartController.java‎

Lines changed: 9 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.navercorp.pinpoint.web.util.LimitUtils;
3131
import com.navercorp.pinpoint.web.util.TimeUtils;
3232
import com.navercorp.pinpoint.web.util.TimeWindow;
33+
import com.navercorp.pinpoint.web.view.TransactionMetaDataViewModel;
3334
import com.navercorp.pinpoint.web.vo.*;
3435
import com.navercorp.pinpoint.web.vo.scatter.Dot;
3536
import com.navercorp.pinpoint.web.vo.scatter.ScatterIndex;
@@ -43,11 +44,13 @@
4344
import org.springframework.web.bind.annotation.RequestMapping;
4445
import org.springframework.web.bind.annotation.RequestMethod;
4546
import org.springframework.web.bind.annotation.RequestParam;
47+
import org.springframework.web.bind.annotation.ResponseBody;
4648
import org.springframework.web.servlet.ModelAndView;
4749

4850
/**
4951
* @author netspider
5052
* @author emeroad
53+
* @author jaehong.kim
5154
*/
5255
@Controller
5356
public class ScatterChartController {
@@ -270,16 +273,17 @@ public ModelAndView getLastScatterData(
270273
* @return
271274
*/
272275
@RequestMapping(value = "/transactionmetadata", method = RequestMethod.POST)
273-
public String transactionmetadata(Model model, HttpServletRequest request, HttpServletResponse response) {
274-
276+
@ResponseBody
277+
public TransactionMetaDataViewModel transactionmetadata(Model model, HttpServletRequest request, HttpServletResponse response) {
278+
TransactionMetaDataViewModel viewModel = new TransactionMetaDataViewModel();
275279
TransactionMetadataQuery query = parseSelectTransaction(request);
280+
ModelAndView mv = new ModelAndView();
276281
if (query.size() > 0) {
277282
List<SpanBo> metadata = scatter.selectTransactionMetadata(query);
278-
model.addAttribute("metadata", metadata);
283+
viewModel.setSpanBoList(metadata);
279284
}
280285

281-
282-
return "transactionmetadata";
286+
return viewModel;
283287
}
284288

285289
private TransactionMetadataQuery parseSelectTransaction(HttpServletRequest request) {
@@ -300,88 +304,4 @@ private TransactionMetadataQuery parseSelectTransaction(HttpServletRequest reque
300304
logger.debug("query:{}", query);
301305
return query;
302306
}
303-
304-
/**
305-
* transaction list query for selected points in scatter chart
306-
* <p>
307-
* <pre>
308-
* TEST URL = http://localhost:7080/transactionmetadata2.pinpoint?application=FRONT-WEB&from=1394432299032&to=1394433498269&responseFrom=100&responseTo=200&responseOffset=100&limit=10
309-
* </pre>
310-
*
311-
* @param model
312-
* @param request
313-
* @param response
314-
* @return
315-
*/
316-
@RequestMapping(value = "/transactionmetadata2", method = RequestMethod.GET)
317-
public String getTransaction(Model model,
318-
@RequestParam("application") String applicationName,
319-
@RequestParam("from") long from,
320-
@RequestParam("to") long to,
321-
@RequestParam("responseFrom") int responseFrom,
322-
@RequestParam("responseTo") int responseTo,
323-
@RequestParam("limit") int limit,
324-
@RequestParam(value = "offsetTime", required = false, defaultValue = "-1") long offsetTime,
325-
@RequestParam(value = "offsetTransactionId", required = false) String offsetTransactionId,
326-
@RequestParam(value = "offsetTransactionElapsed", required = false, defaultValue = "-1") int offsetTransactionElapsed,
327-
@RequestParam(value = "filter", required = false) String filterText) {
328-
329-
limit = LimitUtils.checkRange(limit);
330-
331-
StopWatch watch = new StopWatch();
332-
watch.start("selectScatterData");
333-
334-
final SelectedScatterArea area = SelectedScatterArea.createUncheckedArea(from, to, responseFrom, responseTo);
335-
logger.debug("fetch scatter data. {}, LIMIT={}, FILTER={}", area, limit, filterText);
336-
337-
if (filterText == null) {
338-
339-
// query data above "limit" first
340-
TransactionId offsetId = null;
341-
List<SpanBo> extraMetadata = null;
342-
if (offsetTransactionId != null) {
343-
offsetId = new TransactionId(offsetTransactionId);
344-
345-
SelectedScatterArea extraArea = SelectedScatterArea.createUncheckedArea(offsetTime, offsetTime, responseFrom, responseTo);
346-
List<Dot> extraAreaDotList = scatter.selectScatterData(applicationName, extraArea, offsetId, offsetTransactionElapsed, limit);
347-
extraMetadata = scatter.selectTransactionMetadata(parseSelectTransaction(extraAreaDotList));
348-
model.addAttribute("extraMetadata", extraMetadata);
349-
}
350-
351-
// query data up to limit
352-
if (extraMetadata == null || extraMetadata.size() < limit) {
353-
int newlimit = limit - ((extraMetadata == null) ? 0 : extraMetadata.size());
354-
List<Dot> selectedDotList = scatter.selectScatterData(applicationName, area, null, -1, newlimit);
355-
List<SpanBo> metadata = scatter.selectTransactionMetadata(parseSelectTransaction(selectedDotList));
356-
model.addAttribute("metadata", metadata);
357-
}
358-
} else {
359-
final LimitedScanResult<List<TransactionId>> limitedScanResult = flow.selectTraceIdsFromApplicationTraceIndex(applicationName, area, limit);
360-
final List<TransactionId> traceIdList = limitedScanResult.getScanData();
361-
logger.trace("submitted transactionId count={}", traceIdList.size());
362-
363-
// TODO: just sorted? we need range check based on tree structure
364-
SortedSet<TransactionId> traceIdSet = new TreeSet<>(traceIdList);
365-
logger.debug("unified traceIdSet size={}", traceIdSet.size());
366-
367-
List<Dot> dots = scatter.selectScatterData(traceIdSet, applicationName, filterBuilder.build(filterText));
368-
}
369-
370-
watch.stop();
371-
logger.info("Fetch scatterData time : {}ms", watch.getLastTaskTimeMillis());
372-
373-
return "transactionmetadata2";
374-
}
375-
376-
private TransactionMetadataQuery parseSelectTransaction(List<Dot> dotList) {
377-
TransactionMetadataQuery query = new TransactionMetadataQuery();
378-
if (dotList == null) {
379-
return query;
380-
}
381-
for (Dot dot : dotList) {
382-
query.addQueryCondition(dot.getTransactionId(), dot.getAcceptedTime(), dot.getElapsedTime());
383-
}
384-
logger.debug("query:{}", query);
385-
return query;
386-
}
387307
}

0 commit comments

Comments
 (0)