引言
服务基于JAVA1.8、SpringBoot、MySQL、Prometheus设计
一、技术选型
- JAVA1.8
- Springboot 2.1.8.RELEASE
- MySQL 8.0
- Prometheus 2.45.0
Springboot监控系统相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<version>1.11.1</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.11.1</version>
</dependency>
<!--自定义指标依赖-->
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient</artifactId>
<version>0.16.0</version>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_hotspot</artifactId>
<version>0.16.0</version>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_servlet</artifactId>
<version>0.16.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.prometheus/simpleclient_spring_boot -->
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_spring_boot</artifactId>
<version>0.16.0</version>
</dependency>
<!-- Exposition HTTPServer-->
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_httpserver</artifactId>
<version>0.16.0</version>
</dependency>
springboot配置文件相关配置
management:
metrics:
# 下面选项建议打开,以监控 http 请求的 P99/P95 等,具体的时间分布可以根据实际情况设置
distribution:
sla:
http:
server:
requests: 1ms,5ms,10ms,50ms,100ms,200ms,500ms,1s,5s
tags:
application: ${spring.application.name}
endpoints:
prometheus:
enabled: true
web:
base-path: /monitor
exposure:
include: "prometheus"
base-path 地址的值与prometheus的prometheus.yml中的metrics_path相对应
详情参见:https://blog.csdn.net/qq_41307963/article/details/132149338
二、示例:创建由MySQL数据库提供数据的指标
此为示例:创建不同状态密钥总数趋势。根据配置,prometheus会周期性的调用拉取数据储存到其时序数据库。
/**
* 密钥总数
* 子指标 状态
*
* @author lin
* @Date 2023/7/12 18:48
*/
@Slf4j
@Component
public class SecretKeySumGauge {
@Resource
UcspKeyMapper keyMapper;
MeterRegistry registry = RegistryUnit.getRegistry();
/**
* 创建有状态的,密钥数指标
*/
@PostConstruct
public void createKeyStateGauge() {
// 状态快照
for (KeyStatus item : KeyStatus.values()) {
Gauge gauge = creteGauge(item);
}
}
/**
* 创建快照
*
* @param item 对应状态
*/
private Gauge creteGauge(KeyStatus item) {
Integer val = 0;
List<Tag> tagList = baseTag();
String tagType = item.getDesc();
tagList.add(Tag.of(SECRET_KEY_STATUS, tagType));
// 子快照
Gauge gauge = Gauge.builder(SECRET_KEY_GAUGE_NAME, val, value -> countKeyByStatus(item.getKeyStatus()))
.tags(tagList)
// 描述
.description(SECRET_KEY_GAUGE_DESP)
// 注册
.register(RegistryUnit.getRegistry());
log.debug("gauge指标:{} tag {}:{} 已创建", SECRET_KEY_GAUGE_NAME,
SECRET_KEY_STATUS, tagType);
return gauge;
}
/**
* 对应状态的密钥数
*
* @param status 状态
* @return 密钥数
*/
private Integer countKeyByStatus(Integer status) {
QueryWrapper<UcspKey> wrapper = new QueryWrapper<UcspKey>()
.eq(ObjectUtils.isNotEmpty(status),"status",status);
return keyMapper.selectCount(wrapper);
}
}
从容器中获取注册器方式如下:
public class RegistryUnit {
private RegistryUnit(){}
/**
* 获取注册器
*
* @return registry
*/
public static MeterRegistry getRegistry() {
return SpringUtil.getBean(MeterRegistry.class);
}
}