Implement action monitoring and tracing

- Modify transitions and actions so that
  action execution can be monitored.
- Extend StateMachineMonitor
- Add new ActionListener
- Relates to #149
This commit is contained in:
Janne Valkealahti
2016-10-27 06:58:23 +01:00
parent 83e59c2a60
commit cc2893c4b8
17 changed files with 369 additions and 27 deletions

View File

@@ -22,10 +22,12 @@ import org.springframework.boot.actuate.metrics.CounterService;
import org.springframework.boot.actuate.metrics.GaugeService;
import org.springframework.boot.actuate.trace.TraceRepository;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.action.Action;
import org.springframework.statemachine.monitor.AbstractStateMachineMonitor;
import org.springframework.statemachine.monitor.StateMachineMonitor;
import org.springframework.statemachine.state.State;
import org.springframework.statemachine.transition.Transition;
import org.springframework.util.ObjectUtils;
/**
* Implementation of a {@link StateMachineMonitor} which converts monitoring
@@ -39,7 +41,8 @@ import org.springframework.statemachine.transition.Transition;
*/
public class BootStateMachineMonitor<S, E> extends AbstractStateMachineMonitor<S, E> {
private final String METRIC_BASE = "ssm.transition";
private final String METRIC_TRANSITION_BASE = "ssm.transition";
private final String METRIC_ACTION_BASE = "ssm.action";
private final CounterService counterService;
private final GaugeService gaugeService;
private final TraceRepository traceRepository;
@@ -61,8 +64,8 @@ public class BootStateMachineMonitor<S, E> extends AbstractStateMachineMonitor<S
@Override
public void transition(StateMachine<S, E> stateMachine, Transition<S, E> transition, long duration) {
String transitionName = transitionToName(transition);
this.counterService.increment(METRIC_BASE + "." + transitionName + ".transit");
this.gaugeService.submit(METRIC_BASE + "." + transitionName + ".duration", duration);
this.counterService.increment(METRIC_TRANSITION_BASE + "." + transitionName + ".transit");
this.gaugeService.submit(METRIC_TRANSITION_BASE + "." + transitionName + ".duration", duration);
Map<String, Object> traceInfo = new HashMap<>();
traceInfo.put("transition", transitionToName(transition));
traceInfo.put("duration", duration);
@@ -70,6 +73,18 @@ public class BootStateMachineMonitor<S, E> extends AbstractStateMachineMonitor<S
traceRepository.add(traceInfo);
}
@Override
public void action(StateMachine<S, E> stateMachine, Action<S, E> action, long duration) {
String actionName = actionToName(action);
this.counterService.increment(METRIC_ACTION_BASE + "." + actionName + ".execute");
this.gaugeService.submit(METRIC_ACTION_BASE + "." + actionName + ".duration", duration);
Map<String, Object> traceInfo = new HashMap<>();
traceInfo.put("action", actionName);
traceInfo.put("duration", duration);
traceInfo.put("machine", stateMachine.getId());
traceRepository.add(traceInfo);
}
private static <S, E> String transitionToName(Transition<S, E> transition) {
String sourceId = nullStateId(transition.getSource());
String targetId = nullStateId(transition.getTarget());
@@ -86,6 +101,10 @@ public class BootStateMachineMonitor<S, E> extends AbstractStateMachineMonitor<S
return buf.toString();
}
private static <S, E> String actionToName(Action<S, E> action) {
return ObjectUtils.getDisplayString(action);
}
private static <S, E> String nullStateId(State<S, E> state) {
if (state == null) {
return null;