2015-06-15 2 views
3

Привод Spring-Boot предоставляет множество полезных показателей на уровне /metrics, таких как время работы, использование памяти, подсчет GC.Передача системных показателей на графит с пружинной загрузкой

Только подмножество из них отправляется на Graphite при использовании интеграции Dropwizard Metrics. В частности, только счетчики и датчики

Есть ли способ получить эти другие показатели для публикации в графит?

documentation предполагает, что это должно быть возможно:

Пользователи библиотеки Dropwizard «Метрики» обнаружат, что метрики Spring загрузки автоматически публикуются в com.codahale.metrics.MetricRegistry

+0

У меня была та же проблема, проверьте мой ответ на [Экспорт метрик метрики весны для загрузки (& Показатели Dropwizard) в Statsd] (http://stackoverflow.com/questions/32215723/exporting-spring-boot-actuator-metrics- dropwizard-metrics-to-statsd) вопрос [здесь] (http://stackoverflow.com/questions/32215723/exporting-spring-boot-actuator-metrics-dropwizard-metrics-to-statsd/35335845#35335845) .Don ' t хотите дублировать ответ. – mxsb

ответ

3

Системные метрики, созданные при загрузке Spring, не сообщаются автоматически, потому что MetricsRegistry ничего не знает об этих показателях.

Вы должны регистрировать эти показатели вручную, когда ваше приложение загружается.

@Autowired 
private SystemPublicMetrics systemPublicMetrics; 

private void registerSystemMetrics(MetricRegistry metricRegistry) { 
    systemPublicMetrics.metrics().forEach(m -> { 
     Gauge<Long> metricGauge =() -> m.getValue().longValue(); 
     metricRegistry.register(m.getName(), metricGauge); 
    }); 
} 

Я определил Gauge, не все системные показатели должны быть добавлены в качестве датчика. например Счетчик должен использоваться для захвата значений счета.

Если вы не хотите использовать весеннюю загрузку. Использование может включать в себя metrics-jvm, чтобы записывать метрики уровня JVM.

+2

Не будет ли это повторять одно и то же начальное значение? –

+0

Нет, '' 'systemPublicMetrics'' обновляются в фоновом режиме, репортер получит другое значение на основе интервала отчетности. Я не тестировал это. Вы можете проверить и подтвердить. –

+1

Довольно уверен, что это действительно записывает одно и то же значение снова и снова. 'systemPublicMetrics.metrics()' не возвращает список указателей на изменение значений, он возвращает моментальный снимок текущего состояния метрик, и поэтому лямбда только фиксирует начальное значение. Вы должны иметь лямбда-захват 'systemPublicMetrics'. –

2

Вот решение, которое обновляет метрики DropWizard при изменении метрик Spring. Он также делает это, не поворачивая @EnableScheduling на:

@EnableMetrics 
@Configuration 
public class ConsoleMetricsConfig extends MetricsConfigurerAdapter { 

    @Autowired 
    private SystemPublicMetrics systemPublicMetrics; 

    @Override 
    public void configureReporters(MetricRegistry metricRegistry) { 

     metricRegistry.register("jvm.memory", new MemoryUsageGaugeSet()); 
     metricRegistry.register("jvm.thread-states", new ThreadStatesGaugeSet()); 
     metricRegistry.register("jvm.garbage-collector", new GarbageCollectorMetricSet()); 

     metricRegistry.register("spring.boot", (MetricSet)() -> { 
      final Map<String, Metric> gauges = new HashMap<String, Metric>(); 

      for (final org.springframework.boot.actuate.metrics.Metric<?> springMetric : 
        systemPublicMetrics.metrics()) { 

       gauges.put(springMetric.getName(), (Gauge<Object>)() -> { 

        return systemPublicMetrics.metrics().stream() 
         .filter(m -> StringUtils.equals(m.getName(), springMetric.getName())) 
         .map(m -> m.getValue()) 
         .findFirst() 
         .orElse(null); 

       }); 
      } 
      return Collections.unmodifiableMap(gauges); 
     }); 

     registerReporter(ConsoleReporter 
      .forRegistry(metricRegistry) 
      .convertRatesTo(TimeUnit.SECONDS) 
      .convertDurationsTo(TimeUnit.MILLISECONDS) 
      .build()) 
      .start(intervalSecs, TimeUnit.SECONDS); 

    } 
} 

Он использует com.ryantenney.metrics библиотеки для включения поддержки дополнительных Spring аннотаций и репортеров DropWizard:

<dependency> 
     <groupId>com.ryantenney.metrics</groupId> 
     <artifactId>metrics-spring</artifactId> 
     <version>3.1.3</version> 
    </dependency> 

Но это на самом деле не нужно в данном конкретном случае.

Смежные вопросы