Почему мой микрометр выполняется только один раз после запуска приложения?
Я хочу реализовать микрометр, чтобы контролировать количество записей в моей базе данных. поэтому я создал аспект с 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 ответ
Собственно проблема в некорректной инициализации метрики Gauge. Вы должны объявить эту метрику так:
Датчик.builder("contacts.amount", contactRepository, ContactRepository::count) .register(реестр);
Этот код работает для меня!
Я узнал, что датчик не работает.
вместо этого я должен использовать это:
@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());
}
}