SpringBatchとブートマイクロメータ

DBからレコードを読み取り、処理して、別のデータベースに書き込むSpringバッチジョブがあります。SpringバッチプロセッサとWriterでかかった合計時間/平均時間を測定したいと思います。ドキュメントによると-https://docs.spring.io/spring-batch/docs/current/reference/html/monitoring-and-metrics.htmlメトリックは、spring.batchプレフィックスを使用してすぐに利用できます。プロセッサとライターでかかった時間をコンソールに記録するにはどうすればよいですか。ジョブリスナーの最後にメトリクスレジストリからメトリクスの結果を印刷すると、ジョブとステップのステータスが完了として表示されますが、タイマー統計メトリクスは0と表示されます。タイマーを有効にするために必要なことはありますか?メトリックをプロメテウス、アトラス、またはその他のレジストリにプッシュするつもりはありません。したがって、マイクロメータのコア依存関係のみがpom.xmlに追加されます。さまざまなコンポーネントの所要時間メトリックをログに記録する方法をアドバイスしてください。どんな例でも本当に役に立ちます。

マフムードベンハッシン

ジョブとステップのステータスが「完了」と表示されますが、タイマー統計メトリックが0と表示されています。

その理由は、デフォルトでは、マイクロメータのグローバルレジストリが空のコンポジットであるためです。メトリックを保持するには、少なくとも1つのレジストリを追加する必要があります。MicroMeterタイマーがゼロを返す理由を参照してください

メトリックをプロメテウス、アトラス、またはその他のレジストリにプッシュするつもりはありません。

メトリックをメトリックバックエンドにプッシュせずに消費したい場合は、リスナーを使用してグローバルレジストリから直接アクセスできます。リクエストしたアイテム処理タイミングの簡単な例を次に示します。

import java.util.Arrays;
import java.util.List;

import io.micrometer.core.instrument.Measurement;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.Metrics;
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;

import org.springframework.batch.core.ItemProcessListener;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class MyJob {

    @Bean
    public ItemReader<Integer> itemReader() {
        return new ListItemReader<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
    }

    @Bean
    public ItemProcessor<Integer, Integer> itemProcessor() {
        return item -> {
            System.out.println("processing item " + item);
            Thread.sleep(2000);
            return item + 1;
        };
    }

    @Bean
    public ItemWriter<Integer> itemWriter() {
        return items -> {
            for (Integer item : items) {
                System.out.println("writing item = " + item);
            }
        };
    }

    @Bean
    public Job job(JobBuilderFactory jobs, StepBuilderFactory steps) {
        return jobs.get("job")
                .start(steps.get("step")
                        .<Integer, Integer>chunk(5)
                        .reader(itemReader())
                        .processor(itemProcessor())
                        .writer(itemWriter())
                        .listener(new MonitoringItemProcessListener())
                        .build())
                .build();
    }
    
    static class MonitoringItemProcessListener implements ItemProcessListener<Integer, Integer> {

        @Override
        public void beforeProcess(Integer item) {
            
        }

        @Override
        public void afterProcess(Integer item, Integer result) {
            List<Meter> meters = Metrics.globalRegistry.getMeters();
            for (Meter meter : meters) {
                if (meter.getId().getName().equals("spring.batch.item.process")) {
                    System.out.println("meter description = " + meter.getId().getDescription());
                    Iterable<Measurement> measurements = meter.measure();
                    for (Measurement measurement : measurements) {
                        System.out.println("measurement: statistic = " + measurement.getStatistic() + " | value = " + measurement.getValue());
                    }
                }
            }
        }

        @Override
        public void onProcessError(Integer item, Exception e) {

        }
    }

    public static void main(String[] args) throws Exception {
        Metrics.addRegistry(new SimpleMeterRegistry());
        ApplicationContext context = new AnnotationConfigApplicationContext(MyJob.class);
        JobLauncher jobLauncher = context.getBean(JobLauncher.class);
        Job job = context.getBean(Job.class);
        jobLauncher.run(job, new JobParameters());
    }

}

このサンプルは次のように出力します。

processing item 1
meter description = Item processing duration
measurement: statistic = COUNT | value = 1.0
measurement: statistic = TOTAL_TIME | value = 2.00080715
measurement: statistic = MAX | value = 2.00080715
processing item 2
meter description = Item processing duration
measurement: statistic = COUNT | value = 2.0
measurement: statistic = TOTAL_TIME | value = 4.003516877
measurement: statistic = MAX | value = 2.002709727
processing item 3
meter description = Item processing duration
measurement: statistic = COUNT | value = 3.0
measurement: statistic = TOTAL_TIME | value = 6.005287923
measurement: statistic = MAX | value = 2.002709727

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

レートとしてのマイクロメータとプロメテウスタイマー

分類Dev

DropWizardメトリックメーターとタイマー

分類Dev

スプリングブーツとマイクロメーターのパーセンタイル

分類Dev

シャイニーアプリでRマークダウンにパラメーターとしてテーブルとプロットを渡す方法は?

分類Dev

