如何在 GraphiteReporter 中添加自定义指标过滤器以仅发送选定的指标

How to add custom MetricFilter in GraphiteReporter to send only selected metricd

我已经在我的应用程序中实施了 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,而只会发送少数特定指标。

例如。仅最大值、平均值、最小值、平均值。

请post使用MetricFilter。

为此,您可以实施指标过滤器:

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)

希望对您有所帮助。

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

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

if (name.endsWith(已列入白名单))