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());
}
}
我在这里注册了几个仪表,希望每个请求都能更新一次,或者。。。 方法度量是找到正确的方法来监视和更新值的最后一次尝试
因此,问题是:
- 仪表是否自动更新?如果是-多久一次李>
- 如果仪表没有自动更新,那么如何更新 正确吗李>
- 对于此类测量,量规是否正确?阿飞,我不能用 计数器,因为某些值可以递减李>
- 我需要做度量吗。addRegistry(meterRegistry)毕竟 是否创建了仪表李>
# 1 楼答案
问题是
Gauge.builder()
方法返回仪表本身,而传递给@Override public void bindTo(MeterRegistry meterRegistry)
的MeterRegistry meterRegistry
对象具有方法meterRegistry.gauge()
可以返回对对象值的引用:然后可以在计划方法中修改
完整的代码如下所示:
希望这是更新仪表值的正确方法
# 2 楼答案
尝试使用
.strongReference(true)
例如: