Logging 弹簧批和防尘套千分尺

Logging 弹簧批和防尘套千分尺,logging,spring-batch,micrometer,Logging,Spring Batch,Micrometer,我有一个Spring批处理作业,它从DB读取记录,处理记录,然后写入另一个数据库。我想测量Spring批处理程序和Writer所花费的总时间/平均时间。根据文档-使用spring.batch prefix可以随时获取度量。如何将处理器和写入程序所用的时间记录到控制台。当我在作业侦听器结束时从Metrics registry打印度量结果时,我看到作业和步骤状态为Completed,但Timer stats度量显示为0。是否需要执行任何操作来启用计时器?我不打算将这些指标推送到普罗米修斯、阿特拉斯或

我有一个Spring批处理作业,它从DB读取记录,处理记录,然后写入另一个数据库。我想测量Spring批处理程序和Writer所花费的总时间/平均时间。根据文档-使用spring.batch prefix可以随时获取度量。如何将处理器和写入程序所用的时间记录到控制台。当我在作业侦听器结束时从Metrics registry打印度量结果时,我看到作业和步骤状态为Completed,但Timer stats度量显示为0。是否需要执行任何操作来启用计时器?我不打算将这些指标推送到普罗米修斯、阿特拉斯或任何其他登记处。因此,pom.xml中只添加了测微计核心依赖项。请建议如何记录不同组件所用的时间指标。任何例子都会非常有用

我看到作业和步骤状态为已完成,但计时器统计指标显示为0

这样做的原因是,默认情况下,以微米为单位的全局注册表是一个空的组合。您需要至少添加一个注册表以保留度量。看

我不打算将这些指标推送到普罗米修斯、阿特拉斯或任何其他登记处

如果希望使用度量而不将其推送到度量后端,则可以使用侦听器并直接从全局注册表获得访问权限。以下是一个快速示例,用于根据您的要求确定项目处理时间:

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