快速搭建SpringBoot3+Prometheus+Grafana

news2024/10/28 16:37:03

快速搭建SpringBoot3+Prometheus+Grafana

一、搭建SpringBoot项目

1.1 创建SpringBoot项目

image-20241023112543699

1.2 修改pom文件配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.javagpt</groupId>
    <artifactId>prometheus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>prometheus</name>
    <description>prometheus</description>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <!-- spring boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>jakarta.json</groupId>
            <artifactId>jakarta.json-api</artifactId>
            <version>${jakarta-json.version}</version>
        </dependency>
        <!-- spring validation -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <!-- mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.31</version>
            <scope>runtime</scope>
        </dependency>
        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.23</version>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- mybatis plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.8</version>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <version>1.13.6</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

1.3 创建controller+service+mapper三层文件

image-20241023112650341

1.3.1 controller

ArticleServiceImpl.java

import io.micrometer.core.annotation.Counted;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @BelongsProject: prometheus
 * @BelongsPackage: com.javagpt.prometheus.controller
 * @Author: JavaGPT
 * @CreateTime: 2024-10-23  00:01
 * @Description:
 * @Version: 1.0
 */
@RestController
@RequestMapping("/article")
public class c {

    @Counted(value = "article.get", extraTags = "get", description = "test")
    @GetMapping
    public String index() {

        return "Hello World";
    }
}

1.3.2 service

ArticleService.java

import com.javagpt.prometheus.entity.ArticleEntity;
import com.baomidou.mybatisplus.extension.service.IService;

/**
* @author 26314
* @description 针对表【tb_article】的数据库操作Service
* @createDate 2024-10-22 23:59:42
*/
public interface ArticleService extends IService<ArticleEntity> {

}

ArticleServiceImpl.java

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.javagpt.prometheus.entity.ArticleEntity;
import com.javagpt.prometheus.service.ArticleService;
import com.javagpt.prometheus.mapper.ArticleMapper;
import org.springframework.stereotype.Service;

/**
* @author 26314
* @description 针对表【tb_article】的数据库操作Service实现
* @createDate 2024-10-22 23:59:42
*/
@Service
public class ArticleServiceImpl extends ServiceImpl<ArticleMapper, ArticleEntity>
    implements ArticleService{

}
1.3.3 mapper

ArticleMapper.java

import com.javagpt.prometheus.entity.ArticleEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

/**
* @author 26314
* @description 针对表【tb_article】的数据库操作Mapper
* @createDate 2024-10-22 23:59:42
* @Entity com.javagpt.prometheus.entity.ArticleEntity
*/
@Mapper
public interface ArticleMapper extends BaseMapper<ArticleEntity> {

}
1.3.4 mapper.xml

ArticleMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.javagpt.prometheus.mapper.ArticleMapper">

    <resultMap id="BaseResultMap" type="com.javagpt.prometheus.entity.ArticleEntity">
            <id property="id" column="id" jdbcType="INTEGER"/>
            <result property="webId" column="web_id" jdbcType="VARCHAR"/>
            <result property="articleId" column="article_id" jdbcType="VARCHAR"/>
            <result property="author" column="author" jdbcType="VARCHAR"/>
            <result property="title" column="title" jdbcType="VARCHAR"/>
            <result property="abstractContent" column="abstract_content" jdbcType="VARCHAR"/>
            <result property="content" column="content" jdbcType="VARCHAR"/>
            <result property="tag" column="tag" jdbcType="VARCHAR"/>
            <result property="url" column="url" jdbcType="VARCHAR"/>
            <result property="publishTime" column="publish_time" jdbcType="TIMESTAMP"/>
            <result property="commentCount" column="comment_count" jdbcType="INTEGER"/>
            <result property="likeCount" column="like_count" jdbcType="INTEGER"/>
            <result property="readCount" column="read_count" jdbcType="INTEGER"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="creator" column="creator" jdbcType="VARCHAR"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
            <result property="updater" column="updater" jdbcType="VARCHAR"/>
            <result property="remark" column="remark" jdbcType="VARCHAR"/>
    </resultMap>

    <sql id="Base_Column_List">
        id,web_id,article_id,
        author,title,abstract_content,
        content,tag,url,
        publish_time,comment_count,like_count,
        read_count,create_time,creator,
        update_time,updater,remark
    </sql>
