springboot下micrometer+prometheus+grafana进行jvm监控的操作过程

阅读数:202 评论数:0

跳转到新版页面

分类

python/Java

正文

一、概述

Micrometer是一个用于应用程序度量的度量库,可以帮助开发者监控应用程序的各种指标。在Spring Boot 2中,我们可以使用Micrometer Tracing来实现分布式追踪,以便更好地了解应用程序的性能和调用链。

二、Actuator

spring-boot-starter-actuator是Spring boot提供的模块,用于监控和管理应用程序的运行信息,它提供了内置的endpoints,可用于获取程序的健康状态、性能指标、配置信息等。

<!-- springboot提供的自动配置和依赖注入 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

通过 @SpringBootApplication 注解,它自动启用了 Spring Boot的自动配置和组件扫描功能。

接下来,需要添加一些配置来启用 Actuator 端点。在 application.properties 或 application.yml 文件中,添加以下配置:

management.endpoints.web.exposure.include=*

上述配置将所有的 Actuator 端点暴露给 Web 端口,以便通过 HTTP 请求访问它们。

现在,可以启动应用程序并尝试访问 Actuator 端点。以下是一些常用的 Actuator 端点:

/actuator/health
返回应用程序的健康状态信息
/actuator/info
返回应用程序的自定义信息
/actuator/metrics
返回应用程序的各种指标,如内存使用、CPU 使用等
/actuator/env
返回应用程序的环境变量和配置属性

此外,spring-boot-starter-actuator 还提供了其他一些功能,如远程 shell,审计日志,配置刷新等。可以根据需要在应用程序中进行配置和使用。

请注意,为了保证应用程序的安全性,强烈建议在生产环境中限制对 Actuator 端点的访问,并仅暴露必要的端点。

三、Micrometer

在Spring Boot 2中,Micrometer已经成为了默认的度量库,因此我们无需额外添加依赖,仅需引入actuator。

它为流行的监控系统提供简易的测量客户端。

1、Meter(指标)

监控数据的整个过程都是围绕着Meter(指标),通过一个一个的Meter(指标)数据来进行观察应用的状态。

(1)常见的指标类型

Counter(计数器) 单一计数指标,允许按固定数量递增,用来统计无上限数据
Gauge(仪表盘) 用于统计有上限可增可减的数据。
Timer(计时器) 用于测量短时延迟和事件频率

(2)指标的命名

在Micrometer中,Meter的命名约定使用英语逗号分隔(".")。但对于不同监控系统,各自的命名规范有所不同,因此指标的命名会通过底层的接口(NamingConvention)进行转换,默认是蛇形命名,如果想要适配不同的监控系统,可以自定义注册表(MeterRegistry)中的命名转换。

2、MeterRegistry(指标注册表)

内存注册表(SimpleMeterRegistry)
在内存中保存每一个Meter(指标)的最新值
并且不能导出数据
组合注册表(CompositeMeterRegistry)
可以添加多个注册表,用于将各个注册表组合起来,
可以同时将指标发布到多个监控系统
普罗米修斯注册表(PrometheusMeterRegistry)
当使用普罗米修斯监控时,引入
micrometer-registry-prometheus依赖时会提供此种
收集器,用于将指标数据转换为普罗米修斯识别
的格式和导出数据等功能

3、Tag(标签)

Mircrometer通过Tag(标签)实现了多维度的度量数据收集,通过Tag的命名可以推断出其指向的数据代表什么维度或是什么类型的度量指标(Meter)

private final Counter requestCounter = Metrics.counter("test.request.total", "task", "num1");

test.request.total 表示指标名
task与num1 表示一个标签,task是 tag key ,num1 是tag value,表示任务类型中num1任务的指标数据

四、Prometheus

https://prometheus.io/download/

Prometheus是一个开源的系统监控和报警系统。

1、组件

Prometheus Server 用于收集和存储时间序列数据
pushgateway 各个目标主机可上报数据到pushgateway,然后prometheus server统一从pushgateway拉取数据。
Exporters prometheus支持多种exporter,通过exporter可以采集metrics数据,然后发送到prometheus server端,所有向promtheus server提供监控数据的程序都可以被称为exporter
Alertmanager 从 Prometheus server 端接收到 alerts 后,会进行去重,分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件,微信,钉钉, slack等。
Grafana 监控仪表盘,可视化监控数据

