4

我想实现一个千分尺,来监控我数据库中的记录数量。所以我创建了一个方面,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


我究竟做错了什么?

或者有没有其他方法可以监控数据库表中的记录数量???

4

2 回答 2

3

实际上,问题在于 Gauge 度量的初始化不正确。你应该这样声明这个指标:

    测量
        .builder("contacts.amount", contactRepository, ContactRepository::count)
        .register(注册表);

这段代码对我有用!

于 2020-10-08T05:55:17.660 回答
1

我发现仪表生成器不起作用。
相反,我必须使用这个:

@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());
  }
}
于 2018-11-02T12:52:55.957 回答