有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java测微计从未更新

我正在尝试为千分尺构建一个自定义量规,它应该监控自定义螺纹池任务执行器。问题是,仪表值保持不变,并且自应用程序启动后从未更新。但是,executer统计信息(可以在调试器中看到)显示不断变化的值

这是我的仪表配置课

@Component
public class ThreadPoolMetricProbe implements MeterBinder {

@Inject
private Executor taskExecutor;

@Override
public void bindTo(MeterRegistry meterRegistry) {
    ThreadPoolTaskExecutor exec = (ThreadPoolTaskExecutor) taskExecutor;

    long completedTaskCount = exec.getThreadPoolExecutor().getCompletedTaskCount();
    int largestPoolSize = exec.getThreadPoolExecutor().getLargestPoolSize();
    int maximumPoolSize = exec.getThreadPoolExecutor().getMaximumPoolSize();
    int poolSize = exec.getThreadPoolExecutor().getPoolSize();
    long taskCount = exec.getThreadPoolExecutor().getTaskCount();
    int activeCount = exec.getThreadPoolExecutor().getActiveCount();

    String threadNamePrefix = exec.getThreadNamePrefix();

    Gauge.builder("executorCompletedTaskCount", completedTaskCount, Double::new)
            .description(String.format("Returns the approximate total number of tasks that have completed execution of %s executor", threadNamePrefix.toLowerCase()))
            .register(meterRegistry);

    Gauge.builder("executorLargestThreadsNumber", largestPoolSize, Double::new)
            .description(String.format(" Returns the largest number of threads that have ever simultaneously been in the pool of %s executor", threadNamePrefix.toLowerCase()))
            .register(meterRegistry);

    Gauge.builder("executorMaximumAllowedThreadsNumber", maximumPoolSize, Double::new)
            .description(String.format("Returns the maximum allowed number of threads of %s executor", threadNamePrefix.toLowerCase()))
            .register(meterRegistry);

    Gauge.builder("executorCurrentNumberOfThreads", poolSize, Double::new)
            .description(String.format("Returns the current number of threads in the %s executor pool", threadNamePrefix.toLowerCase()))
            .register(meterRegistry);

    Gauge.builder("executorTotalTaskCount", taskCount, Double::new)
            .description(String.format(" Returns the approximate total number of tasks that have ever been scheduled for execution by %s executor", threadNamePrefix.toLowerCase()))
            .register(meterRegistry);

    Gauge.builder("executorActiveThreadsCount", activeCount, Double::new)
            .description(String.format("Returns the approximate number of threads that are actively executing tasks by %s executor", threadNamePrefix.toLowerCase()))
            .register(meterRegistry);


    Metrics.addRegistry(meterRegistry);

}

@Scheduled(fixedDelay = 5000)
public void measure(){
    Metrics.gauge("executorCompletedTaskCount",((ThreadPoolTaskExecutor) taskExecutor).getThreadPoolExecutor().getCompletedTaskCount());
    Metrics.gauge("executorTotalTaskCount",((ThreadPoolTaskExecutor) taskExecutor).getThreadPoolExecutor().getTaskCount());
    Metrics.gauge("executorCurrentNumberOfThreads",((ThreadPoolTaskExecutor) taskExecutor).getThreadPoolExecutor().getPoolSize());
   }
}

我在这里注册了几个仪表,希望每个请求都能更新一次,或者。。。 方法度量是找到正确的方法来监视和更新值的最后一次尝试

因此,问题是:

  1. 仪表是否自动更新?如果是-多久一次
  2. 如果仪表没有自动更新,那么如何更新 正确吗
  3. 对于此类测量,量规是否正确?阿飞,我不能用 计数器,因为某些值可以递减
  4. 我需要做度量吗。addRegistry(meterRegistry)毕竟 是否创建了仪表

共 (2) 个答案

  1. # 1 楼答案

    问题是Gauge.builder()方法返回仪表本身,而传递给 @Override public void bindTo(MeterRegistry meterRegistry)MeterRegistry meterRegistry对象具有方法meterRegistry.gauge() 可以返回对对象值的引用:

    AtomicDouble executorCompletedTaskCount = meterRegistry.gauge("executor.completed.task.count", new AtomicDouble(completedTaskCount));
    

    然后可以在计划方法中修改

    完整的代码如下所示:

    @Component
    public class ThreadPoolMetricProbe implements MeterBinder {
    
    @Inject
    private Executor taskExecutor;
    
    private AtomicDouble executorCompletedTaskCount;
    private AtomicDouble executorMaximumPoolSize;
    private AtomicDouble executorLargestThreadsNumberEver;
    private AtomicDouble executorCurrentNumberOfThreads;
    private AtomicDouble executorTotalTaskCount;
    private AtomicDouble executorActiveThreadsCount;
    
    @Override
    public void bindTo(MeterRegistry meterRegistry) {
        ThreadPoolTaskExecutor exec = (ThreadPoolTaskExecutor) taskExecutor;
        long completedTaskCount = exec.getThreadPoolExecutor().getCompletedTaskCount();
        int largestPoolSizeEver = exec.getThreadPoolExecutor().getLargestPoolSize();
        int maximumPoolSize = exec.getThreadPoolExecutor().getMaximumPoolSize();
        int currentNumberOfThreads = exec.getThreadPoolExecutor().getPoolSize();
        long totalTaskCountEver = exec.getThreadPoolExecutor().getTaskCount();
        int activeThreadsCount = exec.getThreadPoolExecutor().getActiveCount();
    
        executorCompletedTaskCount = meterRegistry.gauge("executor.completed.task.count", new AtomicDouble(completedTaskCount));
        executorMaximumPoolSize = meterRegistry.gauge("executor.maximum.pool.size", new AtomicDouble(maximumPoolSize));
        executorLargestThreadsNumberEver = meterRegistry.gauge("executor.largest.threads.number.ever", new AtomicDouble(largestPoolSizeEver));
        executorCurrentNumberOfThreads = meterRegistry.gauge("executor.current.number.of.threads", new AtomicDouble(currentNumberOfThreads));
        executorTotalTaskCount = meterRegistry.gauge("executor.total.tasks.ever.countunt", new AtomicDouble(totalTaskCountEver));
        executorActiveThreadsCount = meterRegistry.gauge("executor.active.threads.count", new AtomicDouble(activeThreadsCount));
    
    }
    
    @Scheduled(fixedDelay = 5000)
    public void measure(){
        ThreadPoolExecutor threadPoolExecutor = ((ThreadPoolTaskExecutor) taskExecutor).getThreadPoolExecutor();
        executorCompletedTaskCount.set(threadPoolExecutor.getCompletedTaskCount());
        executorMaximumPoolSize.set(threadPoolExecutor.getMaximumPoolSize());
        executorLargestThreadsNumberEver.set(threadPoolExecutor.getLargestPoolSize());
        executorCurrentNumberOfThreads.set(threadPoolExecutor.getPoolSize());
        executorTotalTaskCount.set(threadPoolExecutor.getTaskCount());
        executorActiveThreadsCount.set(threadPoolExecutor.getActiveCount());
    }
    

    希望这是更新仪表值的正确方法

  2. # 2 楼答案

    尝试使用.strongReference(true)

    例如:

    Gauge.builder("executorTotalTaskCount", taskCount, Double::new)
        .strongReference(true)
        .description(String.format(" Returns the approximate total number of tasks that have ever been scheduled for execution by %s executor", threadNamePrefix.toLowerCase()))
        .register(meterRegistry);