Почему мой микрометр выполняется только один раз после запуска приложения? - PullRequest
0 голосов
/ 02 ноября 2018

Я хочу реализовать микрометрический датчик, чтобы отслеживать количество записей в моей базе данных. поэтому я создал аспект с spring-boot-starter-aop, который выполняется после вызова моих методов обслуживания.

Формат:

@Slf4j
@Aspect
@Configuration
public class ContactAmountAspect {

  @Autowired
  ContactRepository contactRepository;

  @Autowired
  MeterRegistry registry;

  @AfterReturning(value = "execution(* mypackage.ContactService.*(..))")
  public void monitorContactAmount() {
    Gauge
        .builder("contacts.amount", contactRepository.findAll(), List::size)
        .register(registry);
    log.info("Amount of contacts in database: {}", contactRepository.findAll().size());
  }
}

На конечной точке /prometheus я вижу только количество контактов при первом вызове после запуска приложения. Если я сейчас позвоню своей конечной точке отдыха POST и добавлю контакт в свою базу данных, только мой log.info напечатает новое количество контактов, но мой датчик ничего не сделает.
Заказ:

1. App Startup (let's say with 1 contact in DB)
2. Call Rest Endpoint "getAllContacts"
3. My AOP method starts
4. The gauge monitors contact amount of 1
5. the logger logs contact amount of 1
6. Call Rest Endpoint "postOneContact"
7. My AOP method starts
8. The gauge does nothing or monitors still the amount of 1
9. the logger logs contact amount of 2


Что я делаю не так?

Или есть другой способ отслеживать количество записей в таблице базы данных ???

1 Ответ

0 голосов
/ 02 ноября 2018

Я обнаружил, что датчик не работает.
вместо этого я должен использовать это:

@Slf4j
@Aspect
@Configuration
public class AspectConfig {

  @Autowired
  ContactRepository contactRepository;

  AtomicInteger amount = new AtomicInteger(0);

  @AfterReturning("execution(* mypackage.ContactService.*(..))")
  public void monitorContactAmount() {
    Metrics.gauge("database.contacts.amount", amount);
    amount.set(contactRepository.findAll().size());
    log.info("Monitoring amount of contacts in database: {}", contactRepository.findAll().size());
  }
}
...