外链论坛

 找回密码
 立即注册
搜索
查看: 18|回复: 1

SpringBoot微服务 运用 Micrometer 集成 Prometheus 监控 Java 应用性能

[复制链接]

3038

主题

148

回帖

9911万

积分

论坛元老

Rank: 8Rank: 8

积分
99119026
发表于 2024-10-10 17:04:15 | 显示全部楼层 |阅读模式

SpringBoot微服务 运用 Micrometer 集成 Prometheus 监控 Java 应用性能

1、Micrometer 介绍

2、环境、软件准备

3、Spring Boot 工程集成 Micrometer

4、配置 Prometheus 监控应用指标

5、配置 Grafana Dashboard 展示监控项

6、自定义监控指标并展示到 Grafana

6.1、监控某几个 API 请求次数

6.2、监控所有 API 请求次数

6.3、监控实时在线人数

1、Micrometer 介绍

Micrometer 为 Java 平台上的性能数据收集供给了一个通用的 API,它供给了多种度量指标类型(Timers、Guauges、Counters等),同期支持接入区别的监控系统,例如 Influxdb、Graphite、Prometheus 等。咱们能够经过 Micrometer 收集 Java 性能数据,协同 Prometheus 监控系统实时获取数据,并最后在 Grafana 上展示出来,从而很容易实现应用的监控。

Micrometer 中有两个最核心的概念,分别是计量器(Meter)和计量器注册表(MeterRegistry)。计量器用来收集区别类型的性能指标信息,Micrometer 供给了如下几种区别类型的计量器:

计数器(Counter): 暗示收集的数据是根据某个趋势(增多/减少)始终变化的,是最常用的一种计量器,例如接口请求总数、请求错误总数、队列数量变化等。

计量仪(Gauge): 暗示搜集的瞬时的数据,能够任意变化的,例如常用的 CPU Load、Mem 运用量、Network 运用量、实时在线人数统计等,

计时器(Timer): 用来记录事件的连续时间,这个用的比较少。

分布概要(Distribution summary): 用来记录事件的分布状况暗示一段时间范围内对数据进行采样,能够用于统计网络请求平均延迟、请求延迟占比等。

2、环境、软件准备

这次演示环境,我是在本机 MAC OS 上操作,以下是安装的软件及版本:

Docker: 18.06.3-ce

Oracle VirtualBox: 6.0.8 r130520 (Qt5.6.3)

Linux: 7.6.1810

Prometheus: v2.11.1

Grafana: v6.3.4

重视这儿为了快速方便起步 Prometheus、Grafana 服务,我运用 Docker 方式起步因此本机需要安装好 Docker 环境,这儿忽略 Docker 的安装过程,着重介绍一下 Spring Boot 项目怎样运用 Micrometer 来监控 Java 应用性能,并集成到 Prometheus 最后运用 Grafana Dashboard 展示出来。

3、Spring Boot 工程集成 Micrometer

咱们通常说 Spring Boot 集成 Micrometer 值得时 Spring 2.x 版本,由于在该版本 spring-boot-actuator 运用了 Micrometer 来实现监控,而在 Spring Boot 1.5x 中能够经过micrometer-spring-legacy 来运用 micrometer,显然在 2.x 版本有更高的集成度,运用起来非常方便了。那样创建一个 Spring Boot 2.1.4.RELEASE 版本的工程 springboot2-promethues,首要添加依赖如下:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <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.1.4</version> </dependency>

这儿引入了 io.micrometer 的 micrometer-registry-prometheus 依赖以及 spring-boot-starter-actuator 依赖,由于该包对 Prometheus 进行了封装,能够很方便的集成到 Spring Boot 工程中。

其次在 application.properties 中配置如下:

server.port=8088

spring.application.name=springboot2-prometheus

management.endpoints.web.exposure.include=*

management.metrics.tags.application=${spring.application.name}

这儿 management.endpoints.web.exposure.include=* 配置为开启 Actuator 服务,由于Spring Boot Actuator 会自动配置一个 URL 为 /actuator/Prometheus 的 HTTP 服务来供 Prometheus 抓取数据,不外默认该服务是关闭的,该配置将打开所有的 Actuator 服务。management.metrics.tags.application 配置会将该工程应用名叫作添加到计量器注册表的 tag 中去,方便后边 Prometheus 按照应用名叫作来区分区别的服务。

而后在工程起步主类中添加 Bean 如下来监控 JVM 性能指标信息:

