当前位置: 首页 > 面试题库 >

如何使用弹簧护套2和千分尺测量维修方法

闻人栋
2023-03-14
问题内容

我在Spring Boot 2(RC1)上开始了我的第一个项目。由于已经有了很好的文档,Spring Boot 1.x并没有使它变得很困难。

但是,现在我想要集成指标,因此我感到很沮丧。据我目前所能找到的信息,只有默认情况下随附的指标文档。但是我还想测量服务级别的执行时间以及dynamodb中使用的时间。

编辑 我正在寻找一种使用Micrometer的解决方案,该解决方案是spring-boot 2随附的新执行器库中使用的库。

是否有关于如何完成此操作的指南?从这个我读了有任意春豆没有简单的基于注解的解决方案呢。能否给我一个示例/链接到有关如何计量如下方法的文档?

@Service
@Timed
public class MyService {
    public void doSomething() {
        ...;
    }
}

问题答案:

这是一个小样本,应该可以帮助您。这里Timer.record()没有显示更多的变体。(此外:字段注入仅出于简洁目的。)您不必将调用的方法名称放入标签中。您也可以使其成为度量标准名称本身的一部分。只是想展示您可以做什么。

更新2018年3月12日: 中作为Micrometer 1.0.0一个TimedAspect已经出台,让你也可以使用@Timed注解。现在,您需要注册Bean自己。(尽管在@TimedSpring-MVC或Jersey资源上具有自定义注释时,您必须要谨慎。)[MichalStepan]在后续回答中已经提到了这一点。

package io.github.mweirauch.micrometered.eval;

import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import io.micrometer.core.annotation.Timed;
import io.micrometer.core.aop.TimedAspect;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import io.micrometer.core.instrument.Timer.Sample;

@Configuration
@EnableAspectJAutoProxy
public class TimingStuff {

    @Service
    static class MyService {

        @Autowired
        private MeterRegistry registry;

        public void helloManual() {
            // you can keep a ref to this; ok to call multiple times, though
            Timer timer = Timer.builder("myservice").tag("method", "manual").register(registry);

            // manually do the timing calculation
            long start = System.nanoTime();
            doSomething();
            timer.record(System.nanoTime() - start, TimeUnit.NANOSECONDS);
        }

        public void helloSupplier() {
            Timer timer = Timer.builder("myservice").tag("method", "supplier").register(registry);

            // execution of the method is timed internally
            timer.record(() -> doSomething());
        }

        public void helloSample() {
            Timer timer = Timer.builder("myservice").tag("method", "sample").register(registry);

            // records time taken between Sample creation and registering the
            // stop() with the given Timer
            Sample sample = Timer.start(registry);
            doSomething();
            sample.stop(timer);
        }

        // TimedAspect adds "class" and "method" tags
        @Timed(value = "myservice.aspect")
        public void helloAspect() {
            doSomething();
        }

        private void doSomething() {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                //
            }
        }

    }

    @Autowired
    private MyService myService;

    @Bean
    TimedAspect timedAspect(MeterRegistry registry) {
        return new TimedAspect(registry);
    }

    @Scheduled(fixedRate = 1000)
    public void postConstruct() {
        myService.helloManual();
        myService.helloSupplier();
        myService.helloSample();
        myService.helloAspect();
    }

}

如果您选择普罗米修斯,您最终会得到类似的东西:

# HELP myservice_seconds  
# TYPE myservice_seconds summary
myservice_seconds_count{application="micrometered",method="manual",} 4.0
myservice_seconds_sum{application="micrometered",method="manual",} 0.200378014
myservice_seconds_max{application="micrometered",method="manual",} 0.050115291
myservice_seconds_count{application="micrometered",method="supplier",} 4.0
myservice_seconds_sum{application="micrometered",method="supplier",} 0.200393455
myservice_seconds_max{application="micrometered",method="supplier",} 0.05011635
myservice_seconds_count{application="micrometered",method="sample",} 4.0
myservice_seconds_sum{application="micrometered",method="sample",} 0.200527005
myservice_seconds_max{application="micrometered",method="sample",} 0.050250191
# HELP myservice_aspect_seconds  
# TYPE myservice_aspect_seconds summary
myservice_aspect_seconds_count{application="micrometered",class="io.github.mweirauch.micrometered.eval.TimingStuff$MyService",method="helloAspect",} 4.0
myservice_aspect_seconds_sum{application="micrometered",class="io.github.mweirauch.micrometered.eval.TimingStuff$MyService",method="helloAspect",} 0.201824272
myservice_aspect_seconds_max{application="micrometered",class="io.github.mweirauch.micrometered.eval.TimingStuff$MyService",method="helloAspect",} 0.051014296


 类似资料:
  • 有没有关于如何做到这一点的指南?从这里我了解到,对于任意的spring bean,还没有一个简单的基于注释的解决方案。S.O.会不会。给我一个例子/链接到文档,说明如何度量下面的方法?

  • 我对Spring很陌生,正在尝试将我的应用程序连接到麋鹿。该应用程序运行的是Spring boot 1.5.5,因此我使用的是微米遗产。我的pom看起来像这样: 每当我尝试启动我的应用程序时,我都会收到以下错误: 根本原因似乎是类io.micrometer.core.instrument.config.validate.Validated它似乎没有像它应该的那样出现在包中。对此有什么想法吗?

  • 是否有任何方法可以测量实用程序如何使用线程池?我已经浏览了代码,但还没有看到任何直接的选项。

  • 我有一个Spring Boot应用程序,我现在正在迁移到Micrometer。 我想实现的是,随着时间的推移计算特定对象的调用。 让我们假设我有一个创建某些品牌的汽车的功能。然后我想测量一下我在过去一分钟内创造了多少辆福特,斯柯达,大众等。特别是,如果在 之间没有创建斯柯达,则指标应返回 0。 文档声明我不应该使用计数器,因为在运行应用程序时,创建的汽车数量可能会无限增长。计时器也不太合适,因为我

  • 我想测量使用WebFlux进行的一些异步调用的长度。我已经阅读了各种来源,因为我了解到注释与AspectJ一起工作,基本上只是在方法调用之前启动计时器,然后停止。这显然不适用于异步方法。 是否有任何针对WebFlux的解决方案,或者我唯一能做的就是传递执行时间戳,使我的应用程序逻辑混乱?

  • 假设我有一个应用程序,其中REST API更新产品的价格。 我想使用微米计来公开新价格作为指标。我无法理解微米计留档应该如何完成。 唯一对我有效的DoubleFunction是在我的ProductService中创建一个新方法来返回它的价格。这似乎是我想公开作为指标的每一条数据的开销。 我这里缺少什么?为什么不足以更新Gauge?