web-dev-qa-db-ja.com

スプリングブート2とマイクロメーターを使用して保守方法を測定する方法

Spring Boot 2(RC1)で最初のプロジェクトを開始しました。すでに優れたドキュメントのおかげで、これはSpring Boot 1.xから来るのは難しくありません。

ただし、メトリックを統合したいので、私は困惑しています。現在私が見つけることができた限り、デフォルトで出荷されているメトリックのドキュメントのみがあります。しかし、dynamodbで使用される時間だけでなく、サービスレベルの実行時間も測定したいと思います。

[〜#〜] edit [〜#〜]Micrometerを使用するソリューションを探しています。これは、スプリングに付属の新しいアクチュエータライブラリで使用されるライブラリです-boot 2。

これを行う方法に関するガイドはありますか? this から、任意のSpring Beanに対する簡単な注釈ベースのソリューションがまだないことを読みました。できた以下のような方法がどのように計測されるかについての例/ドキュメントへのリンクを教えてください?

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

以下に、サンプルを紹介します。ここには示されていないTimer.record()のバリエーションがあります。 (また、簡潔にするためにのみ使用されるフィールドインジェクション。)呼び出されたメソッド名をタグに入れる必要はありません。また、メトリック名自体の一部にすることもできます。できることを見せたかっただけです。

2018-03-12を更新:Micrometer 1.0.0 a TimedAspectが導入されたため、@Timed注釈。今のところ、Beanを自分で登録する必要があります。 (ただし、カスタム@Timed Spring-MVCまたはJerseyリソースの注釈。これは、 Michal Stepan のフォローアップ answer で既に言及されています。

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
12
mweirauch

@io.micrometer.core.annotation.Timed注釈は、スコープの縮小により、カスタムコールの順序に問題があるようです。言及されているのは 質問のリンク です。

アスペクトを手動でセットアップする必要があります。

@Configuration
@EnableAspectJAutoProxy
public class AutoTimingConfiguration {
    @Bean
    public TimedAspect timedAspect(MeterRegistry registry) {
        return new TimedAspect(registry);
        }
}

この方法は次のようになります。

@Timed("GET_CARS")
public List<Car> getCars(){
        return Lists.newArrayList();
}

結果はGET_CARSメトリック/actuator/metrics(デフォルト)エンドポイント。

18
Michal Stepan