0

Вместо того, чтобы измерять путем ввода кода в каждый интересующий нас метод, я хотел использовать предоставленную @Timed аннотацию. Но показатели не показывают соответствующие значения:Использование аннотации dropwizards с пружинной загрузкой

Metrics

Это мой код, идея имея времени выполнения содержащегося SQL претворяются в метриках.

@Component 
public class Foo { 
    private JdbcTemplate jdbcTemplate; 

    @Autowired 
    public Metadata(JdbcTemplate jdbcTemplate) { 
     this.jdbcTemplate = jdbcTemplate; 
    } 

    @Timed(name = "myapp.get.foo") 
    public boolean getFoo(final String foo) { 
     String foo = jdbcTemplate.query(... 
    } 
} 

Проблема с @Timed не появляется, вероятно, потому, что Spring Boot only supports Counter and Gauge.

Но @Gauge, @Metered и @Counted тоже не работают.

Что мне не хватает, чтобы выполнить хотя бы те работы аннотаций, которые поддерживаются Spring Boot? (1.3.1 в моих тестах)

ответ

2

Вы, вероятно, хотите взглянуть на http://www.ryantenney.com/metrics-spring/

Этот проект упрощает интеграцию dropwizard метрик в проекты Spring загрузочными. Он автоматически создаст метрики и бранды прокси, чтобы сделать аннотацию @Timed.

1

Я закончил тем, что не использовал аннотации и просто использовал MetricSet для фасоли, которые я хочу использовать. Особенно с таймерами, используя один, это не так сложно.

@Service 
public class MyBean implements MetricSet { 
    Timer putTimer = new Timer(); 

    public void someService() { 
     try(Context context = putTimer.time()) { 
      .... 
     } 
    } 

    @Override 
    public Map<String, Metric> getMetrics() { 
     Map<String,Metric> metrics=new HashMap<>(); 
     metrics.put("mymetricname",putTimer); 
     return metrics; 
    } 
} 

@Slf4j 
@Service 
public class MetricsContextListener implements ApplicationListener<ContextRefreshedEvent> { 

    private final MetricRegistry metricRegistry; 

    public MetricsContextListener(MetricRegistry metricRegistry) { 
     this.metricRegistry = metricRegistry; 
    } 

    @Override 
    public void onApplicationEvent(ContextRefreshedEvent event) { 
     Map<String, MetricSet> beans = event.getApplicationContext().getBeansOfType(MetricSet.class); 
     for(Map.Entry<String, MetricSet> e: beans.entrySet()) { 
      log.info("registering " + e.getKey() + " " + e.getValue().getClass().getName()); 
      metricRegistry.register(e.getKey(), e.getValue()); 
     } 
    } 
} 

Также вы, вероятно, захотите создать свой собственный MetricRegistry. У нас были некоторые проблемы с созданием весеннего ботинка, но наши весенние тесты потерпели неудачу, потому что они отсутствовали. Если вы сами создадите, эта проблема исчезнет. Просто добавьте это к одному из ваших @Configuration классов

@Bean 
public MetricRegistry metricRegistry() { 
    // explicitly register a metricRegistry so we can run our spring tests without relying on spring boot creating 
    // one for us. Spring boot seems to do the right thing either way. 
    // Used to register codahale metrics from MetricSet implementing beans. 
    return new MetricRegistry(); 
} 

При всем этом на месте, весна ботинок делает правильно, и добавляет метрики в/метрик.