[ 
https://issues.apache.org/jira/browse/PHOENIX-2182?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14726225#comment-14726225
 ] 

ASF GitHub Bot commented on PHOENIX-2182:
-----------------------------------------

Github user codymarcel commented on a diff in the pull request:

    https://github.com/apache/phoenix/pull/115#discussion_r38474158
  
    --- Diff: 
phoenix-pherf/src/main/java/org/apache/phoenix/pherf/util/ResultsComparator.java
 ---
    @@ -0,0 +1,353 @@
    +package org.apache.phoenix.pherf.util;
    +
    +import java.io.FileNotFoundException;
    +import java.io.FileReader;
    +import java.io.PrintWriter;
    +import java.io.UnsupportedEncodingException;
    +import java.text.DecimalFormat;
    +import java.text.SimpleDateFormat;
    +import java.util.Date;
    +import java.util.LinkedHashMap;
    +import java.util.Map;
    +import java.util.TreeMap;
    +
    +import org.apache.commons.csv.CSVFormat;
    +import org.apache.commons.csv.CSVParser;
    +import org.apache.commons.csv.CSVRecord;
    +import org.apache.phoenix.pherf.PherfConstants;
    +import org.apache.phoenix.pherf.result.file.ResultFileDetails;
    +
    +/**
    + * Compare results based on set threshold and render results as Google 
Charts
    + */
    +public class ResultsComparator {
    +
    +   private String[] labels;
    +   private final Map<String, DataNode> datanodes = new TreeMap<String, 
DataNode>();
    +   private final PherfConstants constants = PherfConstants.create();
    +   private final String resultDir = 
constants.getProperty("pherf.default.results.dir");
    +   private final double threshold = 
Double.parseDouble(constants.getProperty("pherf.default.comparison.threshold"));
    +
    +   public ResultsComparator(String labels) {
    +           this.setLabelsAsString(labels);
    +   }
    +   
    +   String[] getLabels() {
    +           return labels;
    +   }
    +
    +   void setLabels(String[] labels) {
    +           this.labels = labels;
    +   }
    +
    +   void setLabelsAsString(String labels) {
    +           this.labels = labels.split(",");
    +   }
    +   
    +   public void readAndRender() {
    +           try {
    +                   for (String label : labels) {
    +                           read(label);
    +                   }
    +                   renderAsGoogleChartsHTML();
    +
    +           } catch (Exception e) {
    +                   e.printStackTrace();
    +           }
    +   }
    +
    +   /**
    +    * Reads aggregate file and convert it to DataNode 
    +    * @param label
    +    * @throws Exception
    +    */
    +    private void read(String label) throws Exception {
    +           String resultFileName = resultDir 
    +                           + PherfConstants.PATH_SEPARATOR
    +                           + PherfConstants.RESULT_PREFIX 
    +                           + label
    +                           + 
ResultFileDetails.CSV_AGGREGATE_PERFORMANCE.getExtension();
    +
    +           FileReader in = new FileReader(resultFileName);
    +           final CSVParser parser = new CSVParser(in, 
CSVFormat.DEFAULT.withHeader());
    +
    +        for (CSVRecord record : parser) {
    +            String group = record.get("QUERY_GROUP");
    +            String query = record.get("QUERY");
    +            String explain = record.get("EXPLAIN_PLAN");
    +            String tenantId = record.get("TENANT_ID");
    +            long avgTime = Long.parseLong(record.get("AVG_TIME_MS"));
    +            long minTime = Long.parseLong(record.get("AVG_MIN_TIME_MS"));
    +            long numRuns = Long.parseLong(record.get("RUN_COUNT"));
    +            long rowCount = Long.parseLong(record.get("RESULT_ROW_COUNT"));
    +            Node node = new Node(minTime, avgTime, numRuns, explain, 
query, tenantId, label, rowCount);
    +            
    +            if (datanodes.containsKey(group)) {
    +                   datanodes.get(group).getDataSet().put(label, node);
    +            } else {
    +                   datanodes.put(group, new DataNode(label, node));
    +            }
    +        }
    +        parser.close();
    +    }
    +
    +    /**
    +     * Verifies if the first result is within the set 
    +     * threshold of pherf.default.comparison.threshold
    +     * set in pherf.properties files
    +     * @param threshold
    +     * @return
    +     */
    +    private boolean verifyWithinThreshold(double threshold) {
    +           long resetTimeToCompare = -1;
    +           long timeToCompare = resetTimeToCompare;
    +           for (Map.Entry<String, DataNode> dn : datanodes.entrySet()) {   
                
    +           for (Map.Entry<String, Node> node : 
dn.getValue().getDataSet().entrySet()) {
    +                   if (timeToCompare == -1) {
    +                           timeToCompare = node.getValue().getMinTime();
    +                   }
    +                           if ((((double) (timeToCompare - 
node.getValue().getMinTime())) / (double) node
    +                                           .getValue().getMinTime()) > 
threshold) {
    +                                   return false;
    +                           }
    +           }
    +           timeToCompare = resetTimeToCompare;
    +           }
    +           return true;
    +    }
    +    
    +    /**
    +     * Render results as Google charts
    +     * @throws FileNotFoundException
    +     * @throws UnsupportedEncodingException
    +     */
    +    private void renderAsGoogleChartsHTML() throws FileNotFoundException, 
UnsupportedEncodingException {
    --- End diff --
    
    Should all this chart stuff go in a util object? It seems unrelated to a 
Result comparison. 


> Pherf - Add ability to compare of run(s) and generate warning if performance 
> degrades beyond set threshold
> ----------------------------------------------------------------------------------------------------------
>
>                 Key: PHOENIX-2182
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-2182
>             Project: Phoenix
>          Issue Type: Improvement
>            Reporter: Mujtaba Chohan
>            Assignee: Mujtaba Chohan
>         Attachments: PHOENIX-2182.patch
>
>
> Add ability to compare of run(s) and generate warning if performance degrades 
> beyond set threshold. This would also need that runs can be labeled for known 
> baselines.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to