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?