class MeterTimerInterceptor extends BaseMeterInterceptor<MeterTimer, Timer> {

    @Override
    protected MeterTimer getAnno(Invocation inv) {<FILL_FUNCTION_BODY>}

    @Override
    protected String getAnnoName(MeterTimer anno) {
        return Utils.annoAlias(anno.value(), anno.name());
    }

    @Override
    protected Object metering(Invocation inv, MeterTimer anno) throws Throwable {
        //获取度量器
        String meterName = getMeterName(inv, anno);
        Timer meter = getMeter(meterName, () -> {
            return Timer.builder(meterName)
                    .description(anno.description())
                    .tags(getMeterTags(inv, anno.tags()))
                    .publishPercentiles(anno.percentiles())
                    .register(Metrics.globalRegistry);
        });

        //计时
        long start = System.currentTimeMillis();
        try {
            return inv.invoke();
        } finally {
            long span = System.currentTimeMillis() - start;
            meter.record(span, TimeUnit.MILLISECONDS);
        }
    }
}

        MeterTimer anno = inv.getMethodAnnotation(MeterTimer.class);
        if (anno == null) {
            anno = inv.getTargetAnnotation(MeterTimer.class);
        }

        return anno;
    
<methods>public non-sealed void <init>() ,public java.lang.Object doIntercept(org.noear.solon.core.aspect.Invocation) throws java.lang.Throwable<variables>private final Map<java.lang.String,io.micrometer.core.instrument.Timer> meterCached