2016-11-29 9 views
1

스프링 부트 앱에 대한 측정 항목을 추가하고 싶습니다. 통계는 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는 결코 내 메트릭으로 채워지지 않으므로 빈 페이지가 나타납니다.

이 문제를 어떻게 해결할 수 있습니까?

답변

0

따라서 의 DropwizardMetricServices 구현을 사용하는 이유를 발견했습니다. 봄 문서에 따르면

:

50.10 Dropwizard 메트릭

당신이 io.dropwizard.metrics에 대한 의존성을 선언 할 때 기본 MetricRegistry의 봄 콩이 생성됩니다 metrics- 코어 라이브러리; 사용자 정의가 필요한 경우 @Bean 인스턴스를 등록 할 수도 있습니다. Dropwizard 'Metrics'라이브러리의 사용자는 Spring Boot 메트릭이 자동으로 com.codahale.metrics.MetricRegistry에 게시 된 이라는 것을 알 수 있습니다. MetricRegistry에서 통계는 자동/메트릭 MetricRegistry (그래서 당신이 할 수있는 주위 래퍼입니다 Dropwizard 메트릭이 사용중인 경우

가 기본 CounterService 및 GaugeService가 DropwizardMetricServices로 대체됩니다 엔드 포인트를 통해 노출 @Autowired 서비스 중 하나 인 ) 정상적으로 사용하십시오. 메트릭 이름 앞에 적절한 유형 (예 : 타이머. , 히스토그램)을 붙이면 "특별" Dropwizard 메트릭을 만들 수 있습니다.게이지는, 카운터는 미터. *).

어떻게 든 io.dropwizard.metrics : 측정 코어는 라이브러리 프로젝트 종속성에 포함되었다. 제거한 후에 모두 예상대로 작동하기 시작합니다.