0

Spring Insight documentation states:

A trace represents a thread of execution. It is usually started by an HTTP request but can also be started by a background job

My application architecture style is one of queues running in the background that I'd like to instrument as well. However, I can't figure out how to get Spring Insight to instrument these calls initiated by queued message. I.e. I'd like to instrument the trace after a message is read off of the queue.

How can I ensure Insight instruments these background jobs?

Brent Fisher
  • 132
  • 3
  • 12

1 Answers1

0

I ended up creating an aspect that targets all of the Command Handlers. It extends the AbstractOperationCollectionAspect, implements the collectionPoint aspect passing in the Handler as an argument to use when it implements the createOperation method.
I.e.

public aspect CommandHandlerOperationCollectionAspect extends AbstractOperationCollectionAspect
{

    public pointcut collectionPoint():
            execution(* com.xtrac.common.core.handler.ThreadedHandler.HandlerRunnable.executeActorHandler(com.xtrac.common.core.handler.Handler,java.lang.Object));


    protected Operation createOperation(JoinPoint jp)
    {
        Object[] args = jp.getArgs();
        com.xtrac.common.core.handler.Handler handler = (Handler) args[0];
        Operation operation = new Operation()
                .type(XTRACOperationType.COMMAND_HANDLER)
                .label(handler.getClass().getSimpleName())
                .sourceCodeLocation(getSourceCodeLocation(jp));
        return operation;
    }

    @Override
    public String getPluginName()
    {
        return HandlerPluginRuntimeDescriptor.PLUGIN_NAME;
    }

    @Override
    public boolean isMetricsGenerator()
    {
        return true;
    }
}

I also implemented an AbstractSingleTypeEndpointAnalyzer to fill out the analyzer: public class HandlerEndPointAnalyzer extends AbstractSingleTypeEndpointAnalyzer { private static final HandlerEndPointAnalyzer INSTANCE=new HandlerEndPointAnalyzer();

    private HandlerEndPointAnalyzer() {
        super(XTRACOperationType.COMMAND_HANDLER);
    }

    public static final HandlerEndPointAnalyzer getInstance() {
        return INSTANCE;
    }

    @Override
        protected EndPointAnalysis makeEndPoint(Frame handlerFrame, int depth) {
            Operation operation = handlerFrame.getOperation();
    String resourceLabel = operation.getLabel();
    String exampleRequest = EndPointAnalysis.getHttpExampleRequest(handlerFrame);
    return new EndPointAnalysis(EndPointName.valueOf(resourceLabel),
                                resourceLabel,
                                exampleRequest,
                                getOperationScore(operation, depth),
                                operation);
}

being sure to add it as a descriptor:

public class HandlerPluginRuntimeDescriptor extends PluginRuntimeDescriptor {
    public static final String PLUGIN_NAME = "handler";
    private static final HandlerPluginRuntimeDescriptor INSTANCE=new HandlerPluginRuntimeDescriptor();
    private static final List<? extends EndPointAnalyzer>   epAnalyzers=
            ArrayUtil.asUnmodifiableList(HandlerEndPointAnalyzer.getInstance());

    private HandlerPluginRuntimeDescriptor() {
        super();
    }

    public static final HandlerPluginRuntimeDescriptor getInstance() {
        return INSTANCE;
    }

    @Override
    public Collection<? extends EndPointAnalyzer> getEndPointAnalyzers() {
        return epAnalyzers;
    }

    @Override
    public String getPluginName() {
        return PLUGIN_NAME;
    }
}

All noted in the spring xml file:

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:insight="http://www.springframework.org/schema/insight-idk"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/insight-idk http://www.springframework.org/schema/insight-idk/insight-idk-1.0.xsd">

  <insight:plugin name="handler" version="${project.version}" publisher="XTRAC Solutions LLC" />


  <insight:operation-group group="XTRAC Handlers" operation="command_handler_operation" />
  <insight:operation-group group="XTRAC Handlers" operation="event_handler_operation" />
  <insight:operation-group group="XTRAC Classic" operation="xtrac_workflow_operation" />

  <insight:operation-view operation="command_handler_operation"
                          template="com/xtrac/insight/command_handler_operation.ftl" />
  <insight:operation-view operation="event_handler_operation"
                          template="com/xtrac/insight/event_handler_operation.ftl" />
  <insight:operation-view operation="xtrac_workflow_operation"
                          template="com/xtrac/insight/xtrac_workflow_operation.ftl" />

    <bean id="handlerPluginEndPointAnalyzer"
          class="com.xtrac.insight.HandlerEndPointAnalyzer"
          factory-method="getInstance"
          lazy-init="true"
        />
    <bean id="handlerPluginRuntimeDescriptor"
             class="com.xtrac.insight.HandlerPluginRuntimeDescriptor"
             factory-method="getInstance"
             lazy-init="true"
           />

</beans>

along with some ftls.

I also created a MethodOperationCollectionAspect to collect some of the web service calls that occur in these handers. This sets it up for a nice display that tells me a lot about what is going on during the hander operation, and how much time it takes. E.g. Example of Spring Handlers with web service calls intermixed

This set up a framework for maintaining a monitor on the health of the application if I set up the base line Thresholds for the named handlers

Thresholds

This is very useful because I can then tell if the application is healthy. Otherwise, the endpoints default to <200 ms for healthy.
Health

Brent Fisher
  • 132
  • 3
  • 12