カテゴリ: Micronaut 更新日: 2026/02/17

MicronautのAOPでメソッドの実行時間を計測する方法

MicronautのAOPでメソッドの実行時間を計測する方法
MicronautのAOPでメソッドの実行時間を計測する方法

先生と生徒の会話形式で理解しよう

生徒

「Micronautでメソッドがどれくらい時間がかかっているかを測りたいです。簡単にできますか?」

先生

「はい、MicronautのAOP機能を使うと、既存のコードをほとんど修正せずにメソッドの実行時間を計測できます。」

生徒

「AOPって、どういう仕組みで時間を測るんですか?」

先生

「AOPはメソッドの前後に処理を挿入できる仕組みです。ここでは、メソッド実行前に開始時刻を記録し、実行後に終了時刻を取得して差分を計算します。」

1. AOPでメソッド時間計測の基本

1. AOPでメソッド時間計測の基本
1. AOPでメソッド時間計測の基本

MicronautではAOPを使って、メソッドの前後に独自の処理を挟むことができます。実行時間の計測も同様に、メソッド実行の前後で時刻を取得して差分を出すだけなので非常に簡単です。これにより、ログに実行時間を出力したり、パフォーマンス分析が行えます。

2. 実際にアノテーションを作る

2. 実際にアノテーションを作る
2. 実際にアノテーションを作る

まず、実行時間計測用のアノテーションを作成します。簡単な設定だけでメソッドに付与できるようにします。


import io.micronaut.aop.Around;
import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Around
public @interface Timed {
}

3. インターセプタの作成

3. インターセプタの作成
3. インターセプタの作成

次に、@Timedアノテーションが付いたメソッドの前後に処理を挟むInterceptorを作ります。


import io.micronaut.aop.MethodInterceptor;
import io.micronaut.aop.MethodInvocationContext;
import jakarta.inject.Singleton;

@Singleton
public class TimedInterceptor implements MethodInterceptor<Object, Object> {

    @Override
    public Object intercept(MethodInvocationContext<Object, Object> context) {
        long start = System.currentTimeMillis();
        Object result = context.proceed();
        long end = System.currentTimeMillis();
        System.out.println(context.getMethodName() + "の実行時間: " + (end - start) + "ms");
        return result;
    }
}

4. サービスにアノテーションを付与

4. サービスにアノテーションを付与
4. サービスにアノテーションを付与

Interceptorが用意できたら、測定したいメソッドに@Timedを付与します。


import jakarta.inject.Singleton;

@Singleton
public class CalculationService {

    @Timed
    public int heavyComputation() throws InterruptedException {
        Thread.sleep(500);
        return 42;
    }
}

この設定により、heavyComputationメソッドが呼ばれるたびに、実行時間がログに出力されます。

5. 複数メソッドへの適用

5. 複数メソッドへの適用
5. 複数メソッドへの適用

同じInterceptorは他のメソッドにも適用可能です。@Timedを付けるだけで、共通処理として実行時間計測が行われるため、コードの重複を避けられます。


@Singleton
public class UserService {

    @Timed
    public void createUser() {
        // ユーザー作成処理
    }

    @Timed
    public void deleteUser() {
        // ユーザー削除処理
    }
}

6. ログ出力の応用

6. ログ出力の応用
6. ログ出力の応用

System.out.println以外にも、MicronautのLoggingフレームワークを使えば、ログレベルに応じた記録が可能です。これにより、開発環境や本番環境で適切なログ管理ができます。


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Singleton
public class TimedInterceptor implements MethodInterceptor<Object, Object> {
    private static final Logger LOG = LoggerFactory.getLogger(TimedInterceptor.class);

    @Override
    public Object intercept(MethodInvocationContext<Object, Object> context) {
        long start = System.currentTimeMillis();
        Object result = context.proceed();
        long end = System.currentTimeMillis();
        LOG.info("{}の実行時間: {}ms", context.getMethodName(), (end - start));
        return result;
    }
}

7. 実運用での注意点

7. 実運用での注意点
7. 実運用での注意点

メソッド実行時間を頻繁に計測すると、ログが大量になったりパフォーマンスに影響が出る場合があります。重要な処理やボトルネックになりやすい部分だけに限定するなど、運用上の工夫が必要です。

8. まとめ以外の活用例

8. まとめ以外の活用例
8. まとめ以外の活用例

このAOPによる計測方法は、メトリクス収集や監視ツールへの連携にも応用可能です。例えばPrometheusやGrafanaに送る前処理として利用することで、サービス全体のパフォーマンス分析に活かせます。

カテゴリの一覧へ
新着記事
New1
Quarkus
Quarkus拡張開発をマスター!ビルドプロセスの仕組みと内部構造を徹底解説
New2
Micronaut
Micronautの@Factoryとは?複雑なBean生成を管理するための方法を解説
New3
Quarkus
QuarkusのDIとCDIを完全理解!@Producesでプロデューサーメソッドを使う方法を初心者向けに解説
New4
Java
JavaのStringBufferクラスを徹底解説!スレッド安全な文字列操作の仕組みと使い分け
人気記事
No.1
Java&Spring記事人気No1
Quarkus
Quarkus入門!GitHub ActionsでCI/CDパイプラインを構築して自動ビルドを実現する方法
No.2
Java&Spring記事人気No2
Java
Javaのコンパイルと実行の流れを解説!JVM・JDK・JREの違いも初心者向けに整理
No.3
Java&Spring記事人気No3
Quarkus
QuarkusのCI/CD入門!GitHub Actionsで自動デプロイを実現する方法
No.4
Java&Spring記事人気No4
Micronaut
Micronautのルーティング設定ガイド!プレフィックス付与とAPIバージョニングの基本
No.5
Java&Spring記事人気No5
Micronaut
Micronautのフィルタ徹底解説!HTTPリクエスト共通処理をスマートに追加する方法
No.6
Java&Spring記事人気No6
Java
Java Functionインタフェースの使い方を完全ガイド!map変換と処理チェーンを理解する
No.7
Java&Spring記事人気No7
Java
JavaのString比較を徹底解説!equalsと==の違い、初心者が陥る罠とは?
No.8
Java&Spring記事人気No8
Quarkus
Quarkus拡張開発を徹底解説!仕組みから自作エクステンションの作り方まで