1、springboot接入Prometheus
1.1pom.xml引入jar包
<dependencies>
<!--micometer获取jvm相关信息,用于展示在Grafana上-->
<dependency>
<groupId>io.github.mweirauch</groupId>
<artifactId>micrometer-jvm-extras</artifactId>
<version>0.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--micrometer核心包,桥接Promethus-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.2.0</version>
</dependency>
<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.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
<version>2.2.6</version>
<executions>
<execution>
<goals>
<goal>revision</goal>
</goals>
</execution>
</executions>
<configuration>
<dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
</configuration>
</plugin>
</plugins>
</build>
1.2yml文件配置如下
# 将应用名称添加到计量器的 tag 中去
# 以便 Prometheus 根据应用名区分不同服务
spring.application.name=PrometheusApplication
management.metrics.tags.application=${spring.application.name}
# 打开所有 Actuator 服务
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=cutePanda123
info.mobile=handsome
1.3设置启动程序定时执行
@SpringBootApplication
@EnableScheduling
public class PrometheusApplication {
public static void main(String[] args) {
SpringApplication.run(PrometheusApplication.class, args);
}
}
1.4MeterBinder接口实现bind方法注册到MeterRegistry
package com.imooc.springboot.prometheus.metrics;
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.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
public class MetricsBinder implements MeterBinder {
public Counter counter1;
public Counter counter2;
public Map<String, Double> map;
public MetricsBinder() {
map = new ConcurrentHashMap<>();
}
@Override
public void bindTo(MeterRegistry meterRegistry) {
this.counter1 = Counter.
builder("PrometheusApplication.demo.counter").
tags(new String[] {"name", "counter1"}).
description("This is the first counter").
register(meterRegistry);
this.counter2 = Counter.
builder("PrometheusApplication.demo.counter").
tags(new String[] {"name", "counter2"}).
description("This is the second counter").
register(meterRegistry);
Gauge.builder("PrometheusApplication.demo.gauge", map, x->x.get("x"))
.tags("name", "gauge1")
.description("This is a gauge")
.register(meterRegistry);
}
}
1.5编写业务代码逻辑更新metrics
package com.imooc.springboot.prometheus.metrics;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTask {
@Autowired
MetricsBinder metricsBinder;
private int count1;
private int count2;
@Scheduled(fixedRate = 1000)
public void increment1() {
count1++;
metricsBinder.counter1.increment();
metricsBinder.map.put("x", Double.valueOf(count1));
System.out.println("increment 1 count: " + count1);
}
@Scheduled(fixedRate = 10000)
public void increment2() {
count2++;
metricsBinder.counter2.increment();
metricsBinder.map.put("x", Double.valueOf(count2));
System.out.println("increment 2 count: " + count2);
}
}
执行后结果如下:
扫描二维码关注公众号,回复:
13278153 查看本文章
查看接口,注意metrics是分级访问的结构
2、springboot接入Prometheus
2.1配置Prometheus endpoint
进入Prometheus目录,配置
重启Prometheus后,在http://locahost:9090/graph界面输入up查看是否已经配置成功
2.2使用Grafana模板是4701
https://grafana.com/grafana/dashboards/4701
在Grafana上Import4701即可
访问Grafana:http://localhost:3000/
输入要导入的模板的编号4701,如果是没有网络的情况,可以将模板下载下来,然后通过Upload JSON file来实现。
添加Prometheus数据源,Prometheus数据源指向刚刚配置接受数据Springboot上传的Prometheus;我这里是http://locahost:9090
在做好以上步骤后,就可以在Grafana看到jvm 监控数据了(注意:有时候数据上传比较慢,需要稍作等待)