/* * RHQ Management Platform * Copyright (C) 2010 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.coregui.client.util.rpc; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.rhq.coregui.client.util.rpc.RemoteServiceStatistics.Record.Summary; /** * @author Joseph Marques */ public class RemoteServiceStatistics { public static class Record { private String serviceName; private String methodName; private List<Long> data = new ArrayList<Long>(); private Record(String remoteService, long millis) { // remoteService format "{ServiceName}_Proxy.{MethodName}" this.serviceName = remoteService.substring(0, remoteService.indexOf("_Proxy")); this.methodName = remoteService.substring(remoteService.indexOf('.') + 1); this.data.add(millis); } private void record(long millis) { this.data.add(millis); } public Summary getSummary() { return new Summary(serviceName, methodName, data); } public static class Summary { public final String serviceName; public final String methodName; public final int count; public final long slowest; public final long average; public final long fastest; public final long stddev; private Summary(String serviceName, String methodName, List<Long> data) { this.serviceName = serviceName; this.methodName = methodName; this.count = data.size(); if (!data.isEmpty()) { int i = 0; long total = 0, slow = 0, fast = 0; for (long next : data) { if (i++ == 0) { total = slow = fast = next; } else { total += next; if (next > slow) { slow = next; } else if (next < fast) { fast = next; } } } slowest = slow; fastest = fast; double avg = (total) / (double) count; double sumOfSquares = 0; for (long next : data) { sumOfSquares += Math.pow(next - avg, 2); } stddev = (long) Math.pow(sumOfSquares / count, 0.5); average = (long) avg; } else { slowest = average = fastest = stddev = 0; } } public String toString() { StringBuilder builder = new StringBuilder(); builder.append("serviceName=").append(serviceName).append('.'); builder.append("methodeName=").append(methodName).append(": "); if (count < 1) { builder.append("empty"); } else { builder.append("count=").append(count).append(','); builder.append("slowest=").append(slowest).append(','); builder.append("average=").append(average).append(','); builder.append("fastest=").append(fastest).append(','); builder.append("stddev=").append(stddev); } return builder.toString(); } } } private static Map<String, Record> statistics = new HashMap<String, Record>(); private RemoteServiceStatistics() { // static access only } public static void record(String remoteService, long millis) { Record record = statistics.get(remoteService); if (record == null) { record = new Record(remoteService, millis); statistics.put(remoteService, record); } else { record.record(millis); } } public static String recordAndPrint(String remoteService, long millis) { record(remoteService, millis); return print(remoteService); } public static String print(String remoteService) { Record record = statistics.get(remoteService); if (record == null) { record = new Record(remoteService, 0); } return "RemoteServiceStatistics: " + remoteService + ": " + record.getSummary(); } public static List<String> printAll() { List<String> stats = new ArrayList<String>(); for (String remoteService : statistics.keySet()) { stats.add(print(remoteService)); } return stats; } public static Summary get(String remoteService) { Record stat = statistics.get(remoteService); if (stat == null) { stat = new Record(remoteService, 0); } return stat.getSummary(); } public static List<Summary> getAll() { List<Summary> stats = new ArrayList<Summary>(); for (String remoteService : statistics.keySet()) { stats.add(get(remoteService)); } return stats; } public static void clearAll() { statistics.clear(); } }