2017-03-03 1 views
0

Ich habe Dropwizard Metriken in meiner Anwendung implementiert. Ich sende Metriken an Graphite mit dem folgenden Code.Wie man benutzerdefinierte MetricFilter in GraphiteReporter hinzufügt, um nur ausgewählte metricd zu senden

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); 

Ich möchte benutzerdefinierte MetricFilter hinzufügen, so dass stattdessen alle Metriken des Sendens nur wenige spezifische Metriken Graphit gesendet werden.

z. max, mean, min, mean nur.

Bitte verwenden Sie MetricFilter.

Antwort

1

Um dies zu erreichen Sie ein metrisches Filter implementieren könnten:

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; 
    } 
} 

Ich schlage vor, die Namen mit String#endsWith Funktion als Name Überprüfung Sie bekommen es in der Regel nicht die vollen Metriknamen (zum Beispiel ist es enthält: Nein Präfix). Mit diesem Filter können Sie Ihren Reporter instanziieren:

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

Dies sollte den Trick tun. Wenn Sie eine detailliertere Filterung der Metriken benötigen - zum Beispiel, wenn Sie bestimmte, von Timern automatisch gemeldete Metriken deaktivieren müssen, dann hat 3.2.0 die Version eingeführt. Sie können das Argument disabledMetricAttributes verwenden, um eine Reihe von Attributen bereitzustellen, die Sie inaktivieren möchten.

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

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

Ich hoffe, das hilft Ihnen.

+0

Danke, ich glaube, ich habe meine Frage nicht korrekt gepostet. Eigentlich möchte ich die Timer-Metriken filtern ** bedeuten Zählrate 1-Minute-Rate 5-Minuten-Rate 15-Minuten-Rate min max bedeuten stddev Median 75% 95% 98% 99 % 99,9% ** Ich möchte eine Möglichkeit, nur ausgewählte zu Graphite zu senden. –

+0

Hmm, also willst du all diese aus/in filtern? Die von Ihnen aufgelisteten werden von Zeitgebern/Zählern gemeldet. Wenn Sie all diese herausfiltern wollen, sollte es einfach sein. Wenn Sie nur einen Teil von ihnen haben wollen, gibt es einen fiesen Workaround, aber es sollte funktionieren - also welcher ist es? –

+0

Ja du hast Recht, ich will nur ** zählen, bedeuten, min, max ** und außerdem ist es möglich, X Minuten Dauer in Timer-Metriken abgesehen von Standard 1,5,15 mins zu haben? –

Verwandte Themen