/* * Copyright 1999-2011 Alibaba Group. * * 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.alibaba.dubbo.monitor.simple.pages; import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.alibaba.dubbo.common.URL; import com.alibaba.dubbo.container.page.Page; import com.alibaba.dubbo.container.page.PageHandler; import com.alibaba.dubbo.monitor.MonitorService; import com.alibaba.dubbo.monitor.simple.CountUtils; import com.alibaba.dubbo.monitor.simple.SimpleMonitorService; /** * StatisticsPageHandler * * @author william.liangf */ public class StatisticsPageHandler implements PageHandler { public Page handle(URL url) { String service = url.getParameter("service"); if (service == null || service.length() == 0) { throw new IllegalArgumentException("Please input service parameter."); } String date = url.getParameter("date"); if (date == null || date.length() == 0) { date = new SimpleDateFormat("yyyyMMdd").format(new Date()); } String expand = url.getParameter("expand"); List<List<String>> rows = new ArrayList<List<String>>(); String directory = SimpleMonitorService.getInstance().getStatisticsDirectory(); String filename = directory + "/" + date + "/" + service; File serviceDir = new File(filename); if (serviceDir.exists()) { File[] methodDirs = serviceDir.listFiles(); for (File methodDir : methodDirs) { long[] statistics = newStatistics(); Map<String, long[]> expandMap = new HashMap<String, long[]>(); File[] consumerDirs = methodDir.listFiles(); for (File consumerDir : consumerDirs) { long[] expandStatistics = null; if (MonitorService.CONSUMER.equals(expand)) { expandStatistics = newStatistics(); expandMap.put(consumerDir.getName(), expandStatistics); } File[] providerDirs = consumerDir.listFiles(); for (File providerDir : providerDirs) { if (MonitorService.PROVIDER.equals(expand)) { expandStatistics = newStatistics(); expandMap.put(providerDir.getName(), expandStatistics); } appendStatistics(providerDir, statistics); if (expandStatistics != null) { appendStatistics(providerDir, expandStatistics); } } } rows.add(toRow(methodDir.getName(), statistics)); if (expandMap != null && expandMap.size() > 0) { for (Map.Entry<String, long[]> entry : expandMap.entrySet()) { String node = MonitorService.CONSUMER.equals(expand) ? "<--" : "-->"; rows.add(toRow("      |" + node + " " + entry.getKey(), entry.getValue())); } } } } StringBuilder nav = new StringBuilder(); nav.append("<a href=\"services.html\">Services</a> > "); nav.append(service); nav.append(" > <a href=\"providers.html?service="); nav.append(service); nav.append("\">Providers</a> | <a href=\"consumers.html?service="); nav.append(service); nav.append("\">Consumers</a> | Statistics | <a href=\"charts.html?service="); nav.append(service); nav.append("&date="); nav.append(date); nav.append("\">Charts</a> > <input type=\"text\" style=\"width: 65px;\" name=\"date\" value=\""); nav.append(date); nav.append("\" onkeyup=\"if (event.keyCode == 10 || event.keyCode == 13) {window.location.href='statistics.html?service="); nav.append(service); if (expand != null && expand.length() > 0) { nav.append("&expand="); nav.append(expand); } nav.append("&date=' + this.value;}\" /> > "); if (! MonitorService.PROVIDER.equals(expand) && ! MonitorService.CONSUMER.equals(expand)) { nav.append("Summary"); } else { nav.append("<a href=\"statistics.html?service="); nav.append(service); nav.append("&date="); nav.append(date); nav.append("\">Summary</a>"); } if (MonitorService.PROVIDER.equals(expand)) { nav.append(" | +Provider"); } else { nav.append(" | <a href=\"statistics.html?service="); nav.append(service); nav.append("&date="); nav.append(date); nav.append("&expand=provider\">+Provider</a>"); } if (MonitorService.CONSUMER.equals(expand)) { nav.append(" | +Consumer"); } else { nav.append(" | <a href=\"statistics.html?service="); nav.append(service); nav.append("&date="); nav.append(date); nav.append("&expand=consumer\">+Consumer</a>"); } return new Page(nav.toString(), "Statistics (" + rows.size() + ")", new String[] { "Method:", "Success", "Failure", "Avg Elapsed (ms)", "Max Elapsed (ms)", "Max Concurrent" }, rows); } private long[] newStatistics() { return new long[10]; } private void appendStatistics(File providerDir, long[] statistics) { statistics[0] += CountUtils.sum(new File(providerDir, MonitorService.CONSUMER + "." + MonitorService.SUCCESS)); statistics[1] += CountUtils.sum(new File(providerDir, MonitorService.PROVIDER + "." + MonitorService.SUCCESS)); statistics[2] += CountUtils.sum(new File(providerDir, MonitorService.CONSUMER + "." + MonitorService.FAILURE)); statistics[3] += CountUtils.sum(new File(providerDir, MonitorService.PROVIDER + "." + MonitorService.FAILURE)); statistics[4] += CountUtils.sum(new File(providerDir, MonitorService.CONSUMER + "." + MonitorService.ELAPSED)); statistics[5] += CountUtils.sum(new File(providerDir, MonitorService.PROVIDER + "." + MonitorService.ELAPSED)); statistics[6] = Math.max(statistics[6], CountUtils.max(new File(providerDir, MonitorService.CONSUMER + "." + MonitorService.MAX_ELAPSED))); statistics[7] = Math.max(statistics[7], CountUtils.max(new File(providerDir, MonitorService.PROVIDER + "." + MonitorService.MAX_ELAPSED))); statistics[8] = Math.max(statistics[8], CountUtils.max(new File(providerDir, MonitorService.CONSUMER + "." + MonitorService.MAX_CONCURRENT))); statistics[9] = Math.max(statistics[9], CountUtils.max(new File(providerDir, MonitorService.PROVIDER + "." + MonitorService.MAX_CONCURRENT))); } private List<String> toRow(String name, long[] statistics) { List<String> row = new ArrayList<String>(); row.add(name); row.add(String.valueOf(statistics[0]) + " --> " + String.valueOf(statistics[1])); row.add(String.valueOf(statistics[2]) + " --> " + String.valueOf(statistics[3])); row.add(String.valueOf(statistics[0] == 0 ? 0 : statistics[4] / statistics[0]) + " --> " + String.valueOf(statistics[1] == 0 ? 0 : statistics[5] / statistics[1])); row.add(String.valueOf(statistics[6]) + " --> " + String.valueOf(statistics[7])); row.add(String.valueOf(statistics[8]) + " --> " + String.valueOf(statistics[9])); return row; } }