メトリックとAspectJを使用した@Timedアノテーション

1. 前書き

*監視はバグの発見とパフォーマンスの最適化に非常に役立ちます。*手動でコードをインスツルメントしてタイマーとログを追加することもできますが、これは多くの気を散らす定型句につながります。
一方、https://www.baeldung.com/dropwizard-metrics [Dropwizard Metrics]などの注釈によって駆動される監視フレームワークを使用できます。
このチュートリアルでは、https://github.com/astefanutti/metrics-aspectj [Metrics AspectJ]とDropwizard Metrics @_Timed_アノテーションを使用して単純なクラスをインストルメントします。

2. Mavenセットアップ

まず、プロジェクトにMetrics AspectJ Maven依存関係を追加しましょう。
<dependency>
    <groupId>io.astefanutti.metrics.aspectj</groupId>
    <artifactId>metrics-aspectj</artifactId>
    <version>1.2.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>io.astefanutti.metrics.aspectj</groupId>
    <artifactId>metrics-aspectj-deps</artifactId>
    <version>1.2.0</version>
</dependency>
https://search.maven.org/search?q=a:metrics-aspectj%20AND%20g:io.astefanutti.metrics.aspectj[_metrics-aspectj_]を使用して、アスペクト指向プログラミングを介して_metrics_を提供し、https ://search.maven.org/search?q = a:metrics-aspectj-deps%20AND%20g:io.astefanutti.metrics.aspectj [_metrics-aspectj-deps_]を使用して、依存関係を提供します。
また、https://search.maven.org/search?q = g:org.codehaus.mojo%20AND%20a:aspectj-maven-plugin [_aspectj-maven-plugin_]も必要です。指標の注釈:
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.8</version>
    <configuration>
        <complianceLevel>1.8</complianceLevel>
        <source>1.8</source>
        <target>1.8</target>
        <aspectLibraries>
            <aspectLibrary>
                <groupId>io.astefanutti.metrics.aspectj</groupId>
                <artifactId>metrics-aspectj</artifactId>
            </aspectLibrary>
        </aspectLibraries>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
            </goals>
        </execution>
    </executions>
</plugin>
これで、プロジェクトでJavaコードをインストルメント化する準備が整いました。

3. アノテーション計測

まず、メソッドを作成し、_ @ Timed_アノテーションを付けます。 また、_name_プロパティにタイマーの名前を入力します。
import com.codahale.metrics.annotation.Timed;
import io.astefanutti.metrics.aspectj.Metrics;

@Metrics(registry = "objectRunnerRegistryName")
public class ObjectRunner {

    @Timed(name = "timerName")
    public void run() throws InterruptedException {
        Thread.sleep(1000L);
    }
}
クラスレベルで* _ @ Metrics_アノテーションを使用して、このクラスに監視するメソッドがあることをMetrics AspectJフレームワークに知らせています。 *タイマーを作成するために、メソッドに_ @ Timed_を設定しています。
さらに、_ @ Metrics_は、提供されたレジストリ名(この場合は_objectRunnerRegistryName_)を使用してレジストリを作成し、メトリックを保存します。
サンプルコードは、操作をエミュレートするために1秒間だけスリープします。
それでは、アプリケーションを起動して_MetricsRegistry_を設定するクラスを定義しましょう。
public class ApplicationMain {
    static final MetricRegistry registry = new MetricRegistry();

    public static void main(String args[]) throws InterruptedException {
        startReport();

        ObjectRunner runner = new ObjectRunner();

        for (int i = 0; i < 5; i++) {
            runner.run();
        }

        Thread.sleep(3000L);
    }

    static void startReport() {
        SharedMetricRegistries.add("objectRunnerRegistryName", registry);

        ConsoleReporter reporter = ConsoleReporter.forRegistry(registry)
                .convertRatesTo(TimeUnit.SECONDS)
                .convertDurationsTo(TimeUnit.MILLISECONDS)
                .outputTo(new PrintStream(System.out))
                .build();
        reporter.start(3, TimeUnit.SECONDS);
    }
}
_ApplicationMain_の_startReport_メソッドで、_ @ Metrics_で使用されているのと同じレジストリ名を使用して、_SharedMetricRegistries_にレジストリインスタンスを設定します。
その後、単純な_ConsoleReporter_を作成して、_ @ Timed_アノテーション付きメソッドからメトリックをレポートします。 https://metrics.dropwizard.io/3.1.0/apidocs/com/codahale/metrics/Reporter.html [利用可能な他の種類のレポーター]があることに注意してください。
アプリケーションは、timedメソッドを5回呼び出します。 Mavenでコンパイルして実行します。
-- Timers ----------------------------------------------------------------------
ObjectRunner.timerName
             count = 5
         mean rate = 0.86 calls/second
     1-minute rate = 0.80 calls/second
     5-minute rate = 0.80 calls/second
    15-minute rate = 0.80 calls/second
               min = 1000.49 milliseconds
               max = 1003.00 milliseconds
              mean = 1001.03 milliseconds
            stddev = 1.10 milliseconds
            median = 1000.54 milliseconds
              75% <= 1001.81 milliseconds
              95% <= 1003.00 milliseconds
              98% <= 1003.00 milliseconds
              99% <= 1003.00 milliseconds
            99.9% <= 1003.00 milliseconds
ご覧のとおり、Metricsフレームワークは、インスツルメントするメソッドのコード変更がほとんどない場合の詳細な統計を提供します。
Mavenビルドなしで(たとえばIDEを介して)アプリケーションを実行すると、上記の出力が得られない可能性があることに注意してください。 *これが機能するには、AspectJコンパイルプラグインがビルドに含まれていることを確認する必要があります。*

4. 結論

このチュートリアルでは、* Metrics AspectJを使用して単純なJavaアプリケーションを計測する方法を調査しました*
Metrics AspectJアノテーションは、Spring、JEE、Dropwizardなどの大規模なアプリケーションフレームワークを必要とせずにコードをインスツルメントするための優れた方法であることがわかりました。 代わりに、アスペクトを使用することで、コンパイル時にインターセプターを追加できました。
いつものように、この例の完全なソースコードは、https://github.com/eugenp/tutorials/tree/master/metrics [GitHubで]から入手できます。