ブーストタイマーバインドをクラスメソッドに「リロード」する

分類Dev

データマッパーメディエーターとペイロードファクトリーメディエーターの違い

分類Dev

クロスリブート単調systemdタイマー

分類Dev

マイクロメータTimer.start /停止とTimer.record差

分類Dev

私はマイクロメーターで春ブートで使用するメトリックのホワイトリストを指定する方法

分類Dev

マイクロメータ@Timed注釈

分類Dev

SpringBatchメタデータスキーマシーケンス

分類Dev

スプリングブートプロメテウス、マイクロメーターがデータを公開できない

分類Dev

CKEditorでブロック/インラインの「メタマークアップ」

分類Dev

ベアメタルマイクロコントローラーのタイマーとして<chrono>を使用していますか?

分類Dev

ポインタのベクトルと値のベクトル大メモリブロックと小メモリブロックのパフォーマンスの低下

分類Dev

ポインタのベクトルと値のベクトル大メモリブロックと小メモリブロックのパフォーマンスの低下

分類Dev

スプリングブートのグラファイトマイクロメーターイベントにプレフィックスを追加

分類Dev

WPF-パラメーターとしてコントロールを備えたCaliburnマイクロイベントトリガー

分類Dev

マイクロサービスで API ゲートウェイとメッセージ ブローカーの両方を使用する

分類Dev

オブジェクトとタイマーの移動

分類Dev

マイクロサービスと直接通信するのではなく、メッセージブローカーと通信するAPIゲートウェイを備えたマイクロサービスアーキテクチャ

分類Dev

イベントキューとマイクロタスクキュー

分類Dev

パラメータ化された警告サイレンシングマクロのトラブル

分類Dev

PayPalサブスクリプションとスマートペイメントボタン-説明/メタデータの追加

分類Dev

PayPalサブスクリプションとスマートペイメントボタン-説明/メタデータの追加

分類Dev

ジャージーとマイクロメーターを使用したPrometheusエンドポイントのテンプレート化されたURL

分類Dev

マイクロメーターのPrometheusMeterRegistryを使用しているときに、Prometheusエンドポイントにメトリックが表示されない

分類Dev

LEDドライバーとインターフェースするマイクロコントローラー

分類Dev

LispSBCLマクロ引用リストをパラメーターとして

Related 関連記事

  1. 1

    レートとしてのマイクロメータとプロメテウスタイマー

  2. 2

    DropWizardメトリックメーターとタイマー

  3. 3

    スプリングブーツとマイクロメーターのパーセンタイル

  4. 4

    シャイニーアプリでRマークダウンにパラメーターとしてテーブルとプロットを渡す方法は?

  5. 5

    ブーストタイマーバインドをクラスメソッドに「リロード」する

  6. 6

    データマッパーメディエーターとペイロードファクトリーメディエーターの違い

  7. 7

    クロスリブート単調systemdタイマー

  8. 8

    マイクロメータTimer.start /停止とTimer.record差

  9. 9

    私はマイクロメーターで春ブートで使用するメトリックのホワイトリストを指定する方法

  10. 10

    マイクロメータ@Timed注釈

  11. 11

    SpringBatchメタデータスキーマシーケンス

  12. 12

    スプリングブートプロメテウス、マイクロメーターがデータを公開できない

  13. 13

    CKEditorでブロック/インラインの「メタマークアップ」

  14. 14

    ベアメタルマイクロコントローラーのタイマーとして<chrono>を使用していますか?

  15. 15

    ポインタのベクトルと値のベクトル大メモリブロックと小メモリブロックのパフォーマンスの低下

  16. 16

    ポインタのベクトルと値のベクトル大メモリブロックと小メモリブロックのパフォーマンスの低下

  17. 17

    スプリングブートのグラファイトマイクロメーターイベントにプレフィックスを追加

  18. 18

    WPF-パラメーターとしてコントロールを備えたCaliburnマイクロイベントトリガー

  19. 19

    マイクロサービスで API ゲートウェイとメッセージ ブローカーの両方を使用する

  20. 20

    オブジェクトとタイマーの移動

  21. 21

    マイクロサービスと直接通信するのではなく、メッセージブローカーと通信するAPIゲートウェイを備えたマイクロサービスアーキテクチャ

  22. 22

    イベントキューとマイクロタスクキュー

  23. 23

    パラメータ化された警告サイレンシングマクロのトラブル

  24. 24

    PayPalサブスクリプションとスマートペイメントボタン-説明/メタデータの追加

  25. 25

    PayPalサブスクリプションとスマートペイメントボタン-説明/メタデータの追加

  26. 26

    ジャージーとマイクロメーターを使用したPrometheusエンドポイントのテンプレート化されたURL

  27. 27

    マイクロメーターのPrometheusMeterRegistryを使用しているときに、Prometheusエンドポイントにメトリックが表示されない

  28. 28

    LEDドライバーとインターフェースするマイクロコントローラー

  29. 29

    LispSBCLマクロ引用リストをパラメーターとして

ホットタグ

アーカイブ