我想使用DropWizard中的Guage指标来监控我的线程池大小。
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
2,
2,
1,
TimeUnit.MINUTES,
new ArrayBlockingQueue<Runnable>(100),
new ThreadPoolExecutor.DiscardPolicy());
metricRegistry.register(name(ThreadPoolExecutor.class, "ThreadPoolRemainingCapacity"), (Gauge<Integer>) () -> threadPoolExecutor.getQueue().remainingCapacity());
metricRegistry.register(name(ThreadPoolExecutor.class, "ThreadPoolOccupiedCapacity"), (Gauge<Integer>) () -> threadPoolExecutor.getQueue().size());
return threadPoolExecutor;
根据我的理解,这是在间隔时间内自动完成的。但似乎我没有为我的注册指标获取任何监控数据。虽然我的应用程序中的其他指标(如计数器和计时器)工作正常。
有人可以在我错误的地方帮助我吗?
谢谢。
答案 0 :(得分:2)
你应该注册一个实现MetricSet接口的类(这个有一些你可以忽略的spring注释):
@Component
public class ThreadPoolGaugeSet implements MetricSet {
@Autowired
@Qualifier( "taskExecutor")
private ThreadPoolTaskExecutor taskExecutor;
@Autowired
@Qualifier( "taskExecutorLowPrio")
private ThreadPoolTaskExecutor lowPriotaskExecutor;
@Override
public Map<String, Metric> getMetrics() {
final Map<String, Metric> gauges = new HashMap<>();
gauges.put( "highPrioActive", (Gauge<Long>) () -> (long) taskExecutor.getActiveCount() );
gauges.put( "lowPrioActive", (Gauge<Long>) () -> (long) lowPriotaskExecutor.getActiveCount() );
return gauges;
}
}
...
metricRegistry.register( "threadpool", poolGauge );
答案 1 :(得分:0)
您的代码应该已经正确。您可以执行以下操作来调试它:
<admin_url>/metrics
上(如果您在计算机上运行,则默认为localhost:8081/metrics
)。如果将指标(例如Prometheus或datadog)发送给第三方,通常会进行一些过滤。MetricRegistry
实例注册指标。通常只需使用environment.metrics()
。register
的第一个参数接受纯字符串。