Prometheus + Grafana 构建强大的监控和数据可视化系统

​编辑

前言

1. Grafana 是什么

开始前首先要问一个问题,Grafana 到底是什么。

Grafana 是一个监控仪表系统,它是由 Grafana Labs 公司开源的的一个系统监测 (System Monitoring) 工具。它可以大大帮助你简化监控的复杂度,你只需要提供你需要监控的数据,它就可以帮你生成各种可视化仪表。同时它还有报警功能,可以在系统出现问题时通知你。

Grafana 不对数据源作假设,它支持以下各种数据,也就是说如果你的数据源是以下任意一种,它都可以帮助生成仪表。同时在市面上,如果 Grafana 称第二,那么应该没有敢称第一的仪表可视化工具了。因此,如果你搞定了 Grafana,它几乎是一个会陪伴你到各个公司的一件称心应手的兵器。

2.Prometheus是什么

Prometheus 是一个时间序列数据库。但是,它不仅仅是一个时间序列数据库。它涵盖了可以绑定的整个生态系统工具集及其功能,非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做虚拟化环境监控系统,比如VM、Docker、Kubernetes等。输出被监控组件信息的HTTP接口被叫做exporter 。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息(包括磁盘、内存、CPU、网络等等)。Promethus有以下特点:

  • 支持多维数据模型:由度量名和键值对组成的时间序列数据
  • 内置时间序列数据库TSDB
  • 支持PromQL查询语言,可以完成非常复杂的查询和分析,对图表展示和告警非常有意义
  • 支持HTTP的Pull方式采集时间序列数据
  • 支持PushGateway采集瞬时任务的数据
  • 支持服务发现和静态配置两种方式发现目标
  • 支持接入Grafana

3.Grafana与Prometheus之间的关系

把 车辆 类比为 计算机系统 或者一个 软件系统:Grafana就是仪表盘,它和车辆的速度表、水温表是一类的,通过这些表盘你可以实时了解系统运行情况。而Prometheus作为一个时序数据库,其实它和大家熟知的Mysql是一类的东西,都是存储数据,提供查询的,它存储了计算机系统在各个时间点上的监控数据。而Grafana仪表盘上的数据,就是通过查询Prometheus获取的。

监控仪表盘效果预览

​编辑

监控系统搭建

这套监控主要用到了 SpringBoot Actuator + Prometheus + Grafana 三个技术模块,轻量可扩展。

1.环境搭建(Docker部署Prometheus和Grafana)

拉取镜像

bash 复制代码
docker pull bitnami/prometheus:2.47.2
docker pull grafana/grafana:10.2.0

运行grafana镜像,拷贝配置文件

bash 复制代码
docker run--name grafana -d grafana/grafana:10.2.0
mkdir ./root/docker/Grafana/
docker container cp grafana:/etc/grafana/ ./root/docker/Grafana/

grafana.ini配置文件,路径如下

bash 复制代码
/root/docker/Grafana/grafana/grafana.ini

修改grafana服务端口

ini 复制代码
# The http port  to use
http_port = 4000

​编辑

修改grafana服务的mysql配置

ini 复制代码
type=mysql
host=你的mysqlip:3306
name=grafana
user=数据库账户
password=数据库密码

​编辑

接下来配置数据源,这里我们使用的是Prometheus数据源

在/root/docker/Grafana/grafana/provisioning/datasources目录下新建配置文件datasource.yml

yaml 复制代码
apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://你的Prometheus服务ip地址:9090
    isDefault: true

好了,grafana配置好了,接下来配置Prometheus

新建配置文件/root/docker/Grafana/prometheus/prometheus.yml

targets参数为你要监控的应用的ip地址

yaml 复制代码
global:
  scrape_interval: 15s
scrape_configs:
  - job_name: 'x-api-app'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: [ '192.168.1.1:7070' ]

在/root/docker/Grafana目录下新建docker-compose.yml文件,方便统一启动

yaml 复制代码
version: '1'
# 启用脚本;docker-compose -f docker-compose.yml up -d
services:
  # 数据采集
  prometheus:
    image: bitnami/prometheus:2.47.2
    container_name: prometheus
    restart: always
    ports:
      - 9090:9090
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
  # 监控界面
  grafana:
    image: grafana/grafana:10.2.0
    container_name: grafana
    restart: always
    ports:
      - 4000:4000
    depends_on:
      - prometheus
    volumes:
      - ./grafana:/etc/grafana