</mapper>

1.4 修改application.yml 文件

spring:
  application:
    name: prometheus

  # mysql??
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://106.55.xx.xx:3306/blog?serverTimezone=Asia/Shanghai&allowMultiQueries=true&rewriteBatchedStatements=true
    username: root
    password: root

management:
  endpoints:
    enabled-by-default: true #暴露所有端点信息
    web:
      exposure:
        include: '*'  #以web方式暴露


server:
  servlet:
    context-path: /prometheus
  port: 8080

# mybatisPlus配置
mybatis-plus:
  # mapper映射地址
  mapper-locations: classpath:mapper/*.xml
  # 实体类扫描包路径
  type-aliases-package: com.javagpt.prometheus.entity
  configuration:
    # sql打印
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 开启驼峰命名
    map-underscore-to-camel-case: true
  global-config:
    db-config:
      # 数据库表前缀
      table-prefix: t_

1.5 一键启动

Connected to the target VM, address: '127.0.0.1:5815', transport: 'socket'

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.3.4)

2024-10-23T08:52:37.974+08:00  INFO 33412 --- [prometheus] [           main] c.j.prometheus.PrometheusApplication     : Starting PrometheusApplication using Java 17.0.8 with PID 33412 (D:\develop\java_develop\springboot\prometheus\target\classes started by 26314 in D:\develop\java_develop\springboot\prometheus)
2024-10-23T08:52:37.976+08:00  INFO 33412 --- [prometheus] [           main] c.j.prometheus.PrometheusApplication     : No active profile set, falling back to 1 default profile: "default"
2024-10-23T08:52:38.809+08:00  INFO 33412 --- [prometheus] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2024-10-23T08:52:38.817+08:00  INFO 33412 --- [prometheus] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-10-23T08:52:38.818+08:00  INFO 33412 --- [prometheus] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.30]
2024-10-23T08:52:38.855+08:00  INFO 33412 --- [prometheus] [           main] o.a.c.c.C.[.[localhost].[/prometheus]    : Initializing Spring embedded WebApplicationContext
2024-10-23T08:52:38.855+08:00  INFO 33412 --- [prometheus] [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 831 ms
Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter.
Get /192.168.216.1 network interface 
Get network interface info: name:eth9 (VMware Virtual Ethernet Adapter for VMnet8)
Initialization Sequence datacenterId:0 workerId:5
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.5.8 
2024-10-23T08:52:39.626+08:00  INFO 33412 --- [prometheus] [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 16 endpoints beneath base path '/actuator'
2024-10-23T08:52:39.681+08:00  INFO 33412 --- [prometheus] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/prometheus'
2024-10-23T08:52:39.690+08:00  INFO 33412 --- [prometheus] [           main] c.j.prometheus.PrometheusApplication     : Started PrometheusApplication in 2.003 seconds (process running for 2.618)
2024-10-23T08:52:39.869+08:00  INFO 33412 --- [prometheus] [nio-8080-exec-1] o.a.c.c.C.[.[localhost].[/prometheus]    : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-10-23T08:52:39.869+08:00  INFO 33412 --- [prometheus] [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2024-10-23T08:52:39.869+08:00  INFO 33412 --- [prometheus] [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms
2024-10-23T08:52:40.332+08:00  INFO 33412 --- [prometheus] [)-192.168.82.82] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited

1.6 查看默认指标信息

本地访问 http://localhost:8080/prometheus/actuator/prometheus

image-20241023112224311

二、搭建Prometheus

到官网下载最新版 https://prometheus.io/download/

image-20241023122219263

修改Prometheus.yml文件

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"
    metrics_path: '/prometheus/actuator/prometheus' #指定抓取的路径
    static_configs:
      - targets: ['127.0.0.1:8080']
        labels:
          nodename: 'app-demo'
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
      # - targets: ["localhost:9090"]

CMD 进入命令行启动prometheus.exe

image-20241023122348405

三、安装Grafana

3.1 下载

去官网下载最新版Garafana https://grafana.org.cn/grafana/download?platform=windows

image-20241023122637575

3.2 安装

解压之后进入CMD命令行启动 grafana-server.exe

3.3 配置数据源

进入http://localhost:3000 登录,初始账号和密码都是admin,然后找到Data Source,进行如下操作,填好之后点击确认。

image-20241023122855314

3.4 配置SpringBoot程序仪表盘模板

先进入Grafana官网寻找合适的SpringBoot程序模板 https://grafana.com/grafana/dashboards/?search=springboot ,然后将模板ID复制下来。

image-20241023123226041

image-20241023123140615

image-20241023123307746

image-20241023123327341

至此,整个SpringBoot3+Prometheus+Grafana就已经完成搭建啦。

让我们来看看最终的效果图吧。

image-20241023123429133

写在最后

编程精选网(www.codehuber.com),程序员的终身学习网站已上线!

如果这篇【文章】有帮助到你,希望可以给【JavaGPT】点个赞👍,创作不易,如果有对【后端技术】、【前端领域】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【JavaGPT】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💝💝💝!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2225543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL之数据库设计

前文我们了解了数据库中库、表等的操作&#xff0c;今天我们来学习如何设计数据库&#xff1f;&#xff1f; 在设计数据库前&#xff0c;我们先来了解什么是范式&#xff1f;&#xff1f; 1. 范式 数据库的范式是一组规则&#xff0c;在设计关系数据库时&#xff0c;遵从不同…

Elasticsearch 解析:倒排索引机制/字段类型/语法/常见问题

Elasticsearch 是一个分布式的开源搜索引擎&#xff0c;广泛用于全文搜索、分析和数据存储。它基于 Apache Lucene 构建&#xff0c;支持 RESTful 风格的 API&#xff0c;使得开发者能够高效地存储和检索数据。本文将详细讲解 Elasticsearch 的基本原理&#xff0c;特别是其倒排…

ctfshow(66->70)--RCE/命令执行漏洞--禁用命令执行函数

Web66 源代码&#xff1a; if(isset($_POST[c])){$c $_POST[c];eval($c); }else{highlight_file(__FILE__); }代码审计&#xff1a; POST传参c&#xff0c;eval进行代码执行。 思路&#xff1a; 由于题目过滤了命令执行函数&#xff0c;所以使用其他方法进行RCE。 先使用c…

一文讲明白大模型分布式逻辑(从GPU通信原语到Megatron、Deepspeed)

1. 背景介绍 如果你拿到了两台8卡A100的机器&#xff08;做梦&#xff09;&#xff0c;你的导师让你学习部署并且训练不同尺寸的大模型&#xff0c;并且写一个说明文档。你意识到&#xff0c;你最需要学习的就是关于分布式训练的知识&#xff0c;因为你可是第一次接触这么多卡…

【ROS概述】概念及环境搭建

学习途径&#xff1a; 教程&#xff1a;Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 课程视频&#xff1a;https://www.bilibili.com/video/BV1Ci4y1L7ZZ 机器人体系 要完全实现一个机器人的系统研发&#xff0c;几乎是“全栈”开发&#xff0c;…

python 爬虫 入门 五、抓取图片、视频

目录 一、图片、音频 二、下载视频&#xff1a; 一、图片、音频 抓取图片的手法在上一篇python 爬虫 入门 四、线程&#xff0c;进程&#xff0c;协程-CSDN博客里面其实有&#xff0c;就是文章中的图片部分&#xff0c;在那一篇文章&#xff0c;初始代码的28&#xff0c;29行…

Python 函数返回值之None类型

什么是None None是类型‘NoneType’字面量&#xff0c;用于表示&#xff1a;空的、无意义的 函数如何返回None 不使用return语句即返回None 主动return None 使用场景 函数返回值if判断变量定义 练习&#xff1a; 练习一&#xff1a;无return语句的函数返回值 # 无ret…

Docker | centos7上对docker进行安装和配置

安装docker docker配置条件安装地址安装步骤2. 卸载旧版本3. yum 安装gcc相关4. 安装需要的软件包5. 设置stable镜像仓库6. 更新yum软件包索引7. 安装docker引擎8. 启动测试9. 测试补充&#xff1a;设置国内docker仓库镜像 10. 卸载 centos7安装docker https://docs.docker.com…

交易逆序对的总数 ---- 分治-归并

题目链接 题目: 分析: 解法一: 暴力解法, 遍历所有的数对, 找到逆序对, 需要两重for循环, 一定会超时解法二: 归并排序的思想如果我们将数组分成两半, 我们在每一半中各找一个数字, 判断是否为逆序对, 再根据归并的思想, 再将一半数组分半, 判断是否为逆序对, 直到数组只有一…

合约门合同全生命周期管理系统:企业智能合同管理的新时代

合约门合同全生命周期管理系统&#xff1a;企业智能合同管理的新时代 1. 引言 随着现代企业的快速发展&#xff0c;合同管理的复杂性日益增加。无论是采购合同、销售合同还是合作协议&#xff0c;合同管理已成为企业运营中至关重要的一环。传统的手工合同管理方式往往效率低下…

WISE:重新思考大语言模型的终身模型编辑与知识记忆机制

论文地址&#xff1a;https://arxiv.org/abs/2405.14768https://arxiv.org/abs/2405.14768 1. 概述 随着世界知识的不断变化&#xff0c;大语言模型&#xff08;LLMs&#xff09;需要及时更新&#xff0c;纠正其生成的虚假信息或错误响应。这种持续的知识更新被称为终身模型编…

Colorful/七彩虹将星X17 Pro Max 2023款 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能&#xff0c;自动重建COLORFUL RECOVERY功能&#xff0c;恢复到新机开箱状态。 【格式】&#xff1a;iso 【系统类型】&#xff1a;Windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 注意&#xff1a;安装系统会…

网页上的视频怎么下载下来?三种方法

分享三个简单好用的网页视频下载工具&#xff0c;值得使用&#xff01; 1.IDM IDM 是一款可以提高下载速度达5倍的工具&#xff0c;同时具有恢复、调度和组织下载的功能。如果由于网络问题或意外的电源中断&#xff0c;程序将恢复未完成的下载。 IDM 还具有一个完全功能的站点…

Redis 过期策略 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 过期策略 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 过期策略 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis &a…

【SpringBoot】✈️@Service 代替 @Controller 在控制层场景使用

目录 &#x1f378;前言 &#x1f44b;一、区别 &#x1f37b;二、本地测试 2.1 响应类 2.2 控制层 3.Service 测试 &#x1f37a;三、分析 &#x1f440;四、章末 &#x1f378;前言 小伙伴们大家好&#xff0c;由于最近比较忙&#xff0c;文章更新的稍微怠慢了&#xff0…

leetcode-62-不同路径

题解&#xff1a; 1、dp[i][j]代表到达(i,j)点最多的路径&#xff1b;题目要求机器人每次只能向右或向下走一步&#xff0c;所以到达(i,j)点的最多路径为到达(i-1,j)的最多路径与到达(i,j-1)的最多路径之和。即dp[i][j]dp[i-1][j]dp[i][j-1]。 2、当(i,j)位于矩阵的第一行或第…

rabbitmq高级特性(1):消息确认,持久性,发送方确认和重试机制

目录 1.消息确认机制 1.1.消息确认机制介绍 2.1.Spring-AMQP的三种消息确认&#xff08;重点&#xff09; 2.持久性 2.1.交换机持久性 2.2.队列持久性 2.3.消息持久性 3.发送方确认 3.1.confirm确认模式 3.2.return退回模式 4.重试机制 4.1.重试机制定义 4.2.重试…

Padavan开启IPV6

开户IPV6 如果运营商支持IPV6&#xff0c;在网络地图中可以看到获取到的ipv6地址 开启SSH 输入如下命令让访火墙放行IPV6 ip6tables -F ip6tables -X ip6tables -P INPUT ACCEPT ip6tables -P OUTPUT ACCEPT ip6tables -P FRWARD ACCEPT 可以写在自启动脚本里 关闭路由器的防…

CH592进一步降功耗问题

目录 问题描述&#xff1a; 自制模块电流测试&#xff1a; 成熟产品电流测试&#xff1a; 优化程序&#xff1a; 总结&#xff1a; 关注我&#xff0c;躺不平就一起卷吧 问题描述&#xff1a; 之前有记录过&#xff0c;CH592与app连接时电流过大问题&#…

群控系统服务端开发模式-应用开发-业务架构逻辑开发BaseAPI

一、加密工具开发 首先在根目录下extend文件中创建Encipher文件夹&#xff0c;用于专门开发加解密工具&#xff0c;新建RSA算法控制器并命名为Encrypt.php。然后在根目录下config文件夹中创建rsa.php文件&#xff0c;用于配置RSA算法参数。 1、秘钥生成算法 <?php /*** RS…