一、Prometheus 介绍

Prometheus 中文名称为普罗米修斯,受启发于Google 的Brogmon 监控系统,从2012年开始由前Google工程师在Soundcloud 以开源软件的形式进行研发,2016年6月发布1.0版本。Prometheus 可以看作是 Google 内部监控系统Borgmon 的一个实现。

下图说明了Prometheus 的体系结构及其部分生态系统组件。其中 Alertmanager 用于告警,Grafana 用于监控数据可视化.

在这里我们了解到Prometheus 这几个特征即可:

1.数据收集器,它以配置的时间间隔定期通过HTTP提取指标数据。
2.一个时间序列数据库,用于存储所有指标数据。
3.一个简单的用户界面,您可以在其中可视化,查询和监视所有指标。

二、Grafana 介绍

Grafana 是一款采用 go 语言编写的开源应用,可以帮助用户通过创建仪表盘、图表和警报来实时监控和分析各种指标和数据源。

以下是Grafana的一些主要特点和功能:

  1. 多种数据源支持:Grafana支持各种数据源,包括Graphite、Prometheus、InfluxDB、Elasticsearch、MySQL等。用户可以从这些数据源中获取数据并进行可视化。
  2. 强大的数据可视化:Grafana提供了丰富的图表和仪表盘编辑工具,用户可以根据需求创建各种类型的图表,如折线图、柱状图、饼图等。同时,用户可以自定义图表样式、颜色和标签等。
  3. 灵活的警报机制:Grafana允许用户设置警报规则,当指标达到或超过特定阈值时,会发送通知或触发其他操作。用户可以根据需求设置警报条件和通知方式,如邮件、Slack、PagerDuty等。
  4. 用户友好的界面:Grafana提供了直观易用的用户界面,使用户可以轻松地创建、编辑和管理仪表盘。用户可以通过拖放、缩放和调整来自定义仪表盘布局和组件。
  5. 多用户和权限管理:Grafana支持多用户和团队协作,管理员可以设置不同用户的权限和角色。用户可以共享仪表盘和报告,并进行版本控制和审计。
  6. 社区支持和插件生态系统:Grafana拥有活跃的开源社区,用户可以从社区中获取支持、解决问题和分享经验。此外,Grafana还有丰富的插件生态系统,用户可以通过插件扩展和定制功能。

总的来说,Grafana是一个功能强大且易于使用的数据可视化和监控平台,适用于各种场景,如应用性能监控、基础设施监控、业务分析等。

三、配置Spring 应用

在Spring Boot Actuator 模块 详解:健康检查,度量,指标收集和监控中,我有提到过Actuator 模块也可以和一些外部的应用监控系统整合,其中就包括Prometheus 。那么Spring Boot Actuator 怎么让 Spring Boot 应用和Prometheus 这种监控系统结合起来。

  1. 在项目中引入一下依赖
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
       
      <dependency>
          <groupId>io.micrometer</groupId>
          <artifactId>micrometer-registry-prometheus</artifactId>
          <scope>runtime</scope>
      </dependency>
  1. 在 application.yml文件中添加一下内容:
   server:
     port: 8080
     servlet:
     context-path: /
   spring:
     application:
       name: SpringBoot-ABlog
   # 基于 grafana prometheus(普罗米修斯) 监控
   
   # 1、将所有Spring Web 监控点暴露, 就可以对外提供各种的指标数据了
   management:
     endpoints:
       web:
         exposure:
           include: "*"
     # end
     # 2、将 SpringWeb 暴露的数据转为 prometheus 格式
     endpoint:
       prometheus:
         enabled: true
       health:
         show-details: always # 查看更多的细节
     # 3、将指标设置为 允许导出
     metrics:
       export:
         prometheus:
           enabled: true
  1. 这个时候我们启动项目,在浏览器访问 localhost:8080/actuator/ 会看到一下内容: tips:如果设置了 servlet.context-path 那么需要在路径路径前加,如
   localhost:8080/xxxxx/actuator/
  1. 其中就包含了 http://localhost:8080/actuator/prometheus 这个链接。因为上图数据为JSON 格式,当我们访问 http://localhost:8080/actuator/prometheus会出现一下数据:

  2. 这个是将 SpringWeb 暴露的数据转为 prometheus 格式。

  3. 在项目中创建配置类(或在启动类中) 添加 Bean

       /**
        * grafana prometheus(普罗米修斯) 监控 配置
        *
        * @author Mr.An
        * @date 2023-09-06 22:49:13
        */
       @Configuration
       public class PrometheusWebConfig {
           
           /**
            * 该Bean 是 本应用向 prometheus(普罗米修斯) 额外添加 applicationName
            *
            * @param applicationName 应用名称
            * @return {@link MeterRegistryCustomizer}<{@link MeterRegistry}>
            */
           @Bean
           MeterRegistryCustomizer<MeterRegistry> configuration(
                   @Value("${spring.application.name}") String applicationName) {
               return (i) -> i.config().commonTags("application", applicationName);
           }
       }
  1. ok 项目部署完毕,我们打包上传服务器部署。这里可以参考 我后续的另一个博客,实现docker一键上传部署。

