背景
java服務指的是以springboot為架構建構的java應用程式,覆寫springboot 1.x和2.x兩個版本,springboot應用程式通過actuator元件暴露的/actuator/prometheus接口傳回程序内部資訊,比如tps、jvm狀态、cpu使用率、gc等。promethesu掃描consul上注冊的springboot應用程式并調用其/actuator/promethesu接口擷取各種名額資料。
springboot 1.x 開啟metrics統計
- 01添加pom
<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>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-spring-legacy</artifactId>
<version>1.3.9</version>
</dependency>
- 02添加配置
# 監控使用單獨的端口與服務端口隔離,提高安全性
# Nginx限制此端口的外網通路權限
management.port=8764
# springboot2的健康檢查接口是/actuator/health
# springboot1的健康檢查接口是/health
# 此配置可以把上述兩個版本的健康檢查接口統一設定為/actuator/health
# Nginx禁止外網通路以/actuator開頭的url
management.context-path=/actuator
# springboot1開啟管理接口的通路權限
management.security.enabled=false
# 關閉所有management接口
endpoints.enabled=false
# 開啟/actuator/info
endpoints.info.enabled=true
# 開啟/actuator/health
endpoints.health.enabled=true
# 開啟/actuator/prometheus
endpoints.prometheus.enabled=true
# 注冊consul時設定統一的健康檢查位址
spring.cloud.consul.discovery.health-check-path=${management.context-path}/health
# 多執行個體注冊management服務避免覆寫,這是springboot1.x存在的bug
spring.cloud.consul.discovery.management-suffix=${spring.cloud.client.ipAddress}-${server.port}-management
- 03注入applicationName到Metrics
@Bean
MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") final String applicationName) {
return new MeterRegistryCustomizer<MeterRegistry>() {
@Override
public void customize(MeterRegistry meterRegistry) {
meterRegistry.config().commonTags("application", applicationName);
}
};
}
springboot 2.x開啟Metrics統計
- 01添加pom
<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>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<version>1.5.1</version>
</dependency>
- 02添加配置
# 監控使用單獨的端口與服務端口隔離,提高安全性
# Nginx限制此端口的外網通路權限
# Nginx禁止外網通路以/actuator開頭的url
management.server.port=8764
# 開放管理接口的通路權限
management.endpoints.web.exposure.include=info,health,prometheus
- 03注入applicationName到Metrics
@Bean
MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") final String applicationName) {
return new MeterRegistryCustomizer<MeterRegistry>() {
@Override
public void customize(MeterRegistry meterRegistry) {
meterRegistry.config().commonTags("application", applicationName);
}
};
}
定義Metrics
@Component
public class MyMetrics {
MeterRegistry registry;
public MyMetrics(MeterRegistry reg) {
registry = reg;
}
@Scheduled(cron = "0/3 * * * * ?")
private void job() {
int i = random.nextInt(100);
registry.counter("url_requests_count", "url", "/push").increment(i);
}
}
通路Metrics
通過http://localhost:8764/actuator/prometheus通路自定義的名額資料