Showing
8 changed files
with
463 additions
and
0 deletions
| ... | @@ -11,6 +11,7 @@ | ... | @@ -11,6 +11,7 @@ |
| 11 | <bundle>mvn:io.netty/netty/3.9.2.Final</bundle> | 11 | <bundle>mvn:io.netty/netty/3.9.2.Final</bundle> |
| 12 | 12 | ||
| 13 | <bundle>mvn:com.hazelcast/hazelcast/3.3</bundle> | 13 | <bundle>mvn:com.hazelcast/hazelcast/3.3</bundle> |
| 14 | + <bundle>mvn:com.codahale.metrics/metrics-core/3.0.2</bundle> | ||
| 14 | <bundle>mvn:com.eclipsesource.minimal-json/minimal-json/0.9.1</bundle> | 15 | <bundle>mvn:com.eclipsesource.minimal-json/minimal-json/0.9.1</bundle> |
| 15 | 16 | ||
| 16 | <bundle>mvn:com.esotericsoftware.kryo/kryo/2.24.0</bundle> | 17 | <bundle>mvn:com.esotericsoftware.kryo/kryo/2.24.0</bundle> | ... | ... |
| ... | @@ -55,6 +55,11 @@ | ... | @@ -55,6 +55,11 @@ |
| 55 | <groupId>org.objenesis</groupId> | 55 | <groupId>org.objenesis</groupId> |
| 56 | <artifactId>objenesis</artifactId> | 56 | <artifactId>objenesis</artifactId> |
| 57 | </dependency> | 57 | </dependency> |
| 58 | + <dependency> | ||
| 59 | + <groupId>com.codahale.metrics</groupId> | ||
| 60 | + <artifactId>metrics-core</artifactId> | ||
| 61 | + <version>3.0.2</version> | ||
| 62 | + </dependency> | ||
| 58 | </dependencies> | 63 | </dependencies> |
| 59 | 64 | ||
| 60 | </project> | 65 | </project> | ... | ... |
| 1 | +package org.onlab.metrics; | ||
| 2 | + | ||
| 3 | +import java.util.concurrent.ConcurrentHashMap; | ||
| 4 | +import java.util.concurrent.ConcurrentMap; | ||
| 5 | + | ||
| 6 | +/** | ||
| 7 | + * Components to register for metrics. | ||
| 8 | + */ | ||
| 9 | +public class MetricsComponent implements MetricsComponentRegistry { | ||
| 10 | + private final String name; | ||
| 11 | + | ||
| 12 | + /** | ||
| 13 | + * Registry to hold the Features defined in this Component. | ||
| 14 | + */ | ||
| 15 | + private final ConcurrentMap<String, MetricsFeature> featuresRegistry = | ||
| 16 | + new ConcurrentHashMap<>(); | ||
| 17 | + | ||
| 18 | + /** | ||
| 19 | + * Constructs a component from a name. | ||
| 20 | + * | ||
| 21 | + * @param newName name of the component | ||
| 22 | + */ | ||
| 23 | + MetricsComponent(final String newName) { | ||
| 24 | + name = newName; | ||
| 25 | + } | ||
| 26 | + | ||
| 27 | + @Override public String getName() { | ||
| 28 | + return name; | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | + @Override public MetricsFeature registerFeature(final String featureName) { | ||
| 32 | + MetricsFeature feature = featuresRegistry.get(featureName); | ||
| 33 | + if (feature == null) { | ||
| 34 | + final MetricsFeature createdFeature = new MetricsFeature(featureName); | ||
| 35 | + feature = featuresRegistry.putIfAbsent(featureName, createdFeature); | ||
| 36 | + if (feature == null) { | ||
| 37 | + feature = createdFeature; | ||
| 38 | + } | ||
| 39 | + } | ||
| 40 | + return feature; | ||
| 41 | + } | ||
| 42 | +} |
| 1 | +package org.onlab.metrics; | ||
| 2 | + | ||
| 3 | +/** | ||
| 4 | + * Features to tag metrics. | ||
| 5 | + */ | ||
| 6 | +public class MetricsFeature { | ||
| 7 | + private final String name; | ||
| 8 | + | ||
| 9 | + /** | ||
| 10 | + * Constructs a Feature from a name. | ||
| 11 | + * | ||
| 12 | + * @param newName name of the Feature | ||
| 13 | + */ | ||
| 14 | + MetricsFeature(final String newName) { | ||
| 15 | + name = newName; | ||
| 16 | + } | ||
| 17 | + | ||
| 18 | + public String getName() { | ||
| 19 | + return name; | ||
| 20 | + } | ||
| 21 | +} |
| 1 | +package org.onlab.metrics; | ||
| 2 | + | ||
| 3 | +import java.util.Map; | ||
| 4 | +import java.util.concurrent.ConcurrentHashMap; | ||
| 5 | +import java.util.concurrent.ConcurrentMap; | ||
| 6 | + | ||
| 7 | +import com.codahale.metrics.Counter; | ||
| 8 | +import com.codahale.metrics.Gauge; | ||
| 9 | +import com.codahale.metrics.Histogram; | ||
| 10 | +import com.codahale.metrics.Meter; | ||
| 11 | +import com.codahale.metrics.Metric; | ||
| 12 | +import com.codahale.metrics.MetricFilter; | ||
| 13 | +import com.codahale.metrics.MetricRegistry; | ||
| 14 | +import com.codahale.metrics.Timer; | ||
| 15 | + | ||
| 16 | +/** | ||
| 17 | + * This class holds the Metrics registry for ONOS. | ||
| 18 | + * All metrics (Counter, Histogram, Timer, Meter, Gauge) use a hierarchical | ||
| 19 | + * string-based naming scheme: COMPONENT.FEATURE.NAME. | ||
| 20 | + * Example: "Topology.Counters.TopologyUpdates". | ||
| 21 | + * The COMPONENT and FEATURE names have to be registered in advance before | ||
| 22 | + * a metric can be created. Example: | ||
| 23 | + * <pre> | ||
| 24 | + * <code> | ||
| 25 | + * private final MetricsManager.MetricsComponent COMPONENT = | ||
| 26 | + * MetricsManager.registerComponent("Topology"); | ||
| 27 | + * private final MetricsManager.MetricsFeature FEATURE = | ||
| 28 | + * COMPONENT.registerFeature("Counters"); | ||
| 29 | + * private final Counter counterTopologyUpdates = | ||
| 30 | + * MetricsManager.createCounter(COMPONENT, FEATURE, "TopologyUpdates"); | ||
| 31 | + * </code> | ||
| 32 | + * </pre> | ||
| 33 | + * Gauges are slightly different because they are not created directly in | ||
| 34 | + * this class, but are allocated by the caller and passed in for registration: | ||
| 35 | + * <pre> | ||
| 36 | + * <code> | ||
| 37 | + * private final Gauge<Long> gauge = | ||
| 38 | + * new {@literal Gauge<Long>}() { | ||
| 39 | + * {@literal @}Override | ||
| 40 | + * public Long getValue() { | ||
| 41 | + * return gaugeValue; | ||
| 42 | + * } | ||
| 43 | + * }; | ||
| 44 | + * MetricsManager.registerMetric(COMPONENT, FEATURE, GAUGE_NAME, gauge); | ||
| 45 | + * </code> | ||
| 46 | + * </pre> | ||
| 47 | + */ | ||
| 48 | +public final class MetricsManager implements MetricsService { | ||
| 49 | + | ||
| 50 | + /** | ||
| 51 | + * Registry to hold the Components defined in the system. | ||
| 52 | + */ | ||
| 53 | + private ConcurrentMap<String, MetricsComponent> componentsRegistry = | ||
| 54 | + new ConcurrentHashMap<>(); | ||
| 55 | + | ||
| 56 | + /** | ||
| 57 | + * Registry for the Metrics objects created in the system. | ||
| 58 | + */ | ||
| 59 | + private final MetricRegistry metricsRegistry = new MetricRegistry(); | ||
| 60 | + | ||
| 61 | + /** | ||
| 62 | + * Hide constructor. The only way to get the registry is through the | ||
| 63 | + * singleton getter. | ||
| 64 | + */ | ||
| 65 | + private MetricsManager() {} | ||
| 66 | + | ||
| 67 | + /** | ||
| 68 | + * Registers a component. | ||
| 69 | + * | ||
| 70 | + * @param name name of the Component to register | ||
| 71 | + * @return MetricsComponent object that can be used to create Metrics. | ||
| 72 | + */ | ||
| 73 | + public MetricsComponent registerComponent(final String name) { | ||
| 74 | + MetricsComponent component = componentsRegistry.get(name); | ||
| 75 | + if (component == null) { | ||
| 76 | + final MetricsComponent createdComponent = new MetricsComponent(name); | ||
| 77 | + component = componentsRegistry.putIfAbsent(name, createdComponent); | ||
| 78 | + if (component == null) { | ||
| 79 | + component = createdComponent; | ||
| 80 | + } | ||
| 81 | + } | ||
| 82 | + return component; | ||
| 83 | + } | ||
| 84 | + | ||
| 85 | + /** | ||
| 86 | + * Generates a name for a Metric from its component and feature. | ||
| 87 | + * | ||
| 88 | + * @param component component the metric is defined in | ||
| 89 | + * @param feature feature the metric is defined in | ||
| 90 | + * @param metricName local name of the metric | ||
| 91 | + * | ||
| 92 | + * @return full name of the metric | ||
| 93 | + */ | ||
| 94 | + public String generateName(final MetricsComponent component, | ||
| 95 | + final MetricsFeature feature, | ||
| 96 | + final String metricName) { | ||
| 97 | + return MetricRegistry.name(component.getName(), | ||
| 98 | + feature.getName(), | ||
| 99 | + metricName); | ||
| 100 | + } | ||
| 101 | + | ||
| 102 | + /** | ||
| 103 | + * Creates a Counter metric. | ||
| 104 | + * | ||
| 105 | + * @param component component the Counter is defined in | ||
| 106 | + * @param feature feature the Counter is defined in | ||
| 107 | + * @param metricName local name of the metric | ||
| 108 | + * @return the created Counter Meteric | ||
| 109 | + */ | ||
| 110 | + public Counter createCounter(final MetricsComponent component, | ||
| 111 | + final MetricsFeature feature, | ||
| 112 | + final String metricName) { | ||
| 113 | + final String name = generateName(component, feature, metricName); | ||
| 114 | + return metricsRegistry.counter(name); | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + /** | ||
| 118 | + * Creates a Histogram metric. | ||
| 119 | + * | ||
| 120 | + * @param component component the Histogram is defined in | ||
| 121 | + * @param feature feature the Histogram is defined in | ||
| 122 | + * @param metricName local name of the metric | ||
| 123 | + * @return the created Histogram Metric | ||
| 124 | + */ | ||
| 125 | + public Histogram createHistogram(final MetricsComponent component, | ||
| 126 | + final MetricsFeature feature, | ||
| 127 | + final String metricName) { | ||
| 128 | + final String name = generateName(component, feature, metricName); | ||
| 129 | + return metricsRegistry.histogram(name); | ||
| 130 | + } | ||
| 131 | + | ||
| 132 | + /** | ||
| 133 | + * Creates a Timer metric. | ||
| 134 | + * | ||
| 135 | + * @param component component the Timer is defined in | ||
| 136 | + * @param feature feature the Timeer is defined in | ||
| 137 | + * @param metricName local name of the metric | ||
| 138 | + * @return the created Timer Metric | ||
| 139 | + */ | ||
| 140 | + public Timer createTimer(final MetricsComponent component, | ||
| 141 | + final MetricsFeature feature, | ||
| 142 | + final String metricName) { | ||
| 143 | + final String name = generateName(component, feature, metricName); | ||
| 144 | + return metricsRegistry.timer(name); | ||
| 145 | + } | ||
| 146 | + | ||
| 147 | + /** | ||
| 148 | + * Creates a Meter metric. | ||
| 149 | + * | ||
| 150 | + * @param component component the Meter is defined in | ||
| 151 | + * @param feature feature the Meter is defined in | ||
| 152 | + * @param metricName local name of the metric | ||
| 153 | + * @return the created Meter Metric | ||
| 154 | + */ | ||
| 155 | + public Meter createMeter(final MetricsComponent component, | ||
| 156 | + final MetricsFeature feature, | ||
| 157 | + final String metricName) { | ||
| 158 | + final String name = generateName(component, feature, metricName); | ||
| 159 | + return metricsRegistry.meter(name); | ||
| 160 | + } | ||
| 161 | + | ||
| 162 | + /** | ||
| 163 | + * Registers an already created Metric. This is used for situation where a | ||
| 164 | + * caller needs to allocate its own Metric, but still register it with the | ||
| 165 | + * system. | ||
| 166 | + * | ||
| 167 | + * @param <T> Metric type | ||
| 168 | + * @param component component the Metric is defined in | ||
| 169 | + * @param feature feature the Metric is defined in | ||
| 170 | + * @param metricName local name of the metric | ||
| 171 | + * @param metric Metric to register | ||
| 172 | + * @return the registered Metric | ||
| 173 | + */ | ||
| 174 | + public <T extends Metric> T registerMetric( | ||
| 175 | + final MetricsComponent component, | ||
| 176 | + final MetricsFeature feature, | ||
| 177 | + final String metricName, | ||
| 178 | + final T metric) { | ||
| 179 | + final String name = generateName(component, feature, metricName); | ||
| 180 | + metricsRegistry.register(name, metric); | ||
| 181 | + return metric; | ||
| 182 | + } | ||
| 183 | + | ||
| 184 | + /** | ||
| 185 | + * Fetches the existing Timers. | ||
| 186 | + * | ||
| 187 | + * @param filter filter to use to select Timers | ||
| 188 | + * @return a map of the Timers that match the filter, with the key as the | ||
| 189 | + * name String to the Timer. | ||
| 190 | + */ | ||
| 191 | + public Map<String, Timer> getTimers(final MetricFilter filter) { | ||
| 192 | + return metricsRegistry.getTimers(filter); | ||
| 193 | + } | ||
| 194 | + | ||
| 195 | + /** | ||
| 196 | + * Fetches the existing Gauges. | ||
| 197 | + * | ||
| 198 | + * @param filter filter to use to select Gauges | ||
| 199 | + * @return a map of the Gauges that match the filter, with the key as the | ||
| 200 | + * name String to the Gauge. | ||
| 201 | + */ | ||
| 202 | + @SuppressWarnings("rawtypes") | ||
| 203 | + public Map<String, Gauge> getGauges(final MetricFilter filter) { | ||
| 204 | + return metricsRegistry.getGauges(filter); | ||
| 205 | + } | ||
| 206 | + | ||
| 207 | + /** | ||
| 208 | + * Fetches the existing Counters. | ||
| 209 | + * | ||
| 210 | + * @param filter filter to use to select Counters | ||
| 211 | + * @return a map of the Counters that match the filter, with the key as the | ||
| 212 | + * name String to the Counter. | ||
| 213 | + */ | ||
| 214 | + public Map<String, Counter> getCounters(final MetricFilter filter) { | ||
| 215 | + return metricsRegistry.getCounters(filter); | ||
| 216 | + } | ||
| 217 | + | ||
| 218 | + /** | ||
| 219 | + * Fetches the existing Meters. | ||
| 220 | + * | ||
| 221 | + * @param filter filter to use to select Meters | ||
| 222 | + * @return a map of the Meters that match the filter, with the key as the | ||
| 223 | + * name String to the Meter. | ||
| 224 | + */ | ||
| 225 | + public Map<String, Meter> getMeters(final MetricFilter filter) { | ||
| 226 | + return metricsRegistry.getMeters(filter); | ||
| 227 | + } | ||
| 228 | + | ||
| 229 | + /** | ||
| 230 | + * Fetches the existing Histograms. | ||
| 231 | + * | ||
| 232 | + * @param filter filter to use to select Histograms | ||
| 233 | + * @return a map of the Histograms that match the filter, with the key as the | ||
| 234 | + * name String to the Histogram. | ||
| 235 | + */ | ||
| 236 | + public Map<String, Histogram> getHistograms(final MetricFilter filter) { | ||
| 237 | + return metricsRegistry.getHistograms(filter); | ||
| 238 | + } | ||
| 239 | + | ||
| 240 | + /** | ||
| 241 | + * Removes all Metrics that match a given filter. | ||
| 242 | + * | ||
| 243 | + * @param filter filter to use to select the Metrics to remove. | ||
| 244 | + */ | ||
| 245 | + public void removeMatching(final MetricFilter filter) { | ||
| 246 | + metricsRegistry.removeMatching(filter); | ||
| 247 | + } | ||
| 248 | +} | ||
| 249 | + |
| 1 | +package org.onlab.metrics; | ||
| 2 | + | ||
| 3 | +import java.util.Map; | ||
| 4 | + | ||
| 5 | +import com.codahale.metrics.Counter; | ||
| 6 | +import com.codahale.metrics.Gauge; | ||
| 7 | +import com.codahale.metrics.Histogram; | ||
| 8 | +import com.codahale.metrics.Meter; | ||
| 9 | +import com.codahale.metrics.Metric; | ||
| 10 | +import com.codahale.metrics.MetricFilter; | ||
| 11 | +import com.codahale.metrics.Timer; | ||
| 12 | + | ||
| 13 | +/** | ||
| 14 | + * Metrics Service to collect metrics. | ||
| 15 | + */ | ||
| 16 | +interface MetricsService { | ||
| 17 | + | ||
| 18 | + /** | ||
| 19 | + * Registers a component. | ||
| 20 | + * | ||
| 21 | + * @param name name of the Component to register | ||
| 22 | + * @return MetricsComponent object that can be used to create Metrics. | ||
| 23 | + */ | ||
| 24 | + MetricsComponent registerComponent(String name); | ||
| 25 | + | ||
| 26 | + /** | ||
| 27 | + * Creates a Counter metric. | ||
| 28 | + * | ||
| 29 | + * @param component component the Counter is defined in | ||
| 30 | + * @param feature feature the Counter is defined in | ||
| 31 | + * @param metricName local name of the metric | ||
| 32 | + * @return the created Counter Meteric | ||
| 33 | + */ | ||
| 34 | + Counter createCounter(MetricsComponent component, | ||
| 35 | + MetricsFeature feature, | ||
| 36 | + String metricName); | ||
| 37 | + | ||
| 38 | + /** | ||
| 39 | + * Creates a Histogram metric. | ||
| 40 | + * | ||
| 41 | + * @param component component the Histogram is defined in | ||
| 42 | + * @param feature feature the Histogram is defined in | ||
| 43 | + * @param metricName local name of the metric | ||
| 44 | + * @return the created Histogram Metric | ||
| 45 | + */ | ||
| 46 | + Histogram createHistogram(MetricsComponent component, | ||
| 47 | + MetricsFeature feature, | ||
| 48 | + String metricName); | ||
| 49 | + | ||
| 50 | + /** | ||
| 51 | + * Creates a Timer metric. | ||
| 52 | + * | ||
| 53 | + * @param component component the Timer is defined in | ||
| 54 | + * @param feature feature the Timer is defined in | ||
| 55 | + * @param metricName local name of the metric | ||
| 56 | + * @return the created Timer Metric | ||
| 57 | + */ | ||
| 58 | + Timer createTimer(MetricsComponent component, | ||
| 59 | + MetricsFeature feature, | ||
| 60 | + String metricName); | ||
| 61 | + | ||
| 62 | + /** | ||
| 63 | + * Registers an already created Metric. This is used for situation where a | ||
| 64 | + * caller needs to allocate its own Metric, but still register it with the | ||
| 65 | + * system. | ||
| 66 | + * | ||
| 67 | + * @param <T> Metric type | ||
| 68 | + * @param component component the Metric is defined in | ||
| 69 | + * @param feature feature the Metric is defined in | ||
| 70 | + * @param metricName local name of the metric | ||
| 71 | + * @param metric Metric to register | ||
| 72 | + * @return the registered Metric | ||
| 73 | + */ | ||
| 74 | + <T extends Metric> T registerMetric( | ||
| 75 | + MetricsComponent component, | ||
| 76 | + MetricsFeature feature, | ||
| 77 | + String metricName, | ||
| 78 | + T metric); | ||
| 79 | + | ||
| 80 | + /** | ||
| 81 | + * Fetches the existing Timers. | ||
| 82 | + * | ||
| 83 | + * @param filter filter to use to select Timers | ||
| 84 | + * @return a map of the Timers that match the filter, with the key as the | ||
| 85 | + * name String to the Timer. | ||
| 86 | + */ | ||
| 87 | + Map<String, Timer> getTimers(MetricFilter filter); | ||
| 88 | + | ||
| 89 | + /** | ||
| 90 | + * Fetches the existing Gauges. | ||
| 91 | + * | ||
| 92 | + * @param filter filter to use to select Gauges | ||
| 93 | + * @return a map of the Gauges that match the filter, with the key as the | ||
| 94 | + * name String to the Gauge. | ||
| 95 | + */ | ||
| 96 | + Map<String, Gauge> getGauges(MetricFilter filter); | ||
| 97 | + | ||
| 98 | + /** | ||
| 99 | + * Fetches the existing Counters. | ||
| 100 | + * | ||
| 101 | + * @param filter filter to use to select Counters | ||
| 102 | + * @return a map of the Counters that match the filter, with the key as the | ||
| 103 | + * name String to the Counter. | ||
| 104 | + */ | ||
| 105 | + Map<String, Counter> getCounters(MetricFilter filter); | ||
| 106 | + | ||
| 107 | + /** | ||
| 108 | + * Fetches the existing Meters. | ||
| 109 | + * | ||
| 110 | + * @param filter filter to use to select Meters | ||
| 111 | + * @return a map of the Meters that match the filter, with the key as the | ||
| 112 | + * name String to the Meter. | ||
| 113 | + */ | ||
| 114 | + Map<String, Meter> getMeters(MetricFilter filter); | ||
| 115 | + | ||
| 116 | + /** | ||
| 117 | + * Fetches the existing Histograms. | ||
| 118 | + * | ||
| 119 | + * @param filter filter to use to select Histograms | ||
| 120 | + * @return a map of the Histograms that match the filter, with the key as the | ||
| 121 | + * name String to the Histogram. | ||
| 122 | + */ | ||
| 123 | + Map<String, Histogram> getHistograms(MetricFilter filter); | ||
| 124 | + /** | ||
| 125 | + * Removes all Metrics that match a given filter. | ||
| 126 | + * | ||
| 127 | + * @param filter filter to use to select the Metrics to remove. | ||
| 128 | + */ | ||
| 129 | + void removeMatching(MetricFilter filter); | ||
| 130 | + | ||
| 131 | +} |
-
Please register or login to post a comment