/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 com.alibaba.dubbo.common.URL; import com.alibaba.dubbo.common.utils.ConfigUtils; import com.alibaba.dubbo.monitor.MonitorService; import com.alibaba.dubbo.monitor.simple.common.CountUtils; import com.alibaba.dubbo.monitor.simple.common.Page; import com.alibaba.dubbo.monitor.simple.servlet.PageHandler; 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; /** * StatisticsPageHandler */ 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> rows = new ArrayList>(); String directory = ConfigUtils.getProperty("dubbo.statistics.directory"); 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 expandMap = new HashMap(); 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 entry : expandMap.entrySet()) { String node = MonitorService.CONSUMER.equals(expand) ? "<--" : "-->"; rows.add(toRow("      |" + node + " " + entry.getKey(), entry.getValue())); } } } } StringBuilder nav = new StringBuilder(); nav.append("Services > "); nav.append(service); nav.append(" > Providers | Consumers | Statistics | Charts > > "); if (!MonitorService.PROVIDER.equals(expand) && !MonitorService.CONSUMER.equals(expand)) { nav.append("Summary"); } else { nav.append("Summary"); } if (MonitorService.PROVIDER.equals(expand)) { nav.append(" | +Provider"); } else { nav.append(" | +Provider"); } if (MonitorService.CONSUMER.equals(expand)) { nav.append(" | +Consumer"); } else { nav.append(" | +Consumer"); } 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 toRow(String name, long[] statistics) { List row = new ArrayList(); 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; } }