Add resource name into MetricsDatabase, handle exception gracefully
Change-Id: Icf19965a0fcbfd9696c42b12c32441fd3b161734
Showing
5 changed files
with
141 additions
and
34 deletions
| ... | @@ -30,6 +30,13 @@ public interface MetricsDatabase { | ... | @@ -30,6 +30,13 @@ public interface MetricsDatabase { |
| 30 | String metricName(); | 30 | String metricName(); |
| 31 | 31 | ||
| 32 | /** | 32 | /** |
| 33 | + * Returns the resource name of this database. | ||
| 34 | + * | ||
| 35 | + * @return resource name | ||
| 36 | + */ | ||
| 37 | + String resourceName(); | ||
| 38 | + | ||
| 39 | + /** | ||
| 33 | * Update metric value by specifying metric type. | 40 | * Update metric value by specifying metric type. |
| 34 | * | 41 | * |
| 35 | * @param metricType metric type (e.g., load, usage, etc.) | 42 | * @param metricType metric type (e.g., load, usage, etc.) |
| ... | @@ -138,6 +145,14 @@ public interface MetricsDatabase { | ... | @@ -138,6 +145,14 @@ public interface MetricsDatabase { |
| 138 | Builder withMetricName(String metricName); | 145 | Builder withMetricName(String metricName); |
| 139 | 146 | ||
| 140 | /** | 147 | /** |
| 148 | + * Sets the resource name. | ||
| 149 | + * | ||
| 150 | + * @param resourceName resource name | ||
| 151 | + * @return builder object | ||
| 152 | + */ | ||
| 153 | + Builder withResourceName(String resourceName); | ||
| 154 | + | ||
| 155 | + /** | ||
| 141 | * Add a new metric to be monitored. | 156 | * Add a new metric to be monitored. |
| 142 | * | 157 | * |
| 143 | * @param metricType control metric type | 158 | * @param metricType control metric type | ... | ... |
| ... | @@ -77,6 +77,8 @@ public class ControlPlaneMonitor implements ControlPlaneMonitorService { | ... | @@ -77,6 +77,8 @@ public class ControlPlaneMonitor implements ControlPlaneMonitorService { |
| 77 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 77 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 78 | protected ClusterCommunicationService communicationService; | 78 | protected ClusterCommunicationService communicationService; |
| 79 | 79 | ||
| 80 | + private static final String DEFAULT_RESOURCE = "default"; | ||
| 81 | + | ||
| 80 | private static final Set RESOURCE_TYPE_SET = | 82 | private static final Set RESOURCE_TYPE_SET = |
| 81 | ImmutableSet.of(Type.CONTROL_MESSAGE, Type.DISK, Type.NETWORK); | 83 | ImmutableSet.of(Type.CONTROL_MESSAGE, Type.DISK, Type.NETWORK); |
| 82 | 84 | ||
| ... | @@ -96,6 +98,8 @@ public class ControlPlaneMonitor implements ControlPlaneMonitorService { | ... | @@ -96,6 +98,8 @@ public class ControlPlaneMonitor implements ControlPlaneMonitorService { |
| 96 | 98 | ||
| 97 | private static final String METRIC_TYPE_NULL = "Control metric type cannot be null"; | 99 | private static final String METRIC_TYPE_NULL = "Control metric type cannot be null"; |
| 98 | 100 | ||
| 101 | + Set<Map<ControlMetricType, Double>> debugSets = Sets.newHashSet(); | ||
| 102 | + | ||
| 99 | private static final Serializer SERIALIZER = Serializer | 103 | private static final Serializer SERIALIZER = Serializer |
| 100 | .using(new KryoNamespace.Builder() | 104 | .using(new KryoNamespace.Builder() |
| 101 | .register(KryoNamespaces.API) | 105 | .register(KryoNamespaces.API) |
| ... | @@ -107,8 +111,8 @@ public class ControlPlaneMonitor implements ControlPlaneMonitorService { | ... | @@ -107,8 +111,8 @@ public class ControlPlaneMonitor implements ControlPlaneMonitorService { |
| 107 | 111 | ||
| 108 | @Activate | 112 | @Activate |
| 109 | public void activate() { | 113 | public void activate() { |
| 110 | - cpuMetrics = genMDbBuilder(Type.CPU, CPU_METRICS); | 114 | + cpuMetrics = genMDbBuilder(DEFAULT_RESOURCE, Type.CPU, CPU_METRICS); |
| 111 | - memoryMetrics = genMDbBuilder(Type.MEMORY, MEMORY_METRICS); | 115 | + memoryMetrics = genMDbBuilder(DEFAULT_RESOURCE, Type.MEMORY, MEMORY_METRICS); |
| 112 | controlMessageMap = Maps.newConcurrentMap(); | 116 | controlMessageMap = Maps.newConcurrentMap(); |
| 113 | diskMetricsMap = Maps.newConcurrentMap(); | 117 | diskMetricsMap = Maps.newConcurrentMap(); |
| 114 | networkMetricsMap = Maps.newConcurrentMap(); | 118 | networkMetricsMap = Maps.newConcurrentMap(); |
| ... | @@ -170,7 +174,7 @@ public class ControlPlaneMonitor implements ControlPlaneMonitorService { | ... | @@ -170,7 +174,7 @@ public class ControlPlaneMonitor implements ControlPlaneMonitorService { |
| 170 | if (ctrlMsgBuf.get(deviceId.get()).keySet() | 174 | if (ctrlMsgBuf.get(deviceId.get()).keySet() |
| 171 | .containsAll(CONTROL_MESSAGE_METRICS)) { | 175 | .containsAll(CONTROL_MESSAGE_METRICS)) { |
| 172 | updateControlMessages(ctrlMsgBuf.get(deviceId.get()), deviceId.get()); | 176 | updateControlMessages(ctrlMsgBuf.get(deviceId.get()), deviceId.get()); |
| 173 | - ctrlMsgBuf.get(deviceId.get()).clear(); | 177 | + ctrlMsgBuf.get(deviceId.get()); |
| 174 | } | 178 | } |
| 175 | } | 179 | } |
| 176 | } else { | 180 | } else { |
| ... | @@ -304,31 +308,34 @@ public class ControlPlaneMonitor implements ControlPlaneMonitorService { | ... | @@ -304,31 +308,34 @@ public class ControlPlaneMonitor implements ControlPlaneMonitorService { |
| 304 | return ImmutableSet.of(); | 308 | return ImmutableSet.of(); |
| 305 | } | 309 | } |
| 306 | 310 | ||
| 307 | - private MetricsDatabase genMDbBuilder(Type resourceType, | 311 | + private MetricsDatabase genMDbBuilder(String resourceName, |
| 312 | + Type resourceType, | ||
| 308 | Set<ControlMetricType> metricTypes) { | 313 | Set<ControlMetricType> metricTypes) { |
| 309 | MetricsDatabase.Builder builder = new DefaultMetricsDatabase.Builder(); | 314 | MetricsDatabase.Builder builder = new DefaultMetricsDatabase.Builder(); |
| 310 | builder.withMetricName(resourceType.toString()); | 315 | builder.withMetricName(resourceType.toString()); |
| 316 | + builder.withResourceName(resourceName); | ||
| 311 | metricTypes.forEach(type -> builder.addMetricType(type.toString())); | 317 | metricTypes.forEach(type -> builder.addMetricType(type.toString())); |
| 312 | return builder.build(); | 318 | return builder.build(); |
| 313 | } | 319 | } |
| 314 | 320 | ||
| 315 | private void updateNetworkMetrics(Map<ControlMetricType, Double> metricMap, | 321 | private void updateNetworkMetrics(Map<ControlMetricType, Double> metricMap, |
| 316 | String resName) { | 322 | String resName) { |
| 317 | - networkMetricsMap.putIfAbsent(resName, | 323 | + networkMetricsMap.putIfAbsent(resName, genMDbBuilder(resName, |
| 318 | - genMDbBuilder(Type.NETWORK, NETWORK_METRICS)); | 324 | + Type.NETWORK, NETWORK_METRICS)); |
| 319 | networkMetricsMap.get(resName).updateMetrics(convertMap(metricMap)); | 325 | networkMetricsMap.get(resName).updateMetrics(convertMap(metricMap)); |
| 320 | } | 326 | } |
| 321 | 327 | ||
| 322 | private void updateDiskMetrics(Map<ControlMetricType, Double> metricMap, | 328 | private void updateDiskMetrics(Map<ControlMetricType, Double> metricMap, |
| 323 | String resName) { | 329 | String resName) { |
| 324 | - diskMetricsMap.putIfAbsent(resName, genMDbBuilder(Type.DISK, DISK_METRICS)); | 330 | + diskMetricsMap.putIfAbsent(resName, genMDbBuilder(resName, |
| 331 | + Type.DISK, DISK_METRICS)); | ||
| 325 | diskMetricsMap.get(resName).updateMetrics(convertMap(metricMap)); | 332 | diskMetricsMap.get(resName).updateMetrics(convertMap(metricMap)); |
| 326 | } | 333 | } |
| 327 | 334 | ||
| 328 | private void updateControlMessages(Map<ControlMetricType, Double> metricMap, | 335 | private void updateControlMessages(Map<ControlMetricType, Double> metricMap, |
| 329 | DeviceId devId) { | 336 | DeviceId devId) { |
| 330 | - controlMessageMap.putIfAbsent(devId, | 337 | + controlMessageMap.putIfAbsent(devId, genMDbBuilder(devId.toString(), |
| 331 | - genMDbBuilder(Type.CONTROL_MESSAGE, CONTROL_MESSAGE_METRICS)); | 338 | + Type.CONTROL_MESSAGE, CONTROL_MESSAGE_METRICS)); |
| 332 | controlMessageMap.get(devId).updateMetrics(convertMap(metricMap)); | 339 | controlMessageMap.get(devId).updateMetrics(convertMap(metricMap)); |
| 333 | } | 340 | } |
| 334 | 341 | ... | ... |
| ... | @@ -26,6 +26,8 @@ import org.rrd4j.core.RrdBackendFactory; | ... | @@ -26,6 +26,8 @@ import org.rrd4j.core.RrdBackendFactory; |
| 26 | import org.rrd4j.core.RrdDb; | 26 | import org.rrd4j.core.RrdDb; |
| 27 | import org.rrd4j.core.RrdDef; | 27 | import org.rrd4j.core.RrdDef; |
| 28 | import org.rrd4j.core.Sample; | 28 | import org.rrd4j.core.Sample; |
| 29 | +import org.slf4j.Logger; | ||
| 30 | +import org.slf4j.LoggerFactory; | ||
| 29 | 31 | ||
| 30 | import java.io.IOException; | 32 | import java.io.IOException; |
| 31 | import java.util.ArrayList; | 33 | import java.util.ArrayList; |
| ... | @@ -43,7 +45,10 @@ import static com.google.common.base.Preconditions.checkNotNull; | ... | @@ -43,7 +45,10 @@ import static com.google.common.base.Preconditions.checkNotNull; |
| 43 | * An implementation of control plane metrics back-end database. | 45 | * An implementation of control plane metrics back-end database. |
| 44 | */ | 46 | */ |
| 45 | public final class DefaultMetricsDatabase implements MetricsDatabase { | 47 | public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 48 | + private final Logger log = LoggerFactory.getLogger(getClass()); | ||
| 49 | + | ||
| 46 | private String metricName; | 50 | private String metricName; |
| 51 | + private String resourceName; | ||
| 47 | private RrdDb rrdDb; | 52 | private RrdDb rrdDb; |
| 48 | private Sample sample; | 53 | private Sample sample; |
| 49 | private static final long SECONDS_OF_DAY = 60L * 60L * 24L; | 54 | private static final long SECONDS_OF_DAY = 60L * 60L * 24L; |
| ... | @@ -60,8 +65,9 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { | ... | @@ -60,8 +65,9 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 60 | * @param metricName metric name | 65 | * @param metricName metric name |
| 61 | * @param rrdDb round robin database | 66 | * @param rrdDb round robin database |
| 62 | */ | 67 | */ |
| 63 | - private DefaultMetricsDatabase(String metricName, RrdDb rrdDb) { | 68 | + private DefaultMetricsDatabase(String metricName, String resourceName, RrdDb rrdDb) { |
| 64 | this.metricName = metricName; | 69 | this.metricName = metricName; |
| 70 | + this.resourceName = resourceName; | ||
| 65 | this.rrdDb = rrdDb; | 71 | this.rrdDb = rrdDb; |
| 66 | } | 72 | } |
| 67 | 73 | ||
| ... | @@ -71,6 +77,11 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { | ... | @@ -71,6 +77,11 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 71 | } | 77 | } |
| 72 | 78 | ||
| 73 | @Override | 79 | @Override |
| 80 | + public String resourceName() { | ||
| 81 | + return this.resourceName; | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + @Override | ||
| 74 | public void updateMetric(String metricType, double value) { | 85 | public void updateMetric(String metricType, double value) { |
| 75 | updateMetric(metricType, value, System.currentTimeMillis() / 1000L); | 86 | updateMetric(metricType, value, System.currentTimeMillis() / 1000L); |
| 76 | } | 87 | } |
| ... | @@ -83,7 +94,7 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { | ... | @@ -83,7 +94,7 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 83 | sample.setValue(metricType, value); | 94 | sample.setValue(metricType, value); |
| 84 | sample.update(); | 95 | sample.update(); |
| 85 | } catch (IOException e) { | 96 | } catch (IOException e) { |
| 86 | - e.printStackTrace(); | 97 | + log.error("Failed to update metric value due to {}", e.getMessage()); |
| 87 | } | 98 | } |
| 88 | } | 99 | } |
| 89 | 100 | ||
| ... | @@ -106,7 +117,7 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { | ... | @@ -106,7 +117,7 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 106 | }); | 117 | }); |
| 107 | sample.update(); | 118 | sample.update(); |
| 108 | } catch (IOException e) { | 119 | } catch (IOException e) { |
| 109 | - e.printStackTrace(); | 120 | + log.error("Failed to update metric values due to {}", e.getMessage()); |
| 110 | } | 121 | } |
| 111 | } | 122 | } |
| 112 | 123 | ||
| ... | @@ -116,9 +127,9 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { | ... | @@ -116,9 +127,9 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 116 | checkArgument(rrdDb.containsDs(metricType), NON_EXIST_METRIC); | 127 | checkArgument(rrdDb.containsDs(metricType), NON_EXIST_METRIC); |
| 117 | return rrdDb.getDatasource(metricType).getLastValue(); | 128 | return rrdDb.getDatasource(metricType).getLastValue(); |
| 118 | } catch (IOException e) { | 129 | } catch (IOException e) { |
| 119 | - e.printStackTrace(); | 130 | + log.error("Failed to obtain metric value due to {}", e.getMessage()); |
| 131 | + return 0D; | ||
| 120 | } | 132 | } |
| 121 | - return 0D; | ||
| 122 | } | 133 | } |
| 123 | 134 | ||
| 124 | @Override | 135 | @Override |
| ... | @@ -130,11 +141,14 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { | ... | @@ -130,11 +141,14 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 130 | if (checkTimeRange(startTime, endTime)) { | 141 | if (checkTimeRange(startTime, endTime)) { |
| 131 | FetchRequest fr = rrdDb.createFetchRequest(CONSOL_FUNCTION, startTime, endTime); | 142 | FetchRequest fr = rrdDb.createFetchRequest(CONSOL_FUNCTION, startTime, endTime); |
| 132 | return arrangeDataPoints(fr.fetchData().getValues(metricType)); | 143 | return arrangeDataPoints(fr.fetchData().getValues(metricType)); |
| 144 | + } else { | ||
| 145 | + log.warn("Data projection is out-of-range"); | ||
| 146 | + return new double[0]; | ||
| 133 | } | 147 | } |
| 134 | } catch (IOException e) { | 148 | } catch (IOException e) { |
| 135 | - e.printStackTrace(); | 149 | + log.error("Failed to obtain metric values due to {}", e.getMessage()); |
| 150 | + return new double[0]; | ||
| 136 | } | 151 | } |
| 137 | - return new double[0]; | ||
| 138 | } | 152 | } |
| 139 | 153 | ||
| 140 | @Override | 154 | @Override |
| ... | @@ -145,9 +159,9 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { | ... | @@ -145,9 +159,9 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 145 | long startTime = endTime - SECONDS_OF_DAY + 1; | 159 | long startTime = endTime - SECONDS_OF_DAY + 1; |
| 146 | return minMetric(metricType, startTime, endTime); | 160 | return minMetric(metricType, startTime, endTime); |
| 147 | } catch (IOException e) { | 161 | } catch (IOException e) { |
| 148 | - e.printStackTrace(); | 162 | + log.error("Failed to obtain metric value due to {}", e.getMessage()); |
| 163 | + return 0D; | ||
| 149 | } | 164 | } |
| 150 | - return 0D; | ||
| 151 | } | 165 | } |
| 152 | 166 | ||
| 153 | @Override | 167 | @Override |
| ... | @@ -158,9 +172,9 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { | ... | @@ -158,9 +172,9 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 158 | long startTime = endTime - SECONDS_OF_DAY; | 172 | long startTime = endTime - SECONDS_OF_DAY; |
| 159 | return maxMetric(metricType, startTime, endTime); | 173 | return maxMetric(metricType, startTime, endTime); |
| 160 | } catch (IOException e) { | 174 | } catch (IOException e) { |
| 161 | - e.printStackTrace(); | 175 | + log.error("Failed to obtain metric value due to {}", e.getMessage()); |
| 176 | + return 0D; | ||
| 162 | } | 177 | } |
| 163 | - return 0D; | ||
| 164 | } | 178 | } |
| 165 | 179 | ||
| 166 | @Override | 180 | @Override |
| ... | @@ -171,9 +185,9 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { | ... | @@ -171,9 +185,9 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 171 | long startTime = endTime - SECONDS_OF_DAY; | 185 | long startTime = endTime - SECONDS_OF_DAY; |
| 172 | return metrics(metricType, startTime, endTime); | 186 | return metrics(metricType, startTime, endTime); |
| 173 | } catch (IOException e) { | 187 | } catch (IOException e) { |
| 174 | - e.printStackTrace(); | 188 | + log.error("Failed to obtain metric values due to {}", e.getMessage()); |
| 189 | + return new double[0]; | ||
| 175 | } | 190 | } |
| 176 | - return new double[0]; | ||
| 177 | } | 191 | } |
| 178 | 192 | ||
| 179 | @Override | 193 | @Override |
| ... | @@ -183,22 +197,25 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { | ... | @@ -183,22 +197,25 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 183 | if (checkTimeRange(startTime, endTime)) { | 197 | if (checkTimeRange(startTime, endTime)) { |
| 184 | FetchRequest fr = rrdDb.createFetchRequest(CONSOL_FUNCTION, startTime, endTime); | 198 | FetchRequest fr = rrdDb.createFetchRequest(CONSOL_FUNCTION, startTime, endTime); |
| 185 | return arrangeDataPoints(fr.fetchData().getValues(metricType)); | 199 | return arrangeDataPoints(fr.fetchData().getValues(metricType)); |
| 200 | + } else { | ||
| 201 | + log.warn("Data projection is out-of-range"); | ||
| 202 | + return new double[0]; | ||
| 186 | } | 203 | } |
| 187 | } catch (IOException e) { | 204 | } catch (IOException e) { |
| 188 | - e.printStackTrace(); | 205 | + log.error("Failed to obtain metric values due to {}", e.getMessage()); |
| 206 | + return new double[0]; | ||
| 189 | } | 207 | } |
| 190 | - return new double[0]; | ||
| 191 | } | 208 | } |
| 192 | 209 | ||
| 193 | @Override | 210 | @Override |
| 194 | public long lastUpdate(String metricType) { | 211 | public long lastUpdate(String metricType) { |
| 195 | try { | 212 | try { |
| 196 | checkArgument(rrdDb.containsDs(metricType), NON_EXIST_METRIC); | 213 | checkArgument(rrdDb.containsDs(metricType), NON_EXIST_METRIC); |
| 197 | - rrdDb.getLastUpdateTime(); | 214 | + return rrdDb.getLastUpdateTime(); |
| 198 | } catch (IOException e) { | 215 | } catch (IOException e) { |
| 199 | - e.printStackTrace(); | 216 | + log.error("Failed to obtain last update time due to {}", e.getMessage()); |
| 217 | + return 0L; | ||
| 200 | } | 218 | } |
| 201 | - return 0L; | ||
| 202 | } | 219 | } |
| 203 | 220 | ||
| 204 | // try to check whether projected time range is within a day | 221 | // try to check whether projected time range is within a day |
| ... | @@ -242,12 +259,15 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { | ... | @@ -242,12 +259,15 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 242 | private static final int STEP_VALUE = 1; | 259 | private static final int STEP_VALUE = 1; |
| 243 | private static final int ROW_VALUE = 60 * 24; | 260 | private static final int ROW_VALUE = 60 * 24; |
| 244 | private static final String METRIC_NAME_MSG = "Must specify a metric name."; | 261 | private static final String METRIC_NAME_MSG = "Must specify a metric name."; |
| 262 | + private static final String RESOURCE_NAME_MSG = "Must specify a resource name."; | ||
| 245 | private static final String METRIC_TYPE_MSG = "Must supply at least a metric type."; | 263 | private static final String METRIC_TYPE_MSG = "Must supply at least a metric type."; |
| 264 | + private static final String SPLITTER = "_"; | ||
| 246 | 265 | ||
| 247 | private RrdDb rrdDb; | 266 | private RrdDb rrdDb; |
| 248 | private RrdDef rrdDef; | 267 | private RrdDef rrdDef; |
| 249 | private List<DsDef> dsDefs; | 268 | private List<DsDef> dsDefs; |
| 250 | private String metricName; | 269 | private String metricName; |
| 270 | + private String resourceName; | ||
| 251 | 271 | ||
| 252 | public Builder() { | 272 | public Builder() { |
| 253 | // initialize data source definition list | 273 | // initialize data source definition list |
| ... | @@ -255,11 +275,14 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { | ... | @@ -255,11 +275,14 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 255 | } | 275 | } |
| 256 | 276 | ||
| 257 | @Override | 277 | @Override |
| 258 | - public Builder withMetricName(String metricName) { | 278 | + public Builder withMetricName(String metric) { |
| 259 | - this.metricName = metricName; | 279 | + this.metricName = metric; |
| 280 | + return this; | ||
| 281 | + } | ||
| 260 | 282 | ||
| 261 | - // define the resolution of monitored metrics | 283 | + @Override |
| 262 | - rrdDef = new RrdDef(DB_PATH + "_" + metricName, RESOLUTION_IN_SECOND); | 284 | + public MetricsDatabase.Builder withResourceName(String resource) { |
| 285 | + this.resourceName = resource; | ||
| 263 | return this; | 286 | return this; |
| 264 | } | 287 | } |
| 265 | 288 | ||
| ... | @@ -272,8 +295,13 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { | ... | @@ -272,8 +295,13 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 272 | @Override | 295 | @Override |
| 273 | public MetricsDatabase build() { | 296 | public MetricsDatabase build() { |
| 274 | checkNotNull(metricName, METRIC_NAME_MSG); | 297 | checkNotNull(metricName, METRIC_NAME_MSG); |
| 298 | + checkNotNull(resourceName, RESOURCE_NAME_MSG); | ||
| 275 | checkArgument(dsDefs.size() != 0, METRIC_TYPE_MSG); | 299 | checkArgument(dsDefs.size() != 0, METRIC_TYPE_MSG); |
| 276 | 300 | ||
| 301 | + // define the resolution of monitored metrics | ||
| 302 | + rrdDef = new RrdDef(DB_PATH + SPLITTER + metricName + | ||
| 303 | + SPLITTER + resourceName, RESOLUTION_IN_SECOND); | ||
| 304 | + | ||
| 277 | try { | 305 | try { |
| 278 | DsDef[] dsDefArray = new DsDef[dsDefs.size()]; | 306 | DsDef[] dsDefArray = new DsDef[dsDefs.size()]; |
| 279 | IntStream.range(0, dsDefs.size()).forEach(i -> dsDefArray[i] = dsDefs.get(i)); | 307 | IntStream.range(0, dsDefs.size()).forEach(i -> dsDefArray[i] = dsDefs.get(i)); |
| ... | @@ -292,7 +320,7 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { | ... | @@ -292,7 +320,7 @@ public final class DefaultMetricsDatabase implements MetricsDatabase { |
| 292 | e.printStackTrace(); | 320 | e.printStackTrace(); |
| 293 | } | 321 | } |
| 294 | 322 | ||
| 295 | - return new DefaultMetricsDatabase(metricName, rrdDb); | 323 | + return new DefaultMetricsDatabase(metricName, resourceName, rrdDb); |
| 296 | } | 324 | } |
| 297 | 325 | ||
| 298 | private DsDef defineSchema(String metricType) { | 326 | private DsDef defineSchema(String metricType) { | ... | ... |
| ... | @@ -15,12 +15,18 @@ | ... | @@ -15,12 +15,18 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.cpman.impl; | 16 | package org.onosproject.cpman.impl; |
| 17 | 17 | ||
| 18 | +import com.google.common.collect.ImmutableSet; | ||
| 19 | +import com.google.common.collect.Maps; | ||
| 18 | import org.junit.Before; | 20 | import org.junit.Before; |
| 19 | import org.junit.Test; | 21 | import org.junit.Test; |
| 22 | +import org.onosproject.cpman.ControlMetricType; | ||
| 23 | +import org.onosproject.cpman.ControlResource; | ||
| 20 | import org.onosproject.cpman.MetricsDatabase; | 24 | import org.onosproject.cpman.MetricsDatabase; |
| 25 | +import org.onosproject.net.DeviceId; | ||
| 21 | 26 | ||
| 22 | import java.util.HashMap; | 27 | import java.util.HashMap; |
| 23 | import java.util.Map; | 28 | import java.util.Map; |
| 29 | +import java.util.Set; | ||
| 24 | import java.util.concurrent.TimeUnit; | 30 | import java.util.concurrent.TimeUnit; |
| 25 | 31 | ||
| 26 | import static org.hamcrest.Matchers.is; | 32 | import static org.hamcrest.Matchers.is; |
| ... | @@ -34,9 +40,11 @@ public class MetricsDatabaseTest { | ... | @@ -34,9 +40,11 @@ public class MetricsDatabaseTest { |
| 34 | private MetricsDatabase mdb; | 40 | private MetricsDatabase mdb; |
| 35 | private static final String CPU_METRIC = "cpu"; | 41 | private static final String CPU_METRIC = "cpu"; |
| 36 | private static final String CPU_LOAD = "load"; | 42 | private static final String CPU_LOAD = "load"; |
| 43 | + private static final String DEFAULT_RES = "resource"; | ||
| 37 | private static final String MEMORY_METRIC = "memory"; | 44 | private static final String MEMORY_METRIC = "memory"; |
| 38 | private static final String MEMORY_FREE_PERC = "freePerc"; | 45 | private static final String MEMORY_FREE_PERC = "freePerc"; |
| 39 | private static final String MEMORY_USED_PERC = "usedPerc"; | 46 | private static final String MEMORY_USED_PERC = "usedPerc"; |
| 47 | + private Map<DeviceId, MetricsDatabase> devMetricsMap; | ||
| 40 | 48 | ||
| 41 | /** | 49 | /** |
| 42 | * Initializes metrics database instance. | 50 | * Initializes metrics database instance. |
| ... | @@ -45,6 +53,7 @@ public class MetricsDatabaseTest { | ... | @@ -45,6 +53,7 @@ public class MetricsDatabaseTest { |
| 45 | public void setUp() { | 53 | public void setUp() { |
| 46 | mdb = new DefaultMetricsDatabase.Builder() | 54 | mdb = new DefaultMetricsDatabase.Builder() |
| 47 | .withMetricName(CPU_METRIC) | 55 | .withMetricName(CPU_METRIC) |
| 56 | + .withResourceName(DEFAULT_RES) | ||
| 48 | .addMetricType(CPU_LOAD) | 57 | .addMetricType(CPU_LOAD) |
| 49 | .build(); | 58 | .build(); |
| 50 | } | 59 | } |
| ... | @@ -114,6 +123,7 @@ public class MetricsDatabaseTest { | ... | @@ -114,6 +123,7 @@ public class MetricsDatabaseTest { |
| 114 | public void testMultipleMetrics() { | 123 | public void testMultipleMetrics() { |
| 115 | MetricsDatabase multiMdb = new DefaultMetricsDatabase.Builder() | 124 | MetricsDatabase multiMdb = new DefaultMetricsDatabase.Builder() |
| 116 | .withMetricName(MEMORY_METRIC) | 125 | .withMetricName(MEMORY_METRIC) |
| 126 | + .withResourceName(DEFAULT_RES) | ||
| 117 | .addMetricType(MEMORY_FREE_PERC) | 127 | .addMetricType(MEMORY_FREE_PERC) |
| 118 | .addMetricType(MEMORY_USED_PERC) | 128 | .addMetricType(MEMORY_USED_PERC) |
| 119 | .build(); | 129 | .build(); |
| ... | @@ -126,4 +136,51 @@ public class MetricsDatabaseTest { | ... | @@ -126,4 +136,51 @@ public class MetricsDatabaseTest { |
| 126 | assertThat(30D, is(multiMdb.recentMetric(MEMORY_FREE_PERC))); | 136 | assertThat(30D, is(multiMdb.recentMetric(MEMORY_FREE_PERC))); |
| 127 | assertThat(70D, is(multiMdb.recentMetric(MEMORY_USED_PERC))); | 137 | assertThat(70D, is(multiMdb.recentMetric(MEMORY_USED_PERC))); |
| 128 | } | 138 | } |
| 139 | + | ||
| 140 | + /** | ||
| 141 | + * Tests device metrics map update and query. | ||
| 142 | + */ | ||
| 143 | + @Test | ||
| 144 | + public void testDeviceMetricsMap() { | ||
| 145 | + ControlResource.Type type = ControlResource.Type.CONTROL_MESSAGE; | ||
| 146 | + DeviceId devId1 = DeviceId.deviceId("of:0000000000000101"); | ||
| 147 | + DeviceId devId2 = DeviceId.deviceId("of:0000000000000102"); | ||
| 148 | + | ||
| 149 | + devMetricsMap = Maps.newHashMap(); | ||
| 150 | + | ||
| 151 | + Set<DeviceId> devices = ImmutableSet.of(devId1, devId2); | ||
| 152 | + devices.forEach(dev -> | ||
| 153 | + devMetricsMap.putIfAbsent(dev, | ||
| 154 | + genMDbBuilder(type, ControlResource.CONTROL_MESSAGE_METRICS) | ||
| 155 | + .withResourceName(dev.toString()) | ||
| 156 | + .build())); | ||
| 157 | + | ||
| 158 | + Map<String, Double> metrics1 = new HashMap<>(); | ||
| 159 | + ControlResource.CONTROL_MESSAGE_METRICS.forEach(msgType -> | ||
| 160 | + metrics1.putIfAbsent(msgType.toString(), 10D)); | ||
| 161 | + | ||
| 162 | + Map<String, Double> metrics2 = new HashMap<>(); | ||
| 163 | + ControlResource.CONTROL_MESSAGE_METRICS.forEach(msgType -> | ||
| 164 | + metrics2.putIfAbsent(msgType.toString(), 20D)); | ||
| 165 | + | ||
| 166 | + | ||
| 167 | + devMetricsMap.get(devId1).updateMetrics(metrics1); | ||
| 168 | + devMetricsMap.get(devId2).updateMetrics(metrics2); | ||
| 169 | + | ||
| 170 | + ControlResource.CONTROL_MESSAGE_METRICS.forEach(msgType -> | ||
| 171 | + assertThat(10D, is(devMetricsMap.get(devId1).recentMetric(msgType.toString()))) | ||
| 172 | + ); | ||
| 173 | + | ||
| 174 | + ControlResource.CONTROL_MESSAGE_METRICS.forEach(msgType -> | ||
| 175 | + assertThat(20D, is(devMetricsMap.get(devId2).recentMetric(msgType.toString()))) | ||
| 176 | + ); | ||
| 177 | + } | ||
| 178 | + | ||
| 179 | + private MetricsDatabase.Builder genMDbBuilder(ControlResource.Type resourceType, | ||
| 180 | + Set<ControlMetricType> metricTypes) { | ||
| 181 | + MetricsDatabase.Builder builder = new DefaultMetricsDatabase.Builder(); | ||
| 182 | + builder.withMetricName(resourceType.toString()); | ||
| 183 | + metricTypes.forEach(type -> builder.addMetricType(type.toString())); | ||
| 184 | + return builder; | ||
| 185 | + } | ||
| 129 | } | 186 | } | ... | ... |
| ... | @@ -141,7 +141,7 @@ public class OpenFlowControlMessageAggregator implements Runnable { | ... | @@ -141,7 +141,7 @@ public class OpenFlowControlMessageAggregator implements Runnable { |
| 141 | * @return count value | 141 | * @return count value |
| 142 | */ | 142 | */ |
| 143 | private long getCount(OFType type) { | 143 | private long getCount(OFType type) { |
| 144 | - return (long) countMeterMap.get(type).getOneMinuteRate() * | 144 | + return (long) (countMeterMap.get(type).getOneMinuteRate() |
| 145 | - EXECUTE_PERIOD_IN_SECOND; | 145 | + * EXECUTE_PERIOD_IN_SECOND); |
| 146 | } | 146 | } |
| 147 | } | 147 | } | ... | ... |
-
Please register or login to post a comment