使用dropWizard指标

时间:2016-10-27 08:53:35

标签: java dropwizard gauge

我想使用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;

根据我的理解,这是在间隔时间内自动完成的。但似乎我没有为我的注册指标获取任何监控数据。虽然我的应用程序中的其他指标(如计数器和计时器)工作正常。

有人可以在我错误的地方帮助我吗?

谢谢。

2 个答案:

答案 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的第一个参数接受纯字符串。