【问题标题】:How can I start and stop a timer in different classes?如何在不同的课程中启动和停止计时器?
【发布时间】:2019-05-02 08:25:43
【问题描述】:

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

我该怎么做?

【问题讨论】:

  • 你已经尝试过什么?我建议使用static 类来存储这些日期
  • 我还没有尝试过任何东西,因为我想知道是否有内置方法。我正在考虑围绕计时器制作一个包装豆并将其注入两个地方。
  • 可以使用AOP来监控请求的开始和竞争

标签: java spring-boot timing micrometer


【解决方案1】:

你可以像下面这样使用 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";
        }
    }
}

【讨论】:

  • 我也会选择方面。然后特定类本身不需要更改。您还可以测量其他 lib 类的时间。
【解决方案2】:

使用 AOP ......无需在每个类级别上进行更改。这将是一个地方配置..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多