Prometheus云原生监控:运维与开发实战
上QQ阅读APP看书,第一时间看更新

3.2.4 以埋点的方式更新指标数据

注册完指标后就需要更新指标信息了。很多开发者会在Controller中通过模拟请求的方式进行业务埋点,而我们这里为了测试简单,使用了定时器。

首先在Spring Boot应用程序入口处增加@EnableScheduling注解,这个Spring Boot启动类还是比较简单的,如下所示。


package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
// 该注解用于引入定时功能,方便下面要介绍的业务模拟请求代码
// SimulationRequest.java进行@Scheduled操作
@EnableScheduling
public class DemoApplication {
  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args); // 程序主入口
  }
}

接着创建一个新类SimulationRequest.java,这个新类用于模拟代码请求。该类可以通过定时器设置一个任务,每秒执行一次@Scheduled(fixedDelay=1000)。定时器每执行一次,成员变量count1的值就加1,并将最新的count1值放入之前封装的监控组件DemoMetrics的Map对象中。如果你有多个业务需要监控,可以定义多个成员变量,并将它们对应的最新数据通过定义不同key的方式放入监控组件DemoMetrics的Map对象中。代码如下所示。


package com.example.demo.metrics;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class SimulationRequest {

  private Integer count1 = 0;

  @Autowired
  private DemoMetrics demoMetrics;

  @Async("One")
  @Scheduled(fixedDelay = 1000)
  public void increment1() {
    count1++;
    demoMetrics.counter.increment();
    demoMetrics.map.put("x", Double.valueOf(count1));
    // 将counte1的值放入Gauge中,反映应用的当前指标,比如主机当前空闲的内存大小
    // (node_memory_MemFree)
    System.out.println("increment1 count:" + count1);
  }
}