@Around("allComponents()")
    public Object aroundElasticApmMonitoredComponents(final ProceedingJoinPoint joinPoint) {
        val parentTransaction = ElasticApm.currentTransaction();

        val spanType = getSpanTypeFromJoinPoint(joinPoint);
        val span = parentTransaction.startExitSpan(spanType,
            joinPoint.getTarget().getClass().getSimpleName(), joinPoint.getSignature().getName());
        try {
            val taskName = joinPoint.getSignature().getDeclaringTypeName() + '.' + joinPoint.getSignature().getName();
            LOGGER.debug("[{}]: Started exit span [{}] to execute [{}]", spanType, span.getId(), taskName);
            val result = executeJoinpoint(joinPoint);
            span.setName(taskName);
            span.setOutcome(Outcome.SUCCESS);
            return result;
        } catch (final Exception e) {
            span.setOutcome(Outcome.FAILURE);
            span.captureException(e);
            throw e;
        } finally {
            LOGGER.debug("Span [{}] ended", span.getId());
            span.end();
        }
    }
Around pointcut to wrap all monitorable components in the CAS namespace.
Starts an exit span, and returns the result of the joinpoint in the end.

@param joinPoint the join point
@return the object
support/cas-server-support-elastic/src/main/java/org/apereo/cas/apm/ElasticApmMonitoringAspect.java