package com.sohu.cache.web.controller; import com.sohu.cache.alert.InstanceAlertService; import com.sohu.cache.entity.*; import com.sohu.cache.redis.RedisCenter; import com.sohu.cache.stats.app.AppStatsCenter; import com.sohu.cache.stats.instance.InstanceStatsCenter; import com.sohu.cache.util.ConstUtils; import com.sohu.cache.web.vo.RedisSlowLog; import com.sohu.cache.web.chart.key.ChartKeysUtil; import com.sohu.cache.web.chart.model.SplineChartEntity; import com.sohu.cache.web.util.DateUtil; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.lang.time.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.text.ParseException; import java.util.*; /** * Created by hym on 14-7-27. */ @Controller @RequestMapping("/admin/instance") public class InstanceController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Resource(name = "instanceStatsCenter") private InstanceStatsCenter instanceStatsCenter; @Resource(name = "appStatsCenter") private AppStatsCenter appStatsCenter; @Resource(name = "redisCenter") private RedisCenter redisCenter; @Resource private InstanceAlertService instanceAlertService; @RequestMapping("/index") public ModelAndView index(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId, Long appId, String tabTag) { String startDateParam = request.getParameter("startDate"); String endDateParam = request.getParameter("endDate"); if (StringUtils.isBlank(startDateParam) || StringUtils.isBlank(endDateParam)) { Date endDate = new Date(); Date startDate = DateUtils.addDays(endDate, -1); startDateParam = DateUtil.formatDate(startDate, "yyyyMMdd"); endDateParam = DateUtil.formatDate(endDate, "yyyyMMdd"); } model.addAttribute("startDate", startDateParam); model.addAttribute("endDate", endDateParam); if (instanceId != null && instanceId > 0) { model.addAttribute("instanceId", instanceId); InstanceInfo instanceInfo = instanceStatsCenter.getInstanceInfo(instanceId); if (instanceInfo == null) { model.addAttribute("type", -1); } else { if (appId != null && appId > 0) { model.addAttribute("appId", appId); } else { model.addAttribute("appId", instanceInfo.getAppId()); } model.addAttribute("type", instanceInfo.getType()); } } else { } if (tabTag != null) { model.addAttribute("tabTag", tabTag); } return new ModelAndView("instance/instanceIndex"); } @RequestMapping("/stat") public ModelAndView stat(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId) { String startDateParam = request.getParameter("startDate"); String endDateParam = request.getParameter("endDate"); if (StringUtils.isBlank(startDateParam) || StringUtils.isBlank(endDateParam)) { Date endDate = new Date(); Date startDate = DateUtils.addDays(endDate, -1); startDateParam = DateUtil.formatDate(startDate, "yyyyMMdd"); endDateParam = DateUtil.formatDate(endDate, "yyyyMMdd"); } model.addAttribute("startDate", startDateParam); model.addAttribute("endDate", endDateParam); if (instanceId != null && instanceId > 0) { model.addAttribute("instanceId", instanceId); InstanceInfo instanceInfo = instanceStatsCenter.getInstanceInfo(instanceId); model.addAttribute("instanceInfo", instanceInfo); model.addAttribute("appId", instanceInfo.getAppId()); model.addAttribute("appDetail", appStatsCenter.getAppDetail(instanceInfo.getAppId())); InstanceStats instanceStats = instanceStatsCenter.getInstanceStats(instanceId); model.addAttribute("instanceStats", instanceStats); List<AppCommandStats> topLimitAppCommandStatsList = appStatsCenter.getTopLimitAppCommandStatsList(instanceInfo.getAppId(), Long.parseLong(startDateParam) * 10000, Long.parseLong(endDateParam) * 10000, 5); model.addAttribute("appCommandStats", topLimitAppCommandStatsList); } return new ModelAndView("instance/instanceStat"); } @RequestMapping("/advancedAnalysis") public ModelAndView advancedAnalysis(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId) { String startDateParam = request.getParameter("startDate"); String endDateParam = request.getParameter("endDate"); if (StringUtils.isBlank(startDateParam) || StringUtils.isBlank(endDateParam)) { Date endDate = new Date(); Date startDate = DateUtils.addDays(endDate, -1); startDateParam = DateUtil.formatDate(startDate, "yyyyMMdd"); endDateParam = DateUtil.formatDate(endDate, "yyyyMMdd"); } model.addAttribute("startDate", startDateParam); model.addAttribute("endDate", endDateParam); if (instanceId != null && instanceId > 0) { model.addAttribute("instanceId", instanceId); InstanceInfo instanceInfo = instanceStatsCenter.getInstanceInfo(instanceId); model.addAttribute("instanceInfo", instanceInfo); model.addAttribute("appId", instanceInfo.getAppId()); List<AppCommandStats> topLimitAppCommandStatsList = appStatsCenter.getTopLimitAppCommandStatsList(instanceInfo.getAppId(), Long.parseLong(startDateParam) * 10000, Long.parseLong(endDateParam) * 10000, 5); model.addAttribute("appCommandStats", topLimitAppCommandStatsList); } else { } return new ModelAndView("instance/instanceAdvancedAnalysis"); } /** * 获取某个命令时间分布图 * * @param instanceId 实例id * @param commandName 命令名称 * @throws java.text.ParseException */ @RequestMapping("/getCommandStats") public ModelAndView getCommandStats(HttpServletRequest request, HttpServletResponse response, Model model, Long instanceId, String commandName) throws ParseException { String startDateParam = request.getParameter("startDate"); String endDateParam = request.getParameter("endDate"); if (StringUtils.isBlank(startDateParam) || StringUtils.isBlank(endDateParam)) { Date endDate = new Date(); Date startDate = DateUtils.addDays(endDate, -1); startDateParam = DateUtil.formatDate(startDate, "yyyyMMdd"); endDateParam = DateUtil.formatDate(endDate, "yyyyMMdd"); } model.addAttribute("startDate", startDateParam); model.addAttribute("endDate", endDateParam); Date startDate = DateUtil.parseYYYYMMdd(startDateParam); Date endDate = DateUtil.parseYYYYMMdd(endDateParam); if (instanceId != null) { long firstDayBegin = NumberUtils.toLong(DateUtil.formatYYYYMMdd(startDate) + "0000"); long firstDayEnd = NumberUtils.toLong(DateUtil.formatYYYYMMdd(startDate) + "2359"); long secondDayBegin = NumberUtils.toLong(DateUtil.formatYYYYMMdd(endDate) + "0000"); long secondDayEnd = NumberUtils.toLong(DateUtil.formatYYYYMMdd(endDate) + "2359"); long bt = System.currentTimeMillis(); List<InstanceCommandStats> instanceCommandStatsListFirst = instanceStatsCenter .getCommandStatsList(instanceId, firstDayBegin, firstDayEnd, commandName); List<InstanceCommandStats> instanceCommandStatsListSecond = instanceStatsCenter .getCommandStatsList(instanceId, secondDayBegin, secondDayEnd, commandName); long et = System.currentTimeMillis() - bt; Map<String, InstanceCommandStats> cmdStatsFirst = new HashMap<String, InstanceCommandStats>(); Map<String, InstanceCommandStats> cmdStatsSecond = new HashMap<String, InstanceCommandStats>(); for (InstanceCommandStats first : instanceCommandStatsListFirst) { cmdStatsFirst.put(first.getCollectTime() + "", first); } for (InstanceCommandStats second : instanceCommandStatsListSecond) { cmdStatsSecond.put(second.getCollectTime() + "", second); } SplineChartEntity splineChartEntity = new SplineChartEntity(); String container = request.getParameter("container"); if (container != null) { splineChartEntity.renderTo(container); } model.addAttribute("chart", splineChartEntity); splineChartEntity.putTitle(ChartKeysUtil.TitleKey.TEXT.getKey(), "命令:" + commandName + " 的比较曲线【" + startDateParam + "】-【" + endDateParam + "】"); splineChartEntity.setYAxisTitle("y"); List<Long> data1 = new ArrayList<Long>(); List<Long> data2 = new ArrayList<Long>(); Map<String, Object> serie1 = new HashMap<String, Object>(); serie1.put("name", startDateParam); serie1.put("data", data1); // serie1.put("type", "area"); Map<String, Object> serie2 = new HashMap<String, Object>(); serie2.put("name", endDateParam); serie2.put("data", data2); // serie2.put("type", "area"); splineChartEntity.putSeries(serie1); splineChartEntity.putSeries(serie2); List<Object> x = new LinkedList<Object>(); for (int i = 0; i < 1440; i += 1) { Date date = DateUtils.addMinutes(startDate, i); String s = DateUtil.formatHHMM(date); if (cmdStatsFirst.containsKey(startDateParam + s)) { data1.add(cmdStatsFirst.get(startDateParam + s).getCommandCount()); } else { data1.add(0l); } if (cmdStatsSecond.containsKey(endDateParam + s)) { data2.add(cmdStatsSecond.get(endDateParam + s).getCommandCount()); } else { data2.add(0l); } x.add(s); } splineChartEntity.setXAxisCategories(x); } return new ModelAndView(""); } /** * 获取某个命令时间分布图 * * @param instanceId 实例id * @param commandName 命令名称 * @throws java.text.ParseException */ @RequestMapping("/getCommandStatsV2") public ModelAndView getCommandStatsV2(HttpServletRequest request, HttpServletResponse response, Model model, Long instanceId, String commandName) throws ParseException { String startDateParam = request.getParameter("startDate"); String endDateParam = request.getParameter("endDate"); if (StringUtils.isBlank(startDateParam) || StringUtils.isBlank(endDateParam)) { Date endDate = new Date(); Date startDate = DateUtils.addDays(endDate, -1); startDateParam = DateUtil.formatDate(startDate, "yyyyMMdd"); endDateParam = DateUtil.formatDate(endDate, "yyyyMMdd"); } model.addAttribute("startDate", startDateParam); model.addAttribute("endDate", endDateParam); Date startDate = DateUtil.parseYYYYMMdd(startDateParam); Date endDate = DateUtil.parseYYYYMMdd(endDateParam); if (instanceId != null) { long firstDayBegin = NumberUtils.toLong(DateUtil.formatYYYYMMdd(startDate) + "0000"); long firstDayEnd = NumberUtils.toLong(DateUtil.formatYYYYMMdd(startDate) + "2359"); long secondDayBegin = NumberUtils.toLong(DateUtil.formatYYYYMMdd(endDate) + "0000"); long secondDayEnd = NumberUtils.toLong(DateUtil.formatYYYYMMdd(endDate) + "2359"); long bt = System.currentTimeMillis(); List<InstanceCommandStats> instanceCommandStatsListFirst = instanceStatsCenter .getCommandStatsList(instanceId, firstDayBegin, firstDayEnd, commandName); List<InstanceCommandStats> instanceCommandStatsListSecond = instanceStatsCenter .getCommandStatsList(instanceId, secondDayBegin, secondDayEnd, commandName); long et = System.currentTimeMillis() - bt; Map<String, InstanceCommandStats> cmdStatsFirst = new HashMap<String, InstanceCommandStats>(); Map<String, InstanceCommandStats> cmdStatsSecond = new HashMap<String, InstanceCommandStats>(); for (InstanceCommandStats first : instanceCommandStatsListFirst) { cmdStatsFirst.put(first.getCollectTime() + "", first); } for (InstanceCommandStats second : instanceCommandStatsListSecond) { cmdStatsSecond.put(second.getCollectTime() + "", second); } SplineChartEntity splineChartEntity = new SplineChartEntity(); String container = request.getParameter("container"); if (container != null) { splineChartEntity.renderTo(container); } model.addAttribute("chart", splineChartEntity); splineChartEntity.putTitle(ChartKeysUtil.TitleKey.TEXT.getKey(), "命令:" + commandName + " 的比较曲线【" + startDateParam + "】-【" + endDateParam + "】"); splineChartEntity.setYAxisTitle("y"); List<Long> data1 = new ArrayList<Long>(); List<Long> data2 = new ArrayList<Long>(); Map<String, Object> marker = new HashMap<String, Object>(); marker.put("radius", 1); Map<String, Object> serie1 = new HashMap<String, Object>(); serie1.put("name", startDateParam); serie1.put("data", data1); serie1.put("marker", marker); Map<String, Object> serie2 = new HashMap<String, Object>(); serie2.put("name", endDateParam); serie2.put("data", data2); serie2.put("marker", marker); splineChartEntity.putSeries(serie1); splineChartEntity.putSeries(serie2); List<Object> x = new LinkedList<Object>(); for (int i = 0; i < 1440; i += 1) { Date date = DateUtils.addMinutes(startDate, i); String s = DateUtil.formatHHMM(date); if (cmdStatsFirst.containsKey(startDateParam + s)) { data1.add(cmdStatsFirst.get(startDateParam + s).getCommandCount()); } else { data1.add(0l); } if (cmdStatsSecond.containsKey(endDateParam + s)) { data2.add(cmdStatsSecond.get(endDateParam + s).getCommandCount()); } else { data2.add(0l); } x.add(s); } splineChartEntity.setXAxisCategories(x); } return new ModelAndView(""); } @RequestMapping("/fault") public ModelAndView fault(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Integer instanceId, Long appId) { //String startDateParam = request.getParameter("startDate"); //String endDateParam = request.getParameter("endDate"); List<InstanceFault> list = null; try { list = instanceAlertService.getListByInstId(instanceId); } catch (Exception e) { logger.error(e.getMessage(), e); } if (list == null) { list = new ArrayList<InstanceFault>(); } model.addAttribute("list", list); return new ModelAndView("instance/instanceFault"); } @RequestMapping("/configSelect") public ModelAndView configSelect(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId, Long appId) { if (instanceId != null && instanceId > 0) { model.addAttribute("instanceId", instanceId); Map<String, String> redisConfigList = redisCenter.getRedisConfigList(instanceId.intValue()); model.addAttribute("redisConfigList", redisConfigList); } if (appId != null && appId > 0) { model.addAttribute("appId", appId); } return new ModelAndView("instance/instanceConfigSelect"); } @RequestMapping("/slowSelect") public ModelAndView slowSelect(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId) { if (instanceId != null && instanceId > 0) { model.addAttribute("instanceId", instanceId); List<RedisSlowLog> redisSlowLogs = redisCenter.getRedisSlowLogs(instanceId.intValue(), -1); model.addAttribute("redisSlowLogs", redisSlowLogs); } return new ModelAndView("instance/instanceSlowSelect"); } @RequestMapping("/clientList") public ModelAndView clientList(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId) { if (instanceId != null && instanceId > 0) { model.addAttribute("instanceId", instanceId); List<String> clientList = redisCenter.getClientList(instanceId.intValue()); model.addAttribute("clientList", clientList); } return new ModelAndView("instance/instanceClientList"); } @RequestMapping("/command") public ModelAndView command(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId, Long appId) { if (instanceId != null && instanceId > 0) { model.addAttribute("instanceId", instanceId); } return new ModelAndView("instance/instanceCommand"); } @RequestMapping("/commandExecute") public ModelAndView commandExecute(HttpServletRequest request, HttpServletResponse response, Model model, Integer admin, Long instanceId, Long appId) { if (instanceId != null && instanceId > 0) { model.addAttribute("instanceId", instanceId); String command = request.getParameter("command"); String result = instanceStatsCenter.executeCommand(instanceId, command); model.addAttribute("result", result); } else { model.addAttribute("result", "error"); } return new ModelAndView("instance/commandExecute"); } }