스프링 부트 앱에 대한 측정 항목을 추가하고 싶습니다. 통계는 grafana를 통해 표시됩니다.Prometheus가 장착 된 스프링 액추에이터, Custom MetricWriter가 호출되지 않습니다
나는 prometheus를 가진 통합 봄 액추에이터를 위해 article를 발견했다.
샘플에 따르면, 나는 프로 메테우스 CollectorRegistry
에 해당하는 Counter
또는 Gauge
를 업데이트 내 사용자 지정 MetricWriter
를 구현해야 그것은 다음과 같습니다
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_]", "_")
}
}
다른 3 개 필요한 요소는 다음과 같습니다 PrometheusEndpoint
, PrometheusMvcEndpoint
, PrometheusEndpointContextConfiguration
.
결국 수집 된 측정 항목은 'http://localhost:8080/prometheus'URL을 호출하여 검토 할 수 있습니다.
그리고 그 결과는 다음과 같아야합니다
# 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
, 나는 빈 페이지를 를 수신하고 있습니다. 다음은 일부 메트릭 수집을위한 테스트 클래스입니다.
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 : 나는 GaugeService
여러 구현을 가지고 있으며, 내 응용 프로그램에서이 DropwizardMetricServices
인 것으로 나타났습니다. 이 구현에는 내 메트릭을 수집하는 자체 메트릭 레지스트리가 이미 포함되어 있습니다. 그래서 '/ prometheus'엔드 포인트를 호출 할 때 CollectorRegistry' in my custom
PrometheusMetricWriter는 결코 내 메트릭으로 채워지지 않으므로 빈 페이지가 나타납니다.
이 문제를 어떻게 해결할 수 있습니까?