package com.intuit.tank.persistence.databases; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.commons.lang3.math.NumberUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import com.intuit.tank.reporting.databases.IDatabase; import com.intuit.tank.reporting.databases.Item; import com.intuit.tank.reporting.databases.PagedDatabaseResult; import com.intuit.tank.reporting.databases.TankDatabaseType; import com.intuit.tank.results.TankResult; import com.intuit.tank.vm.settings.TankConfig; /** * GraphiteDatasource * * @author Kevin McGoldrick * */ public class GraphiteDatasource implements IDatabase { private static final Logger LOG = LogManager.getLogger(GraphiteDatasource.class); private String enviornemnt = "qa"; private String graphiteHost = "doubleshot.perf.a.intuit.com"; private int graphitePort = 2003; private int interval = 15; // SECONDS private TankConfig config = new TankConfig(); private HierarchicalConfiguration resultsProviderConfig = config.getVmManagerConfig().getResultsProviderConfig(); @Override public void createTable(String tableName) { // TODO Auto-generated method stub } @Override public void deleteTable(String tableName) { // TODO Auto-generated method stub } @Override public void deleteForJob(String tableName, String jobId, boolean asynch) { // TODO Auto-generated method stub } @Override public boolean hasTable(String tableName) { // TODO Auto-generated method stub return true; } @Override public boolean hasJobData(String tableName, String jobId) { // TODO Auto-generated method stub return true; } @SuppressWarnings("unchecked") @Override public void addTimingResults(String tableName, List<TankResult> results, boolean asynch) { if (resultsProviderConfig != null) { try { enviornemnt = config.getInstanceName(); graphiteHost = resultsProviderConfig.getString("graphiteHost"); String s = resultsProviderConfig.getString("graphitePort"); if (NumberUtils.isDigits(s)) { graphitePort = Integer.parseInt(s); } } catch (Exception e) { LOG.error("Failed to get Graphite parameters " + e.toString()); } } Collections.sort(results); try { Socket socket = new Socket(graphiteHost, graphitePort); OutputStream s = socket.getOutputStream(); PrintWriter out = new PrintWriter(s, true); List<Long> groupResults = new ArrayList<Long>(); String requestName = ""; String jobId = ""; long sum = 0, l = 0; //int count = 0; for (TankResult metric: results) { if (metric.getRequestName().equalsIgnoreCase(requestName)) { groupResults.add(Long.valueOf(metric.getResponseTime())); sum += metric.getResponseTime(); } else if (!groupResults.isEmpty()) { // Handles the last time through of the group// int size = groupResults.size(); Collections.sort(groupResults); Long[] sortedList = groupResults.toArray(new Long[size]); long average = sum / size; long tps = size / interval; int fiftieth = (size/2); if (fiftieth >= 1) fiftieth--; int ninetieth =(size*(9/10)); if (ninetieth >= 1) ninetieth--; out.printf("tank.%s.%s.%s.ResponseTime.MIN %d %d%n", enviornemnt, jobId, requestName, sortedList[0].longValue(), l ); out.printf("tank.%s.%s.%s.ResponseTime.AVG %d %d%n", enviornemnt, jobId, requestName, average, l ); out.printf("tank.%s.%s.%s.ResponseTime.MAX %d %d%n", enviornemnt, jobId, requestName, sortedList[size-1].longValue(), l ); out.printf("tank.%s.%s.%s.ResponseTime.50th %d %d%n", enviornemnt, jobId, requestName, sortedList[fiftieth].longValue(), l ); out.printf("tank.%s.%s.%s.ResponseTime.90th %d %d%n", enviornemnt, jobId, requestName, sortedList[ninetieth].longValue(), l ); out.printf("tank.%s.%s.%s.TPS %d %d%n", enviornemnt, jobId, requestName, tps, l ); requestName = metric.getRequestName(); groupResults.clear(); groupResults.add(Long.valueOf(metric.getResponseTime())); sum = 0; } else { // Handles the first time through // requestName = metric.getRequestName(); l = metric.getTimeStamp().getTime() / 1000; groupResults.add(Long.valueOf(metric.getResponseTime())); jobId = metric.getJobId(); sum = metric.getResponseTime(); } } // Get that last one // int size = groupResults.size(); Collections.sort(groupResults); Long[] sortedList = groupResults.toArray(new Long[size]); long average = sum / size; long tps = size / interval; int fiftieth = (size/2); if (fiftieth >= 1) fiftieth--; int ninetieth =(size*(9/10)); if (ninetieth >= 1) ninetieth--; out.printf("tank.%s.%s.%s.ResponseTime.MIN %d %d%n", enviornemnt, jobId, requestName, sortedList[0].longValue(), l ); out.printf("tank.%s.%s.%s.ResponseTime.AVG %d %d%n", enviornemnt, jobId, requestName, average, l ); out.printf("tank.%s.%s.%s.ResponseTime.MAX %d %d%n", enviornemnt, jobId, requestName, sortedList[size-1].longValue(), l ); out.printf("tank.%s.%s.%s.ResponseTime.50th %d %d%n", enviornemnt, jobId, requestName, sortedList[fiftieth].longValue(), l ); out.printf("tank.%s.%s.%s.ResponseTime.90th %d %d%n", enviornemnt, jobId, requestName, sortedList[ninetieth].longValue(), l ); out.printf("tank.%s.%s.%s.TPS %d %d%n", enviornemnt, jobId, requestName, tps, l ); out.close(); socket.close(); } catch (UnknownHostException e) { LOG.error("Unknown host: " + graphiteHost); } catch (IOException e) { LOG.error("Error while writing data to graphite: " + e.getMessage(), e); } catch (Exception e) { LOG.error("Error: " + e.getMessage(), e); } } @Override public Set<String> getTables(String regex) { // TODO Auto-generated method stub return null; } @Override public void addItems(String tableName, List<Item> items, boolean asynch) { // TODO Auto-generated method stub } @Override public List<Item> getItems(String tableName, String minRange, String maxRange, String instanceId, String... jobId) { // TODO Auto-generated method stub return null; } @Override public PagedDatabaseResult getPagedItems(String tableName, Object nextToken, String minRange, String maxRange, String instanceId, String jobId) { // TODO Auto-generated method stub return null; } @Override public String getDatabaseName(TankDatabaseType type, String jobId) { // TODO Auto-generated method stub return graphiteHost; } }