springboot集成prometheus的2種方式

第一種:micrometer核心包 橋接Prometheus

依賴:

        <!--web模塊-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--使用Prometheus依賴-->
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--micrometer核心包 橋接Prometheus-->
        <!-- https://mvnrepository.com/artifact/io.micrometer/micrometer-registry-prometheus -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <version>1.2.0</version>
        </dependency>
        <!--micrometer核心包 獲取jvm相關信息 用於展示Grafana上-->
        <!-- https://mvnrepository.com/artifact/io.github.mweirauch/micrometer-jvm-extras -->
        <dependency>
            <groupId>io.github.mweirauch</groupId>
            <artifactId>micrometer-jvm-extras</artifactId>
            <version>0.1.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.micrometer/micrometer-spring-legacy -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-spring-legacy</artifactId>
            <version>1.2.0</version>
        </dependency>

配置:

# micrometer-registry-prometheus
spring.application.name=Char
management.metrics.tags.application=${spring.application.name}
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beans
management.endpoint.shutdown.enabled=true
management.metrics.export.simple.enabled=false
info.author=Char
info.mobile=6S

啓動方式:

package com.citydo.micrometerspingboot;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class MicrometerspingbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(MicrometerspingbootApplication.class, args);
    }

}

註冊:

package com.citydo.micrometerspingboot;

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.binder.MeterBinder;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * @author nick
 */
@Component
public class CharMetrics implements MeterBinder {

    public Counter counterOne;
    public Counter counterTwo;
    public Counter counterThree;

    public Map<String, Long> map;

    CharMetrics(){
        this.map = new HashMap<>();
    }

    @Override
    public void bindTo(MeterRegistry meterRegistry) {
        this.counterOne = Counter.builder("com.citydo.micrometerspingboot").tags(new String[]{"name","counterOne"}).description("This is the one counter").register(meterRegistry);
        this.counterTwo = Counter.builder("com.citydo.micrometerspingboot").tags(new String[]{"name","counterTwo"}).description("This is the two counter").register(meterRegistry);
        this.counterThree = Counter.builder("com.citydo.micrometerspingboot").tags(new String[]{"name","counterThree"}).description("This is the three counter").register(meterRegistry);

        Gauge.builder("com.citydo.micrometerspingboot",map,x-> x.get("x")).tags("name","gauge").description("This is the gauge").register(meterRegistry);
    }
}

埋點:

package com.citydo.micrometerspingboot;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.util.concurrent.atomic.AtomicLong;

@Service
@EnableAsync
public class Schedule {

    private static AtomicLong atomicLong = new AtomicLong();

    @Autowired
    private CharMetrics charMetrics;

    /**
     * 計數器
     * @return
     */
    public static long addNext(){
        return atomicLong.getAndIncrement();
    }

    @Async
    @Scheduled(fixedDelay = 1000)
    public  void increment(){
        long count = addNext();
        charMetrics.counterOne.increment();
        charMetrics.counterThree.increment();
        charMetrics.counterThree.increment();
        charMetrics.map.put("x", count);
    }


}

第二種:Prometheus的客戶端

依賴:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.prometheus/simpleclient_spring_boot -->
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient_spring_boot</artifactId>
            <version>0.9.0</version>
        </dependency>

配置:

# io.prometheus.client.Counter
management.port=8088
management.security.enabled=false
management.health.defaults.enabled=false
endpoints.enabled=false
endpoints.prometheus.enabled=true
endpoints.prometheus.path=/prometheus
endpoints.health.enabled=true
endpoints.health.path=/health

啓動方式:

package com.citydo.micrometerspingboot;

import io.prometheus.client.spring.boot.EnablePrometheusEndpoint;
import io.prometheus.client.spring.boot.EnableSpringBootMetricsCollector;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnablePrometheusEndpoint
@EnableSpringBootMetricsCollector
public class MicrometerspingbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(MicrometerspingbootApplication.class, args);
    }

}

埋點:

package com.citydo.micrometerspingboot;


import io.prometheus.client.Counter;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.atomic.AtomicLong;

@RestController
public class SampleController {

    private static AtomicLong atomicLong = new AtomicLong();

    /**
     * 計數器
     * @return
     */
    public static long addNext(){
        return atomicLong.getAndIncrement();
    }

    /**
     * 註冊
     */
    private static final Counter register = Counter.build()
            .name("micrometerspingboot")
            .labelNames("status")
            .help("Spring Boot and Prometheus").register();

    /**
     * 記錄錯誤或者成功標識
     */
    @GetMapping("/endpoint")
    public void endpoint() {
        register.labels("success").inc();
        register.labels("error").inc();
    }

}

注意:

第一種方式:支持SpringBoot2.X版本

第二種方式:需要SpringBoot版本支持1.5.21.RELEASE 或者 1.5.21.RELEASE 版本之下,不然報錯,報錯如下所示:

org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [com.citydo.micrometerspingboot.MicrometerspingbootApplication]; nested exception is java.lang.IllegalStateException: Failed to introspect annotated methods on class io.prometheus.client.spring.boot.PrometheusEndpointConfiguration
	at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:596) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:302) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:242) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:199) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:315) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:232) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:95) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:705) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.1.10.RELEASE.jar:2.1.10.RELEASE]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744) [spring-boot-2.1.10.RELEASE.jar:2.1.10.RELEASE]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391) [spring-boot-2.1.10.RELEASE.jar:2.1.10.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) [spring-boot-2.1.10.RELEASE.jar:2.1.10.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) [spring-boot-2.1.10.RELEASE.jar:2.1.10.RELEASE]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204) [spring-boot-2.1.10.RELEASE.jar:2.1.10.RELEASE]
	at com.citydo.micrometerspingboot.MicrometerspingbootApplication.main(MicrometerspingbootApplication.java:16) [classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
	at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.1.10.RELEASE.jar:2.1.10.RELEASE]
Caused by: java.lang.IllegalStateException: Failed to introspect annotated methods on class io.prometheus.client.spring.boot.PrometheusEndpointConfiguration
	at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:169) ~[spring-core-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassParser.retrieveBeanMethodMetadata(ConfigurationClassParser.java:392) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:317) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:242) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:586) ~[spring-context-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	... 22 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/actuate/endpoint/AbstractEndpoint
	at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_181]
	at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~[na:1.8.0_181]
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.8.0_181]
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) ~[na:1.8.0_181]
	at java.net.URLClassLoader.access$100(URLClassLoader.java:73) ~[na:1.8.0_181]
	at java.net.URLClassLoader$1.run(URLClassLoader.java:368) ~[na:1.8.0_181]
	at java.net.URLClassLoader$1.run(URLClassLoader.java:362) ~[na:1.8.0_181]
	at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_181]
	at java.net.URLClassLoader.findClass(URLClassLoader.java:361) ~[na:1.8.0_181]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_181]
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) ~[na:1.8.0_181]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_181]
	at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_181]
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[na:1.8.0_181]
	at java.lang.Class.getDeclaredMethods(Class.java:1975) ~[na:1.8.0_181]
	at org.springframework.core.type.StandardAnnotationMetadata.getAnnotatedMethods(StandardAnnotationMetadata.java:158) ~[spring-core-5.1.11.RELEASE.jar:5.1.11.RELEASE]
	... 26 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.actuate.endpoint.AbstractEndpoint
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_181]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_181]
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) ~[na:1.8.0_181]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_181]
	... 42 common frames omitted
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章