java - 如何在不同的类(class)中启动和停止计时器?

标签 java spring-boot timing micrometer

我想测量从传入 HTTP 请求开始到应用程序到达某一点的时间。这两个时间点都位于不同的类中。我将如何启动和停止这些不同类别的计时器。我没有找到使用 MeterRegistry 中的“命名”计时器的方法。

我该如何解决这个问题?

最佳答案

您可以使用 AOP,如下所示:

@Aspect
@Component
public class ControllerMonitor {

    protected static  final Logger LOGGER = LoggerFactory.getLogger(ControllerMonitor.class);


    @Before("execution(public * com.demo.controller.*Controller.*(..))")
    public void logBeforeAccess(JoinPoint joinPoint) {
        if(joinPoint!=null){
            String packageName = joinPoint.getSignature()!=null?joinPoint.getSignature().getDeclaringTypeName():"LOG-404";
            LOGGER.info(". . .A request initiated from controller [" + packageName + "."+ getMethodSignature(joinPoint) +  "]. . .");
        }

    }

    @After("execution(public * com.demo.controller.*Controller.*(..))")
    public void logAfterAccess(JoinPoint joinPoint) {
        if(joinPoint!=null){
            String packageName = joinPoint.getSignature()!=null?joinPoint.getSignature().getDeclaringTypeName():"LOG-404";
            LOGGER.info(". . .Request from controller [" + packageName + "."+ getMethodSignature(joinPoint) +  "] completed. . .");
        }
    }

    @AfterThrowing(pointcut = "execution(public * com.demo.controller.*Controller.*(..))",throwing="exception")
    public void logAfterThrowing(Exception exception){
        LOGGER.error("Exception caught:"+ exception.getMessage());
    }

    private String getMethodSignature(JoinPoint joinPoint){
        if(joinPoint!=null){
            String methodName = joinPoint.getSignature().getName();
            Object[] arguments = joinPoint.getArgs();
            StringBuilder sb=new StringBuilder();
            if(arguments!=null){
                for (Object param: arguments) {
                    sb.append(param).append(",");
                }
                sb =(sb.length()>1)?sb.deleteCharAt(sb.length()-1):sb;
            }
            methodName = methodName+"("+new String(sb)+")";
            return methodName;
        }else{
            return "LOG-405";
        }
    }
}

关于java - 如何在不同的类(class)中启动和停止计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55948389/

相关文章:

java - Jboss 7.1 独立套接字/端口错误

java - LockModeType.PESSIMISTIC_WRITE 是否锁定结果行或整个表?

spring-boot - 指标未显示在/prometheus 端点上

c++ - 使用 gettimeofday 和 localtime 的准确时间戳

java - 如何测量频繁中断的流程/方法的准确执行时间?

Java - 相对于 JFrame 的光标位置

java - 为什么我会得到带有迭代器的 java.util.ConcurrentModificationException?

java - 从流的内部过滤器获取 boolean 值

spring-boot - Prometheus 不会从执行器/prometheus 中抓取指标

指定时间的 Javascript 运行循环