1.加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.5.1</version>
</dependency>
2.暴露端点
management:
endpoints:
web:
exposure:
include: '*'
3.应用
- 计量:Counter
- 计时:Timer.Sample
- 统计Tomcat、undertow线程池
- 统计数据库连接池
4.Demo
package com.xxx.msg.controller;
import com.xxx.freamwork.core.BaseResponse;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import jodd.util.ThreadUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Slf4j
@RestController
public class MicrometerController {
@Autowired
private MeterRegistry meterRegistry;
@PostMapping("micrometerSaveData")
public BaseResponse saveData(@RequestBody Map<String, Object> param){
//registry 此处默认为PrometheusMeterRegistry
meterRegistry.config().commonTags("stack", "prod", "region", "us-east-1");
//效果http_requests_total{region="us-east-1",stack="prod",uri="/api/users",} 1.0
meterRegistry.counter("my_counter", "request method", "saveData", "request method2", "saveData2").increment();
//单个指标值用Gauge表示,计时事件的次数和总时间用Timer表示
meterRegistry.gauge("my_gauge", 3);
Gauge.builder("my_TimeGauge", () -> 18).description("描述信息").register(meterRegistry);
List<String> lista= new ArrayList<>();
lista.add("1223");lista.add("1223");
List<String> list = meterRegistry.gauge("my_gauge_list", Collections.emptyList(), new ArrayList<>(), ArrayList::size);
for (int i = 0;i<10;i++){
list.add("sa" + i);
ThreadUtil.sleep(200);
}
//count、max、sum
Timer timer = meterRegistry.timer("my_timer", "request method", "saveData");
timer.max(TimeUnit.MINUTES);
timer.record(() -> ThreadUtil.sleep(1400));
//同时记录count、max、sum
meterRegistry.summary("my_summary", "request method", "saveData").record(3.2);
//数据库调用次数
meterRegistry.counter("database.calls", "db", "users").increment();
//HTTP请求数
meterRegistry.counter("http.requests", "uri", "/api/users").increment();
return new BaseResponse(Boolean.TRUE, "200", "成功");
}
/**
* 在应用程序中收集和记录一个名为"chenhui_counter"的计数器,以便监控应用程序的性能指标。
* @return
*/
@PostMapping("testCounter")
public BaseResponse test(){
//创建了一个名为"chenhui_counter"的计数器(Counter)对象
Counter counter = meterRegistry.counter("chenhui_counter");
//生成一个0到9之间的随机整数作为增量值
int incrementValue = RandomUtils.nextInt(0,10);
//将增量值添加到计数器中
counter.increment(incrementValue);
return new BaseResponse(Boolean.TRUE, "200", "计数器增加值:"+ incrementValue + ",当前计数值:" + counter.count());
}
}
5.Blog学习
Spring Boot 使用 Micrometer 集成 Prometheus 监控 Java 应用性能_micrometer prometues_哎_小羊_168的博客-CSDN博客