2、zabbix与prometheus的对比

zabbix prometheus
后端用C开发,界面用PHP开发,定制化难度很高 后面用golang开发,前端是grafana,json编辑即可解决,定制化难度较低
集群规模上限为10000个节点 支持更大的集群规模,速度也更快
更适合监控物理机环境 更适合云环境的监控,对openstack,k8s有更好的集成
监控数据存在关系型数据库内 监控数据存在时序数据库内
安装简单,一个软件包中包括了所有服务端功能 安装相对复杂,监控、告警和界面都分属不同的组件
界面上基本能完成全部的配置操作 很多配置需要修改配置文件

五、Grafana

https://grafana.com/grafana/download

Grafana是一款开源的数据可视化工具,使用Grafana可以非常轻松的将数据转成图表

1、安装

下载grafana-enterprise-8.4.3.linux-amd64.tar.gz 安装包:

tar xvf grafana-enterprise-8.4.3.linux-amd64.tar.gz

2、启动

# 前台启动
$ ./bin/grafana-server web
# 后台启动
$ nohup ./bin/grafana-server web >> nohup.out 2>&1 &

Grafana 默认使用 3000 端口启动,开放3000端口:

# 查看开放的端口号 
firewall-cmd --list-all 
# 设置开放的端口号 
firewall-cmd --add-port=3000/tcp --permanent 
# 重启防火墙 
firewall-cmd --reload

3、访问

我们访问:http://192.168.2.186:3000 查看对应页面:

默认的账号密码是 admin/admin

4、配置数据源

之后我们去设置菜单添加 Prometheus 数据源:

5、配置面板

在 Grafana 中有「Dashboard」和「Panel」的概念,Dashboard 可以理解成「看板」,而 Panel 可以理解成

「图表」,一个看板中包含了无数个图表,里面一个个小的图表,就是一个个小的图表(Panel)。

点击「+ 号」-> 「Dashboard」就可以添加一个大面板。

我们设置好数据源、Metrics 数据(rate(process_cpu_seconds_total[1m]))、图表名称,之后点击右上角的

Apply 按钮即可。

保存之后我们就可以在面板中看到机器的 CPU 使用率情况了:

6、模板中心

对于线上监控来讲,如果我们每个面板都需要自己从零开始,那么就太累了。事实上,我们用到的许多监控信息都是类似的。因此 Grafana 官网 - Dashboards 模块 提供了下载 Dashboard 模板的功能。

https://grafana.com/grafana/dashboards/

Dashboards 里有许多各种类型的 Dashboard 面板,例如 JVM 监控、MySQL 数据库监控等。你只需找到合适自己的监控面板,下载json,然后导入。

六、springboot项目自定义埋点

1、引入依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.9</version>
        </dependency>
        <!--注解依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <version>1.18.26</version>
        </dependency>
        <!--测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <version>2.7.9</version>
        </dependency>
        <!--监控埋点依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.7.9</version>
        </dependency>
        <!--用于导出prometheus系统类型的指标数据-->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <version>1.9.8</version>
        </dependency>
    </dependencies>

2、相关代码

(1)业务层

import io.micrometer.core.instrument.*;
import org.springframework.stereotype.Service;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author Administrator
 */
@Service
public class MonitorTestService {
    private final AtomicInteger userGauge1 = Metrics.gauge("test.thread.pool.s1.size", new AtomicInteger(0));

    private final AtomicInteger userGauge2 = Metrics.gauge("test.thread.pool.s2.size", new AtomicInteger(0));

    private final Counter requestCounter = Metrics.counter("test.request.total", "task", "s1");

    public AtomicInteger getGauge1() {
        return userGauge1;
    }

    public AtomicInteger getGauge2() {
        return userGauge2;
    }

    public Counter getRequestCounter() {
        return requestCounter;
    }
}

(2)控制层

import com.shen.monitortest.modules.service.MonitorTestService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;


/**
 * @author Administrator
 */