@SpringBootApplication public class Springboot2PrometheusApplication { public static void main(String[] args) { SpringApplication.run(Springboot2PrometheusApplication.class, args); } @Bean MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") String applicationName){ return registry -> registry.config().commonTags("application", applicationName); } }

最后,起步服务,浏览器拜访 http://127.0.0.1:8088/actuator/prometheus 就能够看到应用的 一系列区别类型 metrics 信息,例如 http_server_requests_seconds summary、jvm_memory_used_bytes gauge、jvm_gc_memory_promoted_bytes_total counter 等等。

4、配置 Prometheus 监控应用指标

Prometheus 的安装配置可参考之前文案 Prometheus 监控报警系统 AlertManager 之邮件告警,写的很仔细这儿就不在仔细说明了,修改 prometheus.yml 配置,在上篇文案配置示例基本上,添加上边起步的服务位置来执行监控。

$ vim prommetheus.yml

......

- job_name: application

scrape_interval: 5s

metrics_path: /actuator/prometheus

file_sd_configs:

- files: [/usr/local/prometheus/groups/applicationgroups/*.json]

这儿依然采用 file_sd_configs 方式动态服务发掘,新建 <local_dir>/groups/applicationgroups/application.json 文件如下:

$ vim groups/applicationgroups/application.json

[

{

"targets": [

"192.168.1.124:8088"

],

"labels": {

"instance": "springboot2-prometheus",

"service": "springboot2-prometheus-service"

}

}

]

这儿 192.168.1.124:8088 便是上边本地起步的服务位置便是 Prometheus 要监控的服务位置同期添加有些与应用关联的标签,方便后期执行 PromSQL 查找语句区分。最后重启 Prometheus 服务,查看 Prometheus UI 界面确认 Target 是不是添加成功。

在 Graph 页面执行一个简单的查找是获取 springboot2-prometheus 服务的 JVM 性能指标值的。

5、配置 Grafana Dashboard 展示监控项

Prometheus 此刻已然能够正常监控到应用 JVM 信息了,那样咱们可以配置 Grafana Dashboard 来优雅直观的展示出来这些监控值了。首要创建 Grafana 服务,这儿为了方便,依旧采用 Docker 的方式起步起步命令如下:

$ docker run -d -p 3000:3000 --name=grafana grafana/grafana

1

起步完毕后,浏览器拜访 http://192.168.1.121:3000 就可,首次登录运用 admin:admin 默认账户秘码登录并修改秘码。登录完毕,需要添加数据源,这儿咱们要添加的便是上边 Prometheus 数据源,配置如下图:

配置完毕,接下来需要导入对应的监控 JVM 的 Dashboard 模板,模板编号为 4701。

导入完毕后,就能够看到 JVM (Micrometer) 各样类型指标监控图形化以后的页面。

6、自定义监控指标并展示到 Grafana

上边是 spring-boot-actuator 集成为了 Micrometer 来供给的默认监控项,覆盖 JVM 各个层间的监控,协同 Grafana Dashboard 模板基本能够满足咱们平常对 Java 应用的监控。当然,它支持自定义监控指标,实现各个方面的监控,例如统计拜访某一个 API 接口的请求数,统计实时在线人数、统计实时接口响应时间等功能,而这些都能够经过运用上边的四种计量器来实现。接下来,来演示下怎样自定义监控指标并展示到 Grafana 上。

6.1、监控某几个 API 请求次数

咱们继续在 springboot2-promethues 工程上添加 IndexController.java,来实现分别统计拜访 index 及 core 接口请求次数,代码如下:

@RestController @RequestMapping("/v1") public class IndexController { @Autowired MeterRegistry registry; private Counter counter_core; private Counter counter_index; @PostConstruct private void init(){ counter_core = registry.counter("app_requests_method_count", "method", "IndexController.core"); counter_index = registry.counter("app_requests_method_count", "method", "IndexController.index"); } @RequestMapping(value = "/index") public Object index(){ try{ counter_index.increment(); } catch (Exception e) { return e; } return counter_index.count() + " index of springboot2-prometheus."; } @RequestMapping(value = "/core") public Object coreUrl(){ try{ counter_core.increment(); } catch (Exception e) { return e; } return counter_core.count() + " coreUrl Monitor by Prometheus."; } }

说明一下,这儿是一个简单的 RestController 接口,运用了 Counter 计量器来统计拜访 /v1/index 及 /v1/core 接口拜访量。由于拜访数会连续增多因此这儿运用 Counter 比较合适。起步服务,咱们来分别拜访一下这两个接口,为了更好的协同下边演示,能够拜访几次。

服务能够正常拜访,并且拜访了 6 次 /v1/index,拜访了 10 次 /v1/core。接下来,咱们能够到 Prometheus UI 界面上运用 PromSQL 查找自定义的监控信息了。分别添加 Graph 并执行如下查找语句,查找结果如下:

能够看到正确统计出来这两个接口请求的拜访数,这儿解释一下查找语句:app_requests_method_count_total{application="springboot2-prometheus", instance="springboot2-prometheus", method="IndexController.core"} 这儿

app_requests_method_count_total 为上边代码中设置的 Counter 名叫作

application 为初始化 registry 时设置的通用标签,标注应用名叫作这般做好处便是能够按照应用名叫作区分区别的应用。

instance 为 <local_dir>/groups/applicationgroups/application.json 中配置的 instance 实例名叫作,用来区分应用实例。

method 为上边代码中设置的 Counter 标签名叫作能够用来区分区别办法这般不消为每一个办法设置一个 Counter 了。

接下来,咱们在 Grafana Dashboard 上添加一个新的 Panel 并添加 Query 查找,最后图形化展示出来。首要添加一个 Panel 并命名为 自定义监控指标,而后点击 Add Query 增多一个新的 Query 查找查找语句为上边的 PromSQL 语句,不外这儿为了更好的扩展性,咱们能够将 application 及 instance 两个参数赋值为变量,而这些变量能够直接从 Prometheus 上传递过来,最后查找语句为 app_requests_method_count_total{application="$application", instance="$instance", method="IndexController.core"},最后修改 Title 为 实时拜访量 /v1/core,保留一下,返回首页就能够看到刚添加的 Dashboard 了,是不是很直观。

6.2、监控所有 API 请求次数

上边针对某个或某几个接口请求次数做了监控,倘若咱们想针对全部应用监控所有接口请求总次数,这个该怎样实现呢?监控请求次数能够继续运用 Counter 计数器,全部应用所有请求,咱们自然而然的想到了 Spring AOP,经过切面注入能够做到统计所有请求记录,添加依赖如下:

<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.4</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.12</version> </dependency>

添加 AspectAop.java 代码到 Springboot2PrometheusApplication.java 同级目录, 代码如下:

@Component @Aspect public class AspectAop { @Autowired MeterRegistry registry; private Counter counter_total; ThreadLocal<Long> startTime = new ThreadLocal<>(); @Pointcut("execution(public * com.promethues.demo.controller.*.*(..))") private void pointCut(){} @PostConstruct public void init(){ counter_total = registry.counter("app_requests_count", "v1", "core"); } @Before("pointCut()") public void doBefore(JoinPoint joinPoint)throws Throwable { startTime.set(System.currentTimeMillis()); counter_total.increment(); } @AfterReturning(returning = "returnVal", pointcut = "pointCut()") public void doAftereReturning(Object returnVal){ System.out.println("请求执行时间:" + (System.currentTimeMillis() - startTime.get())); } }

这儿 Spring AOP 操作代码就不在说了,咱们创建了一个名叫作为 app_requests_count 的 Counter,所有请求过来都会执行 counter_total.increment(); 操作,从而实现统计所有请求总数。重启服务,拜访多次区别的接口,而后在 Prometheus UI 界面执行 PromSQL 查找查找语句为 app_requests_count_total{application="springboot2-prometheus", instance="springboot2-prometheus", v1="core"} 查找结果如下:

能够看到,能够正确统计出来所有的请求数量,此刻咱们能够在 Grafana 上之前的面板上增多一个新的 Query 并图形化表示出来了,Query 语句为: app_requests_count_total{application="$application", instance="$instance",v1="core"}, 添加完成后,展示效果如下:

6.3、监控实时在线人数

接下来,来演示下怎样监控瞬时数据变化,例如实时交易总金额,实时网络请求响应时间,实时在线人数等,这儿咱们简单模拟一下实时在线人数监控,这儿采用 Gauge 计量仪来做为指标统计类型,在 IndexController.java 中添加关联代码如下:

@RestController @RequestMapping("/v1") public class IndexController { @Autowired MeterRegistry registry; private Counter counter_core; private Counter counter_index; private AtomicInteger app_online_count; @PostConstruct private void init(){ counter_core = registry.counter("app_requests_method_count", "method", "IndexController.core"); counter_index = registry.counter("app_requests_method_count", "method", "IndexController.index"); app_online_count = registry.gauge("app_online_count", new AtomicInteger(0)); } @RequestMapping(value = "/index") public Object index(){ try{ counter_index.increment(); } catch (Exception e) { return e; } return counter_index.count() + " index of springboot2-prometheus."; } @RequestMapping(value = "/core") public Object coreUrl(){ try{ counter_core.increment(); } catch (Exception e) { return e; } return counter_core.count() + " coreUrl Monitor by Prometheus."; } @RequestMapping(value = "/online") public Object onlineCount(){ int people = 0; try { people = new Random().nextInt(2000); app_online_count.set(people); } catch (Exception e){ return e; } return "current online people: " + people; } }

重启服务,拜访一下 /v1/online 接口,得到一个 2000 以内的随机数做为实时在线人数,浏览器拜访一下,得到结果如下:

咱们在 Prometheus UI 界面执行一下 PromeSQL 查找语句 app_online_count{application="springboot2-prometheus", instance="springboot2-prometheus"},一样能够对应获取到实时数据。

继续在 Grafana 上之前的面板上增多一个新的 Query 并图形化表示出来,Query 语句为: app_online_count{application="$application", instance="$instance"}, 添加完成后,展示效果如下:

重视这儿我采用了 Grafana 中 Gauge 图形来展示的,能够按照实质需求来展示对应的数据。

参考资料

Micrometer Documentation

prometheus docs

运用 Micrometer 记录 Java 应用性能指标

回复

使用道具 举报

3004

主题

2万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99139267
发表于 2024-10-13 15:53:04 | 显示全部楼层
百度seo优化论坛 http://www.fok120.com/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-9 10:19 , Processed in 0.071204 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.