/* * Copyright 2014 NAVER Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.navercorp.pinpoint.web.controller; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.navercorp.pinpoint.common.service.ServiceTypeRegistryService; import com.navercorp.pinpoint.common.util.DateUtils; import com.navercorp.pinpoint.common.util.TransactionId; import com.navercorp.pinpoint.web.applicationmap.ApplicationMap; import com.navercorp.pinpoint.web.applicationmap.FilterMapWrap; import com.navercorp.pinpoint.web.filter.Filter; import com.navercorp.pinpoint.web.filter.FilterBuilder; import com.navercorp.pinpoint.web.service.FilteredMapService; import com.navercorp.pinpoint.web.util.LimitUtils; import com.navercorp.pinpoint.web.util.TimeUtils; import com.navercorp.pinpoint.web.vo.LimitedScanResult; import com.navercorp.pinpoint.web.vo.Range; /** * * @author emeroad * @author netspider */ @Controller public class FilteredMapController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private FilteredMapService filteredMapService; @Autowired private FilterBuilder filterBuilder; @Autowired private ServiceTypeRegistryService registry; /** * filtered server map data query within from ~ to timeframe * * @param applicationName * @param serviceTypeCode * @param from * @param to * @param filterText * @param limit * @return */ @RequestMapping(value = "/getFilteredServerMapData", method = RequestMethod.GET, params="serviceTypeCode") @ResponseBody public FilterMapWrap getFilteredServerMapData( @RequestParam("applicationName") String applicationName, @RequestParam("serviceTypeCode") short serviceTypeCode, @RequestParam("from") long from, @RequestParam("to") long to, @RequestParam("originTo") long originTo, @RequestParam(value = "filter", required = false) String filterText, @RequestParam(value = "hint", required = false) String filterHint, @RequestParam(value = "limit", required = false, defaultValue = "10000") int limit) { String serviceTypeName = registry.findServiceType(serviceTypeCode).getName(); return getFilteredServerMapData(applicationName, serviceTypeName, from, to, originTo, filterText, filterHint, limit); } /** * filtered server map data query within from ~ to timeframe * * @param applicationName * @param serviceTypeName * @param from * @param to * @param filterText * @param limit * @return */ @RequestMapping(value = "/getFilteredServerMapData", method = RequestMethod.GET, params="serviceTypeName") @ResponseBody public FilterMapWrap getFilteredServerMapData( @RequestParam("applicationName") String applicationName, @RequestParam("serviceTypeName") String serviceTypeName, @RequestParam("from") long from, @RequestParam("to") long to, @RequestParam("originTo") long originTo, @RequestParam(value = "filter", required = false) String filterText, @RequestParam(value = "hint", required = false) String filterHint, @RequestParam(value = "limit", required = false, defaultValue = "10000") int limit) { limit = LimitUtils.checkRange(limit); final Filter filter = filterBuilder.build(filterText, filterHint); final Range range = new Range(from, to); final LimitedScanResult<List<TransactionId>> limitedScanResult = filteredMapService.selectTraceIdsFromApplicationTraceIndex(applicationName, range, limit); final long lastScanTime = limitedScanResult.getLimitedTime(); // original range: needed for visual chart data sampling final Range originalRange = new Range(from, originTo); // needed to figure out already scanned ranged final Range scannerRange = new Range(lastScanTime, to); logger.debug("originalRange:{} scannerRange:{} ", originalRange, scannerRange); ApplicationMap map = filteredMapService.selectApplicationMap(limitedScanResult.getScanData(), originalRange, scannerRange, filter); if (logger.isDebugEnabled()) { logger.debug("getFilteredServerMapData range scan(limit:{}) range:{} lastFetchedTimestamp:{}", limit, range.prettyToString(), DateUtils.longToDateStr(lastScanTime)); } FilterMapWrap mapWrap = new FilterMapWrap(map); mapWrap.setLastFetchedTimestamp(lastScanTime); return mapWrap; } @RequestMapping(value = "/getFilteredServerMapDataMadeOfDotGroup", method = RequestMethod.GET, params="serviceTypeCode") @ResponseBody public FilterMapWrap getFilteredServerMapDataMadeOfDotGroup( @RequestParam("applicationName") String applicationName, @RequestParam("serviceTypeCode") short serviceTypeCode, @RequestParam("from") long from, @RequestParam("to") long to, @RequestParam("originTo") long originTo, @RequestParam("xGroupUnit") int xGroupUnit, @RequestParam("yGroupUnit") int yGroupUnit, @RequestParam(value = "filter", required = false) String filterText, @RequestParam(value = "hint", required = false) String filterHint, @RequestParam(value = "limit", required = false, defaultValue = "10000") int limit) { String serviceTypeName = registry.findServiceType(serviceTypeCode).getName(); return getFilteredServerMapDataMadeOfDotGroup(applicationName, serviceTypeName, from, to, originTo, xGroupUnit, yGroupUnit, filterText, filterHint, limit); } @RequestMapping(value = "/getFilteredServerMapDataMadeOfDotGroup", method = RequestMethod.GET, params="serviceTypeName") @ResponseBody public FilterMapWrap getFilteredServerMapDataMadeOfDotGroup( @RequestParam("applicationName") String applicationName, @RequestParam("serviceTypeName") String serviceTypeName, @RequestParam("from") long from, @RequestParam("to") long to, @RequestParam("originTo") long originTo, @RequestParam("xGroupUnit") int xGroupUnit, @RequestParam("yGroupUnit") int yGroupUnit, @RequestParam(value = "filter", required = false) String filterText, @RequestParam(value = "hint", required = false) String filterHint, @RequestParam(value = "limit", required = false, defaultValue = "10000") int limit) { if (xGroupUnit <= 0) { throw new IllegalArgumentException("xGroupUnit(" + xGroupUnit + ") must be positive number"); } if (yGroupUnit <= 0) { throw new IllegalArgumentException("yGroupUnit(" + yGroupUnit + ") must be positive number"); } limit = LimitUtils.checkRange(limit); final Filter filter = filterBuilder.build(filterText, filterHint); final Range range = new Range(from, to); final LimitedScanResult<List<TransactionId>> limitedScanResult = filteredMapService.selectTraceIdsFromApplicationTraceIndex(applicationName, range, limit); final long lastScanTime = limitedScanResult.getLimitedTime(); // original range: needed for visual chart data sampling final Range originalRange = new Range(from, originTo); // needed to figure out already scanned ranged final Range scannerRange = new Range(lastScanTime, to); logger.debug("originalRange:{} scannerRange:{} ", originalRange, scannerRange); ApplicationMap map = filteredMapService.selectApplicationMapWithScatterData(limitedScanResult.getScanData(), originalRange, scannerRange, xGroupUnit, yGroupUnit, filter); if (logger.isDebugEnabled()) { logger.debug("getFilteredServerMapData range scan(limit:{}) range:{} lastFetchedTimestamp:{}", limit, range.prettyToString(), DateUtils.longToDateStr(lastScanTime)); } FilterMapWrap mapWrap = new FilterMapWrap(map); mapWrap.setLastFetchedTimestamp(lastScanTime); return mapWrap; } /** * filtered server map data query for the last "Period" up to now * * * @param applicationName * @param serviceTypeCode * @param filterText * @param limit * @return */ @RequestMapping(value = "/getLastFilteredServerMapData", method = RequestMethod.GET, params="serviceTypeCode") @ResponseBody public FilterMapWrap getLastFilteredServerMapData( @RequestParam("applicationName") String applicationName, @RequestParam("serviceTypeCode") short serviceTypeCode, @RequestParam("period") long period, @RequestParam(value = "filter", required = false) String filterText, @RequestParam(value = "hint", required = false) String filterHint, @RequestParam(value = "limit", required = false, defaultValue = "1000000") int limit) { String serviceTypeName = this.registry.findServiceType(serviceTypeCode).getName(); return getLastFilteredServerMapData(applicationName, serviceTypeName, period, filterText, filterHint, limit); } /** * filtered server map data query for the last "Period" up to now * * * @param applicationName * @param serviceTypeName * @param filterText * @param limit * @return */ @RequestMapping(value = "/getLastFilteredServerMapData", method = RequestMethod.GET, params="serviceTypeName") @ResponseBody public FilterMapWrap getLastFilteredServerMapData( @RequestParam("applicationName") String applicationName, @RequestParam("serviceTypeName") String serviceTypeName, @RequestParam("period") long period, @RequestParam(value = "filter", required = false) String filterText, @RequestParam(value = "hint", required = false) String filterHint, @RequestParam(value = "limit", required = false, defaultValue = "1000000") int limit) { limit = LimitUtils.checkRange(limit); long to = TimeUtils.getDelayLastTime(); long from = to - period; // TODO: since realtime query is enabled for now, calling parameters are fixed as "..., to, to, ..." // may need additional @RequestParam("originTo") return getFilteredServerMapData(applicationName, serviceTypeName, from, to, to, filterText, filterHint, limit); } }