@Slf4j
@RestController
@RequestMapping("/monitor")
public class MonitorTestController {
    @Resource
    private MonitorTestService monitor;

    @RequestMapping("/request")
    public String requestMonitor() {
        monitor.getGauge1().set(10);
        monitor.getGauge2().set(11);
        monitor.getRequestCounter().increment();
        log.info("{}", monitor.getGauge1());
        log.info("{}", monitor.getGauge2());
        log.info("{}", monitor.getRequestCounter());
        return "ok";
    }
}

3、参数配置

server:
  #服务运行端口
  port: 9091
management:
  endpoints:
    web:
      exposure:
        #开放页面中的所有端口(endpoint)
        include: '*'
      #访问的页面 ip+port/monitor  默认是/actuator
      base-path: /monitor
  server:
    #监听端口
    port: 7000

4、启动服务

启动springboot服务,访问页面http://localhost:7000/monitor/prometheus

可以看到prometheus类型的自定义的指标,除了自定义的指标spring-boot-starter-actuator还监控了一些java的基本状态如内容,线程数等等

5、进一步,通过prometheus拉取指标数据

进入prometheus路径下,修改配置文件prometheus.yml,添加springboot监控指标数据路径

保存配置文件并启动prometheus服务,访问页面http://localhost:9090/

菜单栏选择Status->Targets,可以看到prometheus与springboot-demo都在线

点击springboot-demo的Endpoint就可以看到拉取到的指标数据

6、更进一步,使用grafana订阅prometheus数据源,创建仪表板实现数据可视化

(1)配置数据源

进入grafana的bin路径下,执行grafana-server.exe

访问页面http://localhost:3000/

默认账号密码是admin

添加prometheus数据源,配置prometheus服务的url http://localhost:9090

(2)导入仪表板模版,实现基本数据的可视化

访问grafana仪表板页面:https://grafana.com/grafana/dashboards/

搜索JVM (Micrometer),下载仪表板的json文件

下载得到JSON文件jvm-micrometer_rev9.json,回到grafana页面导入json,选择之前新建的数据源

导入之后就可以查看到从springboot拉取到的基本数据的可视化

(3)新建仪表板(dashboard),新建画布(panel),实现自定义指标数据的可视化

新建一个仪表板和一个画布,新增对指标名为test.thread.pool.s1.size、test.thread.pool.s2.size的两个查询

编辑完后保存,由于两个指标一开始默认为0,如果想要看到变化就需要执行url请求来改变其数值

向springboot服务发送http://localhost:9091/monitor/request请求

此时再查看画布(pannel)会发现两个指标数值发生了变化




相关推荐

一、request uri部分 @PathVariable 获取路径参数,形如url/{id} 二、request header部分 @RequestHeade

一、概述 一个项目使用多个数据库(无论是主从复制--读写分离还是分布式数据库结构)的重要性变得越来越明显,整合的多数据源有两种方式:分包和aop。 1、SqlSessionTemplate SqlSe

一、概述 PageHelper是开源免费的mybatis第三方分页插件。 二、使用 1、pom引入 <dependency> <groupId>com.github.pageh

一、日志框架的介绍 Spring Boot 2.*默认采用slf4j+logback的形式,slf4j是个通用的日志门面,logback就是个具体的日志框架了。

一、问题解决方式 @PostMapping("/insert") @ResponseBody private ResultVO insert1(@RequestParam Map<String, St

JJWT 全称Java Json Web Token。 而JWT是一种在两方之间传输信息的方法,在jwt的主体中编码的信息被称为claims。jwt的扩展形式是json,因此每个c

POM依赖 &lt;dependency&gt; &lt;groupId&g

一、概述 @EnableConfigurationProperties注解的作用是:让使用了@ConfigurationProperties注解的类生效,并且将该类注入到IOC容器中,交由IOC容器进

一、概述 Druid(德鲁伊)是Java语言中的数据库连接池,Spring Boot 2.x默认使用Hikari数据源,虽然HikariCP的速度稍快,但是,Druid能够提供强大的监控和扩展功能。

1、配置文件的格式 springboot可以识别两种格式的配置文件,分别是yml文件与properties文件,我们可以将application.properties文件换成a