2016-11-29 7 views
1

Ich möchte metrische Messung für meine Spring-Boot-App hinzufügen. Metriken würden über grafana angezeigt werden.Federantrieb mit Prometheus, benutzerdefinierte MetricWriter heißt nie

Ich habe schön article für Integration Federantrieb mit Prometheus gefunden.

Nach der Probe, sollte ich meine benutzerdefinierte implementieren MetricWriter für die Aktualisierung von entsprechenden Counter oder Gauge in der Prometheus CollectorRegistry Es sieht wie folgt aus:

class PrometheusMetricWriter implements MetricWriter { 

    CollectorRegistry registry 

    private final ConcurrentMap<String, Gauge> counters = new ConcurrentHashMap<>() 
    private final ConcurrentHashMap<String, Gauge> gauges = new ConcurrentHashMap<>() 

    @Autowired 
    PrometheusMetricWriter(CollectorRegistry registry) { 
     this.registry = registry 
    } 

    @Override 
    void increment(Delta<?> delta) { 
     counter(delta.name).inc(delta.value.doubleValue()) 
    } 

    @Override 
    void reset(String metricName) { 
     counter(metricName).clear() 
    } 

    @Override 
    void set(Metric<?> value) { 
     println "inside metric writer" 
     gauge(value.name).set(value.value.doubleValue()) 
    } 

    private Counter counter(String name) { 
     def key = sanitizeName(name) 
     counters.computeIfAbsent key, { k -> 
      Counter.build().name(k).help(k).register(registry) 
     } 
    } 

    private Gauge gauge(String name) { 
     def key = sanitizeName(name) 
     gauges.computeIfAbsent key, { k -> 
      Gauge.build().name(k).help(k).register(registry) 
     } 
    } 

    private String sanitizeName(String name) { 
     return name.replaceAll("[^a-zA-Z0-9_]", "_") 
    } 
} 

Die anderen 3 erforderlichen Elemente sind: PrometheusEndpoint, PrometheusMvcEndpoint, PrometheusEndpointContextConfiguration .

Schließlich konnten die gesammelten Metriken durch den Aufruf 'http://localhost:8080/prometheus' url überprüft werden.

Und das Ergebnis sollte wie folgt aussehen:

# HELP gauge_com_egalacoral_spark_stage_vto gauge_com_egalacoral_spark_stage_vto 
# TYPE gauge_com_egalacoral_spark_stage_vto gauge 
gauge_com_egalacoral_spark_stage_vto 4.0 
# HELP gauge_com_egalacoral_spark_test_vfl gauge_com_egalacoral_spark_test_vfl 
# TYPE gauge_com_egalacoral_spark_test_vfl gauge 
gauge_com_egalacoral_spark_test_vfl 16.0 

Aber ich erhalte eine leere Seite. Hier ist eine Testklasse zum Sammeln einiger Metriken.

class Runner { 

    @Autowired 
    GaugeService gaugeService 

    private static final Logger logger = LoggerFactory.getLogger(Runner.class) 

    private ZoneId zoneId = ZoneId.of('Europe/London') 

    private Integer delay = 10 

    @Scheduled(fixedDelay = 10000L) 
    void runOnTest() throws Exception { 

     def now = ZonedDateTime.now(zoneId) 
     println "collect metrics" 
     gaugeService.submit("test", 2.0) 

    } 
} 

P. S: Ich habe bemerkt, dass GaugeService mehrere Implementierung hat, und in meiner App ist dies DropwizardMetricServices. Diese Implementierung enthält bereits eine eigene Metrik-Registrierung, in der meine Messwerte erfasst werden. Wenn ich also den Endpunkt '/ prometheus' anrufe, erhalte ich eine leere Seite, da der CollectorRegistry' in my custom PrometheusMetricWriter niemals mit meinen Metriken gefüllt wird.

Bitte sagen Sie mir, wie ich dieses Problem lösen könnte?

Antwort

0

Also, ich fand den Grund, warum DropwizardMetricServices Implementierung von GaugeService verwendet.

Nach den Frühling docs:

50,10 Dropwizard Metrics

Ein Standard MetricRegistry Spring-Bean wird erstellt, wenn Sie eine Abhängigkeit zu den io.dropwizard.metrics erklären: metrics- Kern Bibliothek; Sie können auch Ihre eigene @Bean-Instanz registrieren, wenn Sie Anpassungen benötigen. Benutzer der Dropwizard "Metrics" -Bibliothek werden feststellen, dass die Spring Boot-Messwerte automatisch in com.codahale.metrics.MetricRegistry veröffentlicht werden. Metrics aus dem MetricRegistry werden auch über den/Metriken Endpunkt

Wenn Dropwizard Metriken sind im Einsatz, die Standard-Counterservice und GaugeService automatisch ausgesetzt sind, mit einem DropwizardMetricServices ersetzt, die ein Wrapper um die MetricRegistry ist (so können Sie @Autowired einer dieser Dienste und verwenden Sie es als normal). Sie können auch "spezielle" Dropwizard-Metriken erstellen, indem Sie Ihren Metriknamen den entsprechenden Typ voranstellen (d. H. Zeitgeber. , Histogramm. für Messgeräte und Meter. * Für Zähler).

Irgendwie io.dropwizard.metrics: Metriken-Core Bibliothek wurde auf die Projektabhängigkeiten enthalten. Nachdem, ich es entfernen, beginnen alle wie erwartet zu arbeiten.