上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); } }