DiagnosticTest.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:10k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.vaidya;
  19. import java.lang.Runnable;
  20. import org.apache.hadoop.vaidya.statistics.job.*;
  21. import org.apache.hadoop.vaidya.util.*;
  22. import org.w3c.dom.Node;
  23. import org.w3c.dom.Document;
  24. import org.w3c.dom.NodeList;
  25. import org.w3c.dom.Element;
  26. /*
  27.  * This is an abstract base class to be extended by each diagnostic test 
  28.  * class. It implements Runnable interface so that if required multiple tests 
  29.  * can be run in parallel. 
  30.  */
  31. public abstract class DiagnosticTest implements Runnable {
  32.   
  33.   private static final double HIGHVAL = 0.99;
  34.   private static final double MEDIUMVAL = 0.66;
  35.   private static final double LOWVAL = 0.33;
  36.   
  37.   /*
  38.    * Job statistics are passed to this class against which this diagnostic 
  39.    * test is evaluated.
  40.    */
  41.   private JobStatistics _jobExecutionStats;
  42.   private Element _testConfigElement;
  43.   private double _impactLevel;
  44.   private boolean _evaluated;
  45.   private boolean _testPassed; 
  46.   
  47.   /* 
  48.    * Checks if test is already evaluated against job execution statistics
  49.    * @return - true if test is already evaluated once.
  50.    */
  51.   public boolean isEvaluated() {
  52.     return _evaluated;
  53.   }
  54.   /*
  55.    * If impact level (returned by evaluate method) is less than success threshold 
  56.    * then test is passed (NEGATIVE) else failed (POSITIVE) which inturn indicates the 
  57.    * problem with job performance  
  58.    */
  59.   public boolean istestPassed() {
  60.     return this._testPassed;
  61.   }
  62.   
  63.   
  64.   /*
  65.    * Initialize the globals
  66.    */
  67.   public void initGlobals (JobStatistics jobExecutionStats, Element testConfigElement) {
  68.     this._jobExecutionStats = jobExecutionStats;
  69.     this._testConfigElement = testConfigElement;
  70.   }
  71.   
  72.   /*
  73.    * Returns a prescription/advice (formated text) based on the evaluation of 
  74.    * diagnostic test condition (evaluate method). Individual test should override 
  75.    * and implement it. If the value returned is null then the prescription advice
  76.    * is printed as provided in the test config file.  
  77.    */
  78.   public abstract String getPrescription();
  79.   
  80.   /*
  81.    * This method prints any reference details to support the test result. Individual
  82.    * test needs to override and implement it and information printed is specific 
  83.    * to individual test. 
  84.    */
  85.   public abstract String getReferenceDetails ();
  86.   
  87.   /*
  88.    * Evaluates diagnostic condition and returns impact level (value [0..1])
  89.    * Typically this method calculates the impact of a diagnosed condition on the job performance
  90.    * (Note: for boolean conditions it is either 0 or 1).
  91.    */
  92.   public abstract double evaluate (JobStatistics jobExecutionStats);
  93.   
  94.   /*
  95.    * Get the Title information for this test as set in the test config file
  96.    */
  97.   public String getTitle() throws Exception {
  98.     return XMLUtils.getElementValue("Title", this._testConfigElement);
  99.   }
  100.   
  101.   /*
  102.    * Get the Description information as set in the test config file.
  103.    */
  104.   public String getDescription() throws Exception {
  105.     return XMLUtils.getElementValue("Description", this._testConfigElement);
  106.   }
  107.   
  108.   /*
  109.    * Get the Importance value as set in the test config file.
  110.    */
  111.   public double getImportance() throws Exception {  
  112.     if (XMLUtils.getElementValue("Importance", this._testConfigElement).equalsIgnoreCase("high")) {
  113.       return HIGHVAL;
  114.     } else if (XMLUtils.getElementValue("Importance", this._testConfigElement).equalsIgnoreCase("medium")) {
  115.       return MEDIUMVAL;
  116.     } else {
  117.       return LOWVAL;
  118.     }
  119.   }
  120.   
  121.   /*
  122.    * Returns the impact level of this test condition. This value is calculated and
  123.    * returned by evaluate method.
  124.    */
  125.   public double getImpactLevel() throws Exception {
  126.     if (!this.isEvaluated()) {
  127.       throw new Exception("Test has not been evaluated");
  128.     }
  129.     return truncate(this._impactLevel);
  130.   }
  131.   /* 
  132.    * Get the severity level as specified in the test config file.
  133.    */
  134.   public double getSeverityLevel() throws Exception {
  135.     return truncate ((double)(getImportance()*getImpactLevel()));
  136.   }
  137.   /*
  138.    * Get Success Threshold as specified in the test config file.
  139.    */
  140.   public double getSuccessThreshold() throws Exception {
  141.     double x = Double.parseDouble(XMLUtils.getElementValue("SuccessThreshold", this._testConfigElement));
  142.     return truncate (x);
  143.   }
  144.   
  145.   /*
  146.    * Creates and returns the report element for this test based on the 
  147.    * test evaluation results.
  148.    */
  149.   public Element getReportElement(Document doc, Node parent) throws Exception {
  150.     /* 
  151.      * If test is not evaluated yet then throw exception
  152.      */
  153.     if (!this.isEvaluated()) {
  154.       throw new Exception("Test has not been evaluated");
  155.     }
  156.     
  157.     /*
  158.      * Construct and return the report element
  159.      */
  160.     // Insert Child ReportElement
  161.     Node reportElement = doc.createElement("TestReportElement");
  162.     parent.appendChild(reportElement);
  163.     // Insert title
  164.     Node item = doc.createElement("TestTitle");
  165.     reportElement.appendChild(item);
  166.     Node value = doc.createTextNode(this.getTitle());
  167.     item.appendChild(value);
  168.     // Insert description
  169.     item = doc.createElement("TestDescription");
  170.     reportElement.appendChild(item);
  171.     value = doc.createTextNode(this.getDescription());
  172.     item.appendChild(value);
  173.     // Insert Importance
  174.     item = doc.createElement("TestImportance");
  175.     reportElement.appendChild(item);
  176.     String imp;
  177.     if (this.getImportance() == HIGHVAL) {
  178.       imp = "HIGH";
  179.     } else if (this.getImportance() == MEDIUMVAL) {
  180.       imp = "MEDIUM";
  181.     } else { 
  182.       imp = "LOW";
  183.     }
  184.     value = doc.createTextNode(imp);
  185.     item.appendChild(value);
  186.     // Insert Importance
  187.     item = doc.createElement("TestResult");
  188.     reportElement.appendChild(item);
  189.     if (this._testPassed) {
  190.       value = doc.createTextNode("NEGATIVE(PASSED)");
  191.     } else {
  192.       value = doc.createTextNode("POSITIVE(FAILED)");
  193.     }
  194.     item.appendChild(value);
  195.       
  196.     // TODO : if (!this._testPassed) {
  197.     // Insert Severity
  198.     item = doc.createElement("TestSeverity");
  199.     reportElement.appendChild(item);
  200.     value = doc.createTextNode(""+this.getSeverityLevel());
  201.     item.appendChild(value);
  202.     
  203.     // Insert Reference Details
  204.     item = doc.createElement("ReferenceDetails");
  205.     reportElement.appendChild(item);
  206.     value = doc.createTextNode(""+this.getReferenceDetails());
  207.     item.appendChild(value);
  208.     
  209.     // Insert Prescription Advice
  210.     item = doc.createElement("TestPrescription");
  211.     String val = this.getPrescription();
  212.     if (val == null) {
  213.       val = XMLUtils.getElementValue("Prescription", this._testConfigElement);
  214.     }
  215.     reportElement.appendChild(item);
  216.     value = doc.createTextNode(""+val);
  217.     item.appendChild(value);
  218.     // }
  219.     return (Element)reportElement;
  220.   }
  221.   
  222.   
  223.   /* 
  224.    * (non-Javadoc)
  225.    * @see java.lang.Runnable#run()
  226.    */
  227.   public void run() {
  228.     /*
  229.      * Evaluate the test
  230.      */
  231.     this._impactLevel = this.evaluate(this._jobExecutionStats);
  232.     this._evaluated = true;
  233.     try {
  234.       if (this._impactLevel >= this.getSuccessThreshold()) {
  235.       this._testPassed = false;
  236.       } else {
  237.       this._testPassed = true;
  238.       }
  239.     } catch (Exception e) {
  240.       e.printStackTrace();
  241.     }
  242.   }
  243.   
  244.   /*
  245.    * Returns value of element of type long part of InputElement of diagnostic 
  246.    * rule
  247.    */
  248.   protected long getInputElementLongValue (String elementName, long defaultValue) {
  249.     Element inputElement = (Element)(this._testConfigElement.getElementsByTagName("InputElement").item(0));
  250.     Element prs = null; long value;
  251.     prs = (Element)inputElement.getElementsByTagName(elementName).item(0);
  252.     if (prs != null) {
  253.       value = Long.parseLong(prs.getFirstChild().getNodeValue().trim());
  254.     } else {
  255.       value = defaultValue;
  256.     }
  257.     return value;
  258.   }
  259.   
  260.   /*
  261.    * Returns value of element of type double part of InputElement of diagnostic rule
  262.    */
  263.   protected double getInputElementDoubleValue(String elementName, double defaultValue) {
  264.     Element inputElement = (Element)(this._testConfigElement.getElementsByTagName("InputElement").item(0));
  265.     Element prs = null; double value;
  266.     prs = (Element)inputElement.getElementsByTagName(elementName).item(0);
  267.     if (prs != null) {
  268.       value = Double.parseDouble(prs.getFirstChild().getNodeValue().trim());
  269.     } else {
  270.       value = defaultValue;
  271.     }
  272.     return value;
  273.   }
  274.   
  275.   /*
  276.    * Returns value of element of type String part of InputElement of diagnostic rule
  277.    */
  278.   protected String getInputElementStringValue(String elementName, String defaultValue) {
  279.     Element inputElement = (Element)(this._testConfigElement.getElementsByTagName("InputElement").item(0));
  280.     Element prs = null; String value;
  281.     prs = (Element)inputElement.getElementsByTagName(elementName).item(0);
  282.     if (prs != null) {
  283.       value = prs.getFirstChild().getNodeValue().trim();
  284.     } else {
  285.       value = defaultValue;
  286.     }
  287.     return value;
  288.   }
  289.   
  290.   /*
  291.    * truncate doubles to 2 digit.
  292.    */
  293.   public static double truncate(double x)
  294.   {
  295.       long y=(long)(x*100);
  296.       return (double)y/100;
  297.   }
  298. }