天天看點

java服務如何定義Prometheus格式的監控名額

作者:微軟蘇州中心程式員

背景

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通路自定義的名額資料

java服務如何定義Prometheus格式的監控名額