如何在GraphiteReporter中添加自定义MetricFilter以仅发送选定的度量标准

时间:2017-03-03 03:59:40

标签: java dropwizard codahale-metrics

我已在我的应用程序中实现了Dropwizard指标。我使用以下代码向Graphite发送指标。

final Graphite graphite = new Graphite(new InetSocketAddress("xxx.xxx.xxx.xxx", xxxx));
final GraphiteReporter graphiteReporter = GraphiteReporter.forRegistry(metricRegistry)
                .prefixedWith(getReporterRootTagName())
                .convertRatesTo(TimeUnit.SECONDS)
                .convertDurationsTo(TimeUnit.MILLISECONDS)
                .filter(MetricFilter.ALL)
                .build(graphite);

        graphiteReporter.start(Integer.parseInt(getTimePeriod()), timeUnit);

我想添加自定义MetricFilter,以便不会将所有指标发送到Graphite,只会发送少量特定指标。

例如。 max,mean,min,mean only。

请发布MetricFilter用法。

2 个答案:

答案 0 :(得分:2)

要实现这一目标,您可以实施指标过滤器:

class WhitelistMetricFilter implements MetricFilter {
    private final Set<String> whitelist;

    public WhitelistMetricFilter(Set<String> whitelist) {
        this.whitelist = whitelist;
    }

    @Override
    public boolean matches(String name, Metric metric) {
        for (String whitelisted: whitelist) {
            if (whitelisted.endsWith(name))
                return true;
        }
        return false;
    }
}

我建议使用String#endsWith函数检查名称,因为您获得的名称通常不是完整的度量标准名称(例如,它可能不包含您的前缀)。使用此过滤器,您可以实例化您的记者:

final MetricFilter whitelistFilter = new WhitelistMetricFilter(whitelist);
final GraphiteReporter reporter = GraphiteReporter
    .forRegistry(metricRegistry)
    .prefixedWith(getReporterRootTagName())
    .filter(whiltelistFilter)
    .build(graphite);

这应该可以解决问题。如果您需要对指标进行更精细的过滤 - 例如,如果您需要停用计时器自动报告的特定指标,那么3.2.0版本会对此进行介绍。您可以使用disabledMetricAttributes参数提供一组要禁用的属性。

final Set<MetricAttribute> disabled = new HashSet<MetricAttribute>();
disabled.add(MetricAttribute.MAX);

final GraphiteReporter reporter = GraphiteReporter
    .forRegistry(metricRegistry)
    .disabledMetricAttributes(disabled)
    .build(graphite)

我希望这会对你有所帮助。

答案 1 :(得分:0)

我认为可以使用disabledMetricAttributes解决您的问题。

在可接受的答案中,这样做会更好:

如果(name.endsWith(列入白名单))