1 /******************************************************************************* 2 * Copyright (c) 2007, 2014 Massimiliano Ziccardi 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 *******************************************************************************/ 16 package it.jnrpe; 17 18 import it.jnrpe.ReturnValue.UnitOfMeasure; 19 20 import java.math.BigDecimal; 21 import java.text.DecimalFormat; 22 23 /** 24 * This class holds the performance data to be returned with the result of the 25 * plugin execution. 26 * 27 * Refer to http://nagiosplug.sourceforge.net/developer-guidelines.html#AEN201 28 * 29 * @author Massimiliano Ziccardi 30 */ 31 class PerformanceData { 32 33 /** 34 * The label associated with this performance data. Can contain any 35 * characters except the equals sign or single quote ('). 36 */ 37 private final String label; 38 39 /** 40 * The value of this performance data. 41 */ 42 private final BigDecimal performanceValue; 43 44 /** 45 * The Unit of Measure of {@link #performanceValue}, {@link #minimumValue} 46 * and {@link #maximumValue}. 47 * With the new threshold format this won't be used anymore. 48 */ 49 private final UnitOfMeasure unitOfMeasure; 50 51 /** 52 * The unit of {@link #performanceValue}, {@link #minimumValue} 53 * and {@link #maximumValue}. 54 */ 55 private final String unit; 56 57 /** 58 * The warning range passed to the plugin that produced this performance 59 * data. Can be <code>null</code> 60 */ 61 private final String warningRange; 62 63 /** 64 * The critical range passed to the plugin that produced this performance 65 * data. Can be <code>null</code> 66 */ 67 private final String criticalRange; 68 69 /** 70 * The minimum value that this performance data could reach. Can be 71 * <code>null</code> 72 */ 73 private final BigDecimal minimumValue; 74 75 /** 76 * The maximum value that this performance data could reach. Can be 77 * <code>null</code> 78 */ 79 private final BigDecimal maximumValue; 80 81 /** 82 * The performance data will be returned as string. This is the formatter 83 * for all the performance numbers. 84 */ 85 private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat( 86 "0.000000"); 87 88 /** 89 * Creates a performance data object. 90 * 91 * @param perfLabel 92 * The label identifying this performance data 93 * @param value 94 * The performance value 95 * @param uom 96 * The Unit of Measure of <code>value</code>, 97 * <code>minValue</code> and <code>maxValue</code> 98 * @param warnRange 99 * the warning range passed to the plugin that is generating this 100 * performance data. Can be null. 101 * @param critRange 102 * the critical range passed to the plugin that is generating 103 * this performance data. Can be null. 104 * @param minValue 105 * the minimum value that this performance data can reach. Can be 106 * null. 107 * @param maxValue 108 * the maximum value that this performance data can reach. Can be 109 * null. 110 */ 111 public PerformanceData(final String perfLabel, final BigDecimal value, 112 final UnitOfMeasure uom, final String warnRange, 113 final String critRange, final BigDecimal minValue, 114 final BigDecimal maxValue) { 115 this.label = perfLabel; 116 this.performanceValue = value; 117 this.unitOfMeasure = uom; 118 this.warningRange = warnRange; 119 this.criticalRange = critRange; 120 this.minimumValue = minValue; 121 this.maximumValue = maxValue; 122 this.unit = null; 123 } 124 125 /** 126 * Creates a performance data object. 127 * 128 * @param perfLabel 129 * The label identifying this performance data 130 * @param value 131 * The performance value 132 * @param unitofMeasure 133 * The Unit of Measure of <code>value</code>, 134 * <code>minValue</code> and <code>maxValue</code> 135 * @param warnRange 136 * the warning range passed to the plugin that is generating this 137 * performance data. Can be null. 138 * @param critRange 139 * the critical range passed to the plugin that is generating 140 * this performance data. Can be null. 141 * @param minValue 142 * the minimum value that this performance data can reach. Can be 143 * null. 144 * @param maxValue 145 * the maximum value that this performance data can reach. Can be 146 * null. 147 */ 148 public PerformanceData(final String perfLabel, final BigDecimal value, 149 final String unitofMeasure, final String warnRange, 150 final String critRange, final BigDecimal minValue, 151 final BigDecimal maxValue) { 152 this.label = perfLabel; 153 this.performanceValue = value; 154 this.unitOfMeasure = null; 155 this.warningRange = warnRange; 156 this.criticalRange = critRange; 157 this.minimumValue = minValue; 158 this.maximumValue = maxValue; 159 this.unit = unitofMeasure; 160 } 161 162 163 /** 164 * Produce a performance string accordin to Nagios specification based on 165 * the value of this performance data object. 166 * 167 * @return a string that can be returned to Nagios 168 */ 169 public String toPerformanceString() { 170 StringBuffer res = 171 new StringBuffer().append(quote(label)).append("=") 172 .append(DECIMAL_FORMAT.format(performanceValue)); 173 174 if (unitOfMeasure != null) { 175 switch (unitOfMeasure) { 176 case milliseconds: 177 res.append("ms"); 178 break; 179 case microseconds: 180 res.append("us"); 181 break; 182 case seconds: 183 res.append("s"); 184 break; 185 case bytes: 186 res.append("B"); 187 break; 188 case kilobytes: 189 res.append("KB"); 190 break; 191 case megabytes: 192 res.append("MB"); 193 break; 194 case gigabytes: 195 res.append("GB"); 196 break; 197 case terabytes: 198 res.append("TB"); 199 break; 200 case percentage: 201 res.append("%"); 202 break; 203 case counter: 204 res.append("c"); 205 break; 206 default: 207 } 208 } 209 210 if (unit != null) { 211 res.append(unit); 212 } 213 214 res.append(";"); 215 if (warningRange != null) { 216 res.append(warningRange); 217 } 218 res.append(";"); 219 if (criticalRange != null) { 220 res.append(criticalRange); 221 } 222 res.append(";"); 223 if (minimumValue != null) { 224 res.append(DECIMAL_FORMAT.format(minimumValue)); 225 } 226 res.append(";"); 227 if (maximumValue != null) { 228 res.append(DECIMAL_FORMAT.format(maximumValue)); 229 } 230 231 while (res.charAt(res.length() - 1) == ';') { 232 res.deleteCharAt(res.length() - 1); 233 } 234 235 return res.toString(); 236 } 237 238 /** 239 * Quotes the label if required. 240 * 241 * @param lbl 242 * The label to be quoted 243 * @return The quoted label or the original label if quoting is not 244 * required. 245 */ 246 private String quote(final String lbl) { 247 if (lbl.indexOf(' ') == -1) { 248 return lbl; 249 } 250 251 return new StringBuffer("'").append(lbl).append("'").toString(); 252 } 253 }