我正在尝试为千分尺建立一个自定义量规,该量规应监视自定义ThreadPoolTaskExecutor。问题是仪表值保持不变,并且自应用程序启动以来就从未更新过。但是,执行程序统计信息(在调试器中可以看到)显示更改的值。
这是我的仪表配置的班级。
@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());
}
}
我正在这里注册多个量规,并希望每个请求更新一次或...该方法是最后一次尝试找到监视和更新值的正确方法。
所以问题是:
事实是Gauge.builder()
方法返回量规本身,而传递给MeterRegistry meterRegistry
的public void bindTo(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());
}
希望这是更新量规值的正确方法。