四、部署和配置 Grafana与Prometheus

1、在 /home/ 下创建 docker-compose.yml 文件

vim docker-compose.yml 

2、写入一下信息:

version: '3'
services:
  grafana:
 image: grafana/grafana:master                                # 原镜像`grafana/grafana:master`
 container_name: grafana                                      # 容器名为'grafana'
 restart: unless-stopped                                      # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
 environment:
   - GF_LANG=zh-CN
 volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
   - "/home/grafana/data:/var/lib/grafana"
   - "/home/grafana/config/defaults.ini:/usr/share/grafana/conf/defaults.ini"
   - "/home/grafana/log:/var/log/grafana"
 ports: # 映射端口
   - "3001:3000"

 prometheus:
   image: prom/prometheus:latest
   restart: always
   container_name: prometheus
   hostname: prometheus
   environment:
     - TZ=Asia/Shanghai
   ports:
     - "9090:9090"
   volumes:
     - /home/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
     - /home/prometheus/data:/prometheus

3、在 /home 文件夹下创建 grafana 文件夹 和 prometheus 文件夹

cd home
mkdir grafana
mkdir prometheus

4、添加 /home/grafana/config/defaults.ini 文件

cd /home/grafana
mkdir config
cd config
vim defaults.ini

5、在 defaults.ini 添加一下内容: 文件地址:defaults.ini

6、创建 /home/prometheus/prometheus.yml 文件 内容如下:

global:
  scrape_interval:     15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets:

scrape_configs:

  - job_name: "prometheus"

    static_configs:
      - targets: ["localhost:9090"] # 此处为 Prometheus 的ip和端口

###   以下内容为SpringBoot应用配置
  - job_name: 'SpringBoot-ABlog'
    scrape_interval: 5s
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: [10.0.4.7:8080] ### 将此处修改为Springboot 应用程序 的ip和端口

7、设置权限

chmod 777 /home/grafana/data
chmod 777 /home/grafana/config
chmod 777 /home/grafana/log

chmod 777 /home/prometheus/prometheus.yml
chmod 777 /home/prometheus/data

8、启动

docker-compose up -d

9、浏览器访问ip:3001访问grafana,默认账号密码admin/admin:

10、添加data source

11、选择prometheus

12、输入 prometheus 的地址并保存

13、出现 Data source is working 即保存成功

14、导入 面板信息

15、输入 4701 点 load , 4701 为面板的ID ,其他可访问 Dashboards | Grafana Labs 查看

16、我这里已经导入过了,所以显示已存在,正常我们会看到 JVM (Micrometer) ,后点击 Prometheus 选择我们刚刚添加过的data course

17、最后点击 Import 即可。

18、最后的效果如下: 可以查看较为详细的JVM 信息,堆、栈、新生代、老年代等。其余的监控我们还可以自定义等等。

OK~ 结束~