在/root/docker/Grafana目录下执行compose运行指令

复制代码
docker compose up -d

​编辑

如果要停止服务,在docker-compose.yml目录下输入docker compose stop命令即可

查看是否正常启动

​编辑

2.springboot应用配置

以上我们成功部署了监控环境,接下来我们会讲述如何在springboot程序中引入监控

导入maven依赖

xml 复制代码
<!-- 监控;actuator-上报、prometheus-采集、grafana-展示 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>

actuator、prometheus 是监控所需的内容,aspectjweaver 是使用 prometheus 添加自定义的埋点,而这个会用到切面。

编写配置类PrometheusConfiguration启动监听服务

typescript 复制代码
/**
 * @author www.luckysj.top kitie
 * @description 启动监听服务
 * @create 2023/12/17 15:25:15
 */
@EnableAspectJAutoProxy
@Configuration
public class PrometheusConfiguration {
    @Bean
    public CollectorRegistry collectorRegistry() {
        return new CollectorRegistry();
    }
    @Bean
    public PrometheusMeterRegistry prometheusMeterRegistry(PrometheusConfig config, CollectorRegistry collectorRegistry) {
        return new PrometheusMeterRegistry(config, collectorRegistry, Clock.SYSTEM);
    }
    @Bean
    public TimedAspect timedAspect(MeterRegistry registry) {
        return new TimedAspect(registry);
    }
    @Bean
    public CountedAspect countedAspect(MeterRegistry registry) {
        return new CountedAspect(registry);
    }
}

自定义监控埋点

在需要监控的方法上添加这个注解,其中value为监控埋点名称,在grafana仪表盘添加仪表时可根据这个名称找到相关的监测值

ini 复制代码
@Timed(value="chat_completions_http",description="xxxx接口")

3.仪表盘配置

访问grafana仪表盘,访问地址如下

arduino 复制代码
http://你的Grafana服务ip:4000

默认账户密码均为admin,第一次进入需要更改密码

接下来我们导入jvm仪表盘

​编辑

仪表盘代码输入4701,这是使用较多的jvm仪表盘,他会根据代码自动下载对应仪表盘

​编辑

点击load,仪表盘加载完成,即可进入JVM仪表盘界面了

​编辑

欸,怎么你的是中文界面?当然,这是可以设置的

​编辑

​编辑

​编辑

4.自定义仪表

最后再讲下自定义仪表吧!

进入JVM仪表盘,在右上角位置点击添加可视化

​编辑

然后会进入到自定义界面

​编辑

在这里,你可以选择显示的数据,你在springboot那定义的切面数据名可以在这里找到,点击数据,并点击右上角的Run queries

​编辑

然后对应的数据图表的出来了

​编辑

在右侧可对图表进行定制化的样式设置

​编辑

点击Apply应用图表到仪表盘

​编辑

在仪表盘界面,可对图表进行拖动位置,调整大小等操作,很方便!

最后,在仪表盘界面保存设置(这点很重要,不然功亏一篑)

​编辑

更后面多细节就靠自己挖掘啦~

创文不易,点个赞多多支持吧,Wink~

​编辑

相关推荐
鬼火儿5 小时前
SpringBoot】Spring Boot 项目的打包配置
java·后端
cr7xin5 小时前
缓存三大问题及解决方案
redis·后端·缓存
间彧6 小时前
Kubernetes的Pod与Docker Compose中的服务在概念上有何异同?
后端
间彧7 小时前
从开发到生产,如何将Docker Compose项目平滑迁移到Kubernetes?
后端
间彧7 小时前
如何结合CI/CD流水线自动选择正确的Docker Compose配置?
后端
间彧7 小时前
在多环境(开发、测试、生产)下,如何管理不同的Docker Compose配置?
后端
间彧7 小时前
如何为Docker Compose中的服务配置健康检查,确保服务真正可用?
后端
间彧7 小时前
Docker Compose和Kubernetes在编排服务时有哪些核心区别?
后端
间彧7 小时前
如何在实际项目中集成Arthas Tunnel Server实现Kubernetes集群的远程诊断?
后端
brzhang7 小时前
读懂 MiniMax Agent 的设计逻辑,然后我复刻了一个MiniMax Agent
前端·后端·架构