Yuta HIGUCHI
Committed by Yuta Higuchi

Add probes to DistributedIntentStore

Change-Id: I23a5823d3924392dc17166404a17fc1918c01453
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
15 */ 15 */
16 package org.onlab.onos.store.intent.impl; 16 package org.onlab.onos.store.intent.impl;
17 17
18 +import com.codahale.metrics.Timer;
19 +import com.codahale.metrics.Timer.Context;
18 import com.google.common.base.Verify; 20 import com.google.common.base.Verify;
19 import com.google.common.collect.ImmutableSet; 21 import com.google.common.collect.ImmutableSet;
20 22
...@@ -24,6 +26,8 @@ import org.apache.felix.scr.annotations.Deactivate; ...@@ -24,6 +26,8 @@ import org.apache.felix.scr.annotations.Deactivate;
24 import org.apache.felix.scr.annotations.Reference; 26 import org.apache.felix.scr.annotations.Reference;
25 import org.apache.felix.scr.annotations.ReferenceCardinality; 27 import org.apache.felix.scr.annotations.ReferenceCardinality;
26 import org.apache.felix.scr.annotations.Service; 28 import org.apache.felix.scr.annotations.Service;
29 +import org.onlab.metrics.MetricsService;
30 +import org.onlab.onos.core.MetricsHelper;
27 import org.onlab.onos.net.intent.Intent; 31 import org.onlab.onos.net.intent.Intent;
28 import org.onlab.onos.net.intent.IntentEvent; 32 import org.onlab.onos.net.intent.IntentEvent;
29 import org.onlab.onos.net.intent.IntentId; 33 import org.onlab.onos.net.intent.IntentId;
...@@ -48,12 +52,13 @@ import java.util.concurrent.ConcurrentHashMap; ...@@ -48,12 +52,13 @@ import java.util.concurrent.ConcurrentHashMap;
48 52
49 import static org.onlab.onos.net.intent.IntentState.*; 53 import static org.onlab.onos.net.intent.IntentState.*;
50 import static org.slf4j.LoggerFactory.getLogger; 54 import static org.slf4j.LoggerFactory.getLogger;
55 +import static org.onlab.metrics.MetricsUtil.*;
51 56
52 @Component(immediate = true, enabled = true) 57 @Component(immediate = true, enabled = true)
53 @Service 58 @Service
54 public class DistributedIntentStore 59 public class DistributedIntentStore
55 extends AbstractStore<IntentEvent, IntentStoreDelegate> 60 extends AbstractStore<IntentEvent, IntentStoreDelegate>
56 - implements IntentStore { 61 + implements IntentStore, MetricsHelper {
57 62
58 /** Valid parking state, which can transition to INSTALLED. */ 63 /** Valid parking state, which can transition to INSTALLED. */
59 private static final Set<IntentState> PRE_INSTALLED = EnumSet.of(SUBMITTED, INSTALLED, FAILED); 64 private static final Set<IntentState> PRE_INSTALLED = EnumSet.of(SUBMITTED, INSTALLED, FAILED);
...@@ -81,11 +86,41 @@ public class DistributedIntentStore ...@@ -81,11 +86,41 @@ public class DistributedIntentStore
81 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 86 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
82 protected DatabaseService dbService; 87 protected DatabaseService dbService;
83 88
89 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
90 + protected MetricsService metricsService;
91 +
84 // TODO make this configurable 92 // TODO make this configurable
85 private boolean onlyLogTransitionError = true; 93 private boolean onlyLogTransitionError = true;
86 94
95 + private Timer createIntentTimer;
96 + private Timer removeIntentTimer;
97 + private Timer setInstallableIntentsTimer;
98 + private Timer getInstallableIntentsTimer;
99 + private Timer removeInstalledIntentsTimer;
100 + private Timer setStateTimer;
101 + private Timer getIntentCountTimer;
102 + private Timer getIntentsTimer;
103 + private Timer getIntentTimer;
104 + private Timer getIntentStateTimer;
105 +
106 +
107 + private Timer createResponseTimer(String methodName) {
108 + return createTimer("IntentStore", methodName, "responseTime");
109 + }
110 +
87 @Activate 111 @Activate
88 public void activate() { 112 public void activate() {
113 + createIntentTimer = createResponseTimer("createIntent");
114 + removeIntentTimer = createResponseTimer("removeIntent");
115 + setInstallableIntentsTimer = createResponseTimer("setInstallableIntents");
116 + getInstallableIntentsTimer = createResponseTimer("getInstallableIntents");
117 + removeInstalledIntentsTimer = createResponseTimer("removeInstalledIntents");
118 + setStateTimer = createResponseTimer("setState");
119 + getIntentCountTimer = createResponseTimer("getIntentCount");
120 + getIntentsTimer = createResponseTimer("getIntents");
121 + getIntentTimer = createResponseTimer("getIntent");
122 + getIntentStateTimer = createResponseTimer("getIntentState");
123 +
89 // FIXME: We need a way to add serializer for intents which has been plugged-in. 124 // FIXME: We need a way to add serializer for intents which has been plugged-in.
90 // As a short term workaround, relax Kryo config to 125 // As a short term workaround, relax Kryo config to
91 // registrationRequired=false 126 // registrationRequired=false
...@@ -118,7 +153,14 @@ public class DistributedIntentStore ...@@ -118,7 +153,14 @@ public class DistributedIntentStore
118 } 153 }
119 154
120 @Override 155 @Override
156 + public MetricsService metricsService() {
157 + return metricsService;
158 + }
159 +
160 + @Override
121 public IntentEvent createIntent(Intent intent) { 161 public IntentEvent createIntent(Intent intent) {
162 + Context timer = startTimer(createIntentTimer);
163 + try {
122 boolean absent = intents.putIfAbsent(intent.id(), intent); 164 boolean absent = intents.putIfAbsent(intent.id(), intent);
123 if (!absent) { 165 if (!absent) {
124 // duplicate, ignore 166 // duplicate, ignore
...@@ -126,10 +168,15 @@ public class DistributedIntentStore ...@@ -126,10 +168,15 @@ public class DistributedIntentStore
126 } else { 168 } else {
127 return this.setState(intent, IntentState.SUBMITTED); 169 return this.setState(intent, IntentState.SUBMITTED);
128 } 170 }
171 + } finally {
172 + stopTimer(timer);
173 + }
129 } 174 }
130 175
131 @Override 176 @Override
132 public IntentEvent removeIntent(IntentId intentId) { 177 public IntentEvent removeIntent(IntentId intentId) {
178 + Context timer = startTimer(removeIntentTimer);
179 + try {
133 Intent intent = intents.remove(intentId); 180 Intent intent = intents.remove(intentId);
134 installable.remove(intentId); 181 installable.remove(intentId);
135 if (intent == null) { 182 if (intent == null) {
...@@ -141,32 +188,56 @@ public class DistributedIntentStore ...@@ -141,32 +188,56 @@ public class DistributedIntentStore
141 transientStates.remove(intentId); 188 transientStates.remove(intentId);
142 // TODO: Should we callremoveInstalledIntents if this Intent was 189 // TODO: Should we callremoveInstalledIntents if this Intent was
143 return event; 190 return event;
191 + } finally {
192 + stopTimer(timer);
193 + }
144 } 194 }
145 195
146 @Override 196 @Override
147 public long getIntentCount() { 197 public long getIntentCount() {
198 + Context timer = startTimer(getIntentCountTimer);
199 + try {
148 return intents.size(); 200 return intents.size();
201 + } finally {
202 + stopTimer(timer);
203 + }
149 } 204 }
150 205
151 @Override 206 @Override
152 public Iterable<Intent> getIntents() { 207 public Iterable<Intent> getIntents() {
208 + Context timer = startTimer(getIntentsTimer);
209 + try {
153 return ImmutableSet.copyOf(intents.values()); 210 return ImmutableSet.copyOf(intents.values());
211 + } finally {
212 + stopTimer(timer);
213 + }
154 } 214 }
155 215
156 @Override 216 @Override
157 public Intent getIntent(IntentId intentId) { 217 public Intent getIntent(IntentId intentId) {
218 + Context timer = startTimer(getIntentTimer);
219 + try {
158 return intents.get(intentId); 220 return intents.get(intentId);
221 + } finally {
222 + stopTimer(timer);
223 + }
159 } 224 }
160 225
161 @Override 226 @Override
162 public IntentState getIntentState(IntentId id) { 227 public IntentState getIntentState(IntentId id) {
228 + Context timer = startTimer(getIntentStateTimer);
229 + try {
163 final IntentState localState = transientStates.get(id); 230 final IntentState localState = transientStates.get(id);
164 if (localState != null) { 231 if (localState != null) {
165 return localState; 232 return localState;
166 } 233 }
167 return states.get(id); 234 return states.get(id);
235 + } finally {
236 + stopTimer(timer);
237 + }
168 } 238 }
169 239
240 + // FIXME temporary workaround until we fix our state machine
170 private void verify(boolean expression, String errorMessageTemplate, Object... errorMessageArgs) { 241 private void verify(boolean expression, String errorMessageTemplate, Object... errorMessageArgs) {
171 if (onlyLogTransitionError) { 242 if (onlyLogTransitionError) {
172 if (!expression) { 243 if (!expression) {
...@@ -179,6 +250,8 @@ public class DistributedIntentStore ...@@ -179,6 +250,8 @@ public class DistributedIntentStore
179 250
180 @Override 251 @Override
181 public IntentEvent setState(Intent intent, IntentState state) { 252 public IntentEvent setState(Intent intent, IntentState state) {
253 + Context timer = startTimer(setStateTimer);
254 + try {
182 final IntentId id = intent.id(); 255 final IntentId id = intent.id();
183 IntentEvent.Type evtType = null; 256 IntentEvent.Type evtType = null;
184 final IntentState prevParking; 257 final IntentState prevParking;
...@@ -248,20 +321,38 @@ public class DistributedIntentStore ...@@ -248,20 +321,38 @@ public class DistributedIntentStore
248 return null; 321 return null;
249 } 322 }
250 return new IntentEvent(evtType, intent); 323 return new IntentEvent(evtType, intent);
324 + } finally {
325 + stopTimer(timer);
326 + }
251 } 327 }
252 328
253 @Override 329 @Override
254 public void setInstallableIntents(IntentId intentId, List<Intent> result) { 330 public void setInstallableIntents(IntentId intentId, List<Intent> result) {
331 + Context timer = startTimer(setInstallableIntentsTimer);
332 + try {
255 installable.put(intentId, result); 333 installable.put(intentId, result);
334 + } finally {
335 + stopTimer(timer);
336 + }
256 } 337 }
257 338
258 @Override 339 @Override
259 public List<Intent> getInstallableIntents(IntentId intentId) { 340 public List<Intent> getInstallableIntents(IntentId intentId) {
341 + Context timer = startTimer(getInstallableIntentsTimer);
342 + try {
260 return installable.get(intentId); 343 return installable.get(intentId);
344 + } finally {
345 + stopTimer(timer);
346 + }
261 } 347 }
262 348
263 @Override 349 @Override
264 public void removeInstalledIntents(IntentId intentId) { 350 public void removeInstalledIntents(IntentId intentId) {
351 + Context timer = startTimer(removeInstalledIntentsTimer);
352 + try {
265 installable.remove(intentId); 353 installable.remove(intentId);
354 + } finally {
355 + stopTimer(timer);
356 + }
266 } 357 }
267 } 358 }
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
15 */ 15 */
16 package org.onlab.onos.store.intent.impl; 16 package org.onlab.onos.store.intent.impl;
17 17
18 +import com.codahale.metrics.Timer;
19 +import com.codahale.metrics.Timer.Context;
18 import com.google.common.base.Verify; 20 import com.google.common.base.Verify;
19 import com.google.common.collect.ImmutableSet; 21 import com.google.common.collect.ImmutableSet;
20 import com.hazelcast.core.EntryAdapter; 22 import com.hazelcast.core.EntryAdapter;
...@@ -26,7 +28,11 @@ import com.hazelcast.core.Member; ...@@ -26,7 +28,11 @@ import com.hazelcast.core.Member;
26 import org.apache.felix.scr.annotations.Activate; 28 import org.apache.felix.scr.annotations.Activate;
27 import org.apache.felix.scr.annotations.Component; 29 import org.apache.felix.scr.annotations.Component;
28 import org.apache.felix.scr.annotations.Deactivate; 30 import org.apache.felix.scr.annotations.Deactivate;
31 +import org.apache.felix.scr.annotations.Reference;
32 +import org.apache.felix.scr.annotations.ReferenceCardinality;
29 import org.apache.felix.scr.annotations.Service; 33 import org.apache.felix.scr.annotations.Service;
34 +import org.onlab.metrics.MetricsService;
35 +import org.onlab.onos.core.MetricsHelper;
30 import org.onlab.onos.net.intent.Intent; 36 import org.onlab.onos.net.intent.Intent;
31 import org.onlab.onos.net.intent.IntentEvent; 37 import org.onlab.onos.net.intent.IntentEvent;
32 import org.onlab.onos.net.intent.IntentId; 38 import org.onlab.onos.net.intent.IntentId;
...@@ -48,12 +54,13 @@ import java.util.concurrent.ConcurrentHashMap; ...@@ -48,12 +54,13 @@ import java.util.concurrent.ConcurrentHashMap;
48 54
49 import static org.onlab.onos.net.intent.IntentState.*; 55 import static org.onlab.onos.net.intent.IntentState.*;
50 import static org.slf4j.LoggerFactory.getLogger; 56 import static org.slf4j.LoggerFactory.getLogger;
57 +import static org.onlab.metrics.MetricsUtil.*;
51 58
52 @Component(immediate = true, enabled = false) 59 @Component(immediate = true, enabled = false)
53 @Service 60 @Service
54 public class HazelcastIntentStore 61 public class HazelcastIntentStore
55 extends AbstractHazelcastStore<IntentEvent, IntentStoreDelegate> 62 extends AbstractHazelcastStore<IntentEvent, IntentStoreDelegate>
56 - implements IntentStore { 63 + implements IntentStore, MetricsHelper {
57 64
58 /** Valid parking state, which can transition to INSTALLED. */ 65 /** Valid parking state, which can transition to INSTALLED. */
59 private static final Set<IntentState> PRE_INSTALLED = EnumSet.of(SUBMITTED, INSTALLED, FAILED); 66 private static final Set<IntentState> PRE_INSTALLED = EnumSet.of(SUBMITTED, INSTALLED, FAILED);
...@@ -72,12 +79,41 @@ public class HazelcastIntentStore ...@@ -72,12 +79,41 @@ public class HazelcastIntentStore
72 79
73 private SMap<IntentId, List<Intent>> installable; 80 private SMap<IntentId, List<Intent>> installable;
74 81
82 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
83 + protected MetricsService metricsService;
84 +
75 // TODO make this configurable 85 // TODO make this configurable
76 private boolean onlyLogTransitionError = true; 86 private boolean onlyLogTransitionError = true;
77 87
88 + private Timer createIntentTimer;
89 + private Timer removeIntentTimer;
90 + private Timer setInstallableIntentsTimer;
91 + private Timer getInstallableIntentsTimer;
92 + private Timer removeInstalledIntentsTimer;
93 + private Timer setStateTimer;
94 + private Timer getIntentCountTimer;
95 + private Timer getIntentsTimer;
96 + private Timer getIntentTimer;
97 + private Timer getIntentStateTimer;
98 +
99 + private Timer createResponseTimer(String methodName) {
100 + return createTimer("IntentStore", methodName, "responseTime");
101 + }
102 +
78 @Override 103 @Override
79 @Activate 104 @Activate
80 public void activate() { 105 public void activate() {
106 + createIntentTimer = createResponseTimer("createIntent");
107 + removeIntentTimer = createResponseTimer("removeIntent");
108 + setInstallableIntentsTimer = createResponseTimer("setInstallableIntents");
109 + getInstallableIntentsTimer = createResponseTimer("getInstallableIntents");
110 + removeInstalledIntentsTimer = createResponseTimer("removeInstalledIntents");
111 + setStateTimer = createResponseTimer("setState");
112 + getIntentCountTimer = createResponseTimer("getIntentCount");
113 + getIntentsTimer = createResponseTimer("getIntents");
114 + getIntentTimer = createResponseTimer("getIntent");
115 + getIntentStateTimer = createResponseTimer("getIntentState");
116 +
81 // FIXME: We need a way to add serializer for intents which has been plugged-in. 117 // FIXME: We need a way to add serializer for intents which has been plugged-in.
82 // As a short term workaround, relax Kryo config to 118 // As a short term workaround, relax Kryo config to
83 // registrationRequired=false 119 // registrationRequired=false
...@@ -120,7 +156,14 @@ public class HazelcastIntentStore ...@@ -120,7 +156,14 @@ public class HazelcastIntentStore
120 } 156 }
121 157
122 @Override 158 @Override
159 + public MetricsService metricsService() {
160 + return metricsService;
161 + }
162 +
163 + @Override
123 public IntentEvent createIntent(Intent intent) { 164 public IntentEvent createIntent(Intent intent) {
165 + Context timer = startTimer(createIntentTimer);
166 + try {
124 Intent existing = intents.putIfAbsent(intent.id(), intent); 167 Intent existing = intents.putIfAbsent(intent.id(), intent);
125 if (existing != null) { 168 if (existing != null) {
126 // duplicate, ignore 169 // duplicate, ignore
...@@ -128,10 +171,15 @@ public class HazelcastIntentStore ...@@ -128,10 +171,15 @@ public class HazelcastIntentStore
128 } else { 171 } else {
129 return this.setState(intent, IntentState.SUBMITTED); 172 return this.setState(intent, IntentState.SUBMITTED);
130 } 173 }
174 + } finally {
175 + stopTimer(timer);
176 + }
131 } 177 }
132 178
133 @Override 179 @Override
134 public IntentEvent removeIntent(IntentId intentId) { 180 public IntentEvent removeIntent(IntentId intentId) {
181 + Context timer = startTimer(removeIntentTimer);
182 + try {
135 Intent intent = intents.remove(intentId); 183 Intent intent = intents.remove(intentId);
136 installable.remove(intentId); 184 installable.remove(intentId);
137 if (intent == null) { 185 if (intent == null) {
...@@ -143,30 +191,53 @@ public class HazelcastIntentStore ...@@ -143,30 +191,53 @@ public class HazelcastIntentStore
143 transientStates.remove(intentId); 191 transientStates.remove(intentId);
144 // TODO: Should we callremoveInstalledIntents if this Intent was 192 // TODO: Should we callremoveInstalledIntents if this Intent was
145 return event; 193 return event;
194 + } finally {
195 + stopTimer(timer);
196 + }
146 } 197 }
147 198
148 @Override 199 @Override
149 public long getIntentCount() { 200 public long getIntentCount() {
201 + Context timer = startTimer(getIntentCountTimer);
202 + try {
150 return intents.size(); 203 return intents.size();
204 + } finally {
205 + stopTimer(timer);
206 + }
151 } 207 }
152 208
153 @Override 209 @Override
154 public Iterable<Intent> getIntents() { 210 public Iterable<Intent> getIntents() {
211 + Context timer = startTimer(getIntentsTimer);
212 + try {
155 return ImmutableSet.copyOf(intents.values()); 213 return ImmutableSet.copyOf(intents.values());
214 + } finally {
215 + stopTimer(timer);
216 + }
156 } 217 }
157 218
158 @Override 219 @Override
159 public Intent getIntent(IntentId intentId) { 220 public Intent getIntent(IntentId intentId) {
221 + Context timer = startTimer(getIntentTimer);
222 + try {
160 return intents.get(intentId); 223 return intents.get(intentId);
224 + } finally {
225 + stopTimer(timer);
226 + }
161 } 227 }
162 228
163 @Override 229 @Override
164 public IntentState getIntentState(IntentId id) { 230 public IntentState getIntentState(IntentId id) {
231 + Context timer = startTimer(getIntentStateTimer);
232 + try {
165 final IntentState localState = transientStates.get(id); 233 final IntentState localState = transientStates.get(id);
166 if (localState != null) { 234 if (localState != null) {
167 return localState; 235 return localState;
168 } 236 }
169 return states.get(id); 237 return states.get(id);
238 + } finally {
239 + stopTimer(timer);
240 + }
170 } 241 }
171 242
172 private void verify(boolean expression, String errorMessageTemplate, Object... errorMessageArgs) { 243 private void verify(boolean expression, String errorMessageTemplate, Object... errorMessageArgs) {
...@@ -181,6 +252,9 @@ public class HazelcastIntentStore ...@@ -181,6 +252,9 @@ public class HazelcastIntentStore
181 252
182 @Override 253 @Override
183 public IntentEvent setState(Intent intent, IntentState state) { 254 public IntentEvent setState(Intent intent, IntentState state) {
255 + Context timer = startTimer(setStateTimer);
256 + try {
257 +
184 final IntentId id = intent.id(); 258 final IntentId id = intent.id();
185 IntentEvent.Type type = null; 259 IntentEvent.Type type = null;
186 final IntentState prevParking; 260 final IntentState prevParking;
...@@ -236,21 +310,39 @@ public class HazelcastIntentStore ...@@ -236,21 +310,39 @@ public class HazelcastIntentStore
236 return null; 310 return null;
237 } 311 }
238 return new IntentEvent(type, intent); 312 return new IntentEvent(type, intent);
313 + } finally {
314 + stopTimer(timer);
315 + }
239 } 316 }
240 317
241 @Override 318 @Override
242 public void setInstallableIntents(IntentId intentId, List<Intent> result) { 319 public void setInstallableIntents(IntentId intentId, List<Intent> result) {
320 + Context timer = startTimer(setInstallableIntentsTimer);
321 + try {
243 installable.put(intentId, result); 322 installable.put(intentId, result);
323 + } finally {
324 + stopTimer(timer);
325 + }
244 } 326 }
245 327
246 @Override 328 @Override
247 public List<Intent> getInstallableIntents(IntentId intentId) { 329 public List<Intent> getInstallableIntents(IntentId intentId) {
330 + Context timer = startTimer(getInstallableIntentsTimer);
331 + try {
248 return installable.get(intentId); 332 return installable.get(intentId);
333 + } finally {
334 + stopTimer(timer);
335 + }
249 } 336 }
250 337
251 @Override 338 @Override
252 public void removeInstalledIntents(IntentId intentId) { 339 public void removeInstalledIntents(IntentId intentId) {
340 + Context timer = startTimer(removeInstalledIntentsTimer);
341 + try {
253 installable.remove(intentId); 342 installable.remove(intentId);
343 + } finally {
344 + stopTimer(timer);
345 + }
254 } 346 }
255 347
256 public final class RemoteIntentStateListener extends EntryAdapter<IntentId, IntentState> { 348 public final class RemoteIntentStateListener extends EntryAdapter<IntentId, IntentState> {
......