SpringBoot集成系统监控和告警工具包prometheus

prometheus以开源软件的形式进行研发的系统监控和告警工具包
Grafana 是一个监控仪表系统,它是由 Grafana Labs 公司开源的的一个系统监测工具,只需要提供需要监控的数据,它就可以帮助生成各种可视化仪表,同时它还有报警功能,可以在系统出现问题时发出通知。

环境搭建:

这里采用docker-compose搭建测试环境,具体配置如下

docker-compose-prometheus.yml


# 镜像版本请自行选择 https://hub.docker.com/search?q=&type=image
version: "3"

# 网桥 -> 方便相互通讯
networks:
  prometheus:
    ipam:
      driver: default
      config:
        - subnet: "172.22.0.0/24"

services:
  # 开源的系统监控和报警系统
  prometheus:
    image: registry.cn-hangzhou.aliyuncs.com/zhengqing/prometheus:v2.34.0             # 原镜像`prom/prometheus:v2.34.0`
    container_name: prometheus
    restart: unless-stopped
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    command: "--config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/prometheus"
    ports:
      - "9090:9090"
    depends_on:
      - node-exporter
    networks:
      prometheus:
        ipv4_address: 172.22.0.11

  # 采集服务器层面的运行指标
  node-exporter:
    image: registry.cn-hangzhou.aliyuncs.com/zhengqing/node-exporter:v1.3.1           # 原镜像`prom/node-exporter:v1.3.1`
    container_name: prometheus-node-exporter
    restart: unless-stopped
    ports:
      - "9100:9100"
    networks:
      prometheus:
        ipv4_address: 172.22.0.22

  # 用于UI展示
  # https://grafana.com/docs/grafana/latest/installation/docker
  grafana:
    image: registry.cn-hangzhou.aliyuncs.com/zhengqing/grafana:8.0.0               # 原镜像`grafana/grafana:8.0.0`
    container_name: prometheus-grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - "./prometheus/grafana/grafana.ini:/etc/grafana/grafana.ini" # 邮箱配置
#      - "./prometheus/grafana/grafana-storage:/var/lib/grafana"
#      - "./prometheus/grafana/public:/usr/share/grafana/public" # 这里面可处理汉化包 可参考 https://github.com/WangHL0927/grafana-chinese
#      - "./prometheus/grafana/conf:/usr/share/grafana/conf"
#      - "./prometheus/grafana/log:/var/log/grafana"
#      - "/etc/localtime:/etc/localtime"
    environment:
      GF_EXPLORE_ENABLED: "true"
      GF_SECURITY_ADMIN_PASSWORD: "admin"
      GF_INSTALL_PLUGINS: "grafana-clock-panel,grafana-simple-json-datasource,alexanderzobnin-zabbix-app"
      # 持久化到mysql数据库
      GF_DATABASE_URL: "mysql://root:root@172.22.0.34:3306/grafana" # TODO 修改
    depends_on:
      - prometheus
      - mysql
    networks:
      prometheus:
        ipv4_address: 172.22.0.33

  # mysql数据库 => 用于grafana持久化数据
  mysql:
    image: registry.cn-hangzhou.aliyuncs.com/zhengqing/mysql:5.7
    container_name: prometheus-mysql
    restart: unless-stopped
    volumes:
      - "./prometheus/mysql5.7/my.cnf:/etc/mysql/my.cnf"
      - "./prometheus/mysql5.7/data:/var/lib/mysql"
      - "./prometheus/mysql5.7/log/mysql/error.log:/var/log/mysql/error.log"
    environment:
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
      MYSQL_ROOT_PASSWORD: root         # 设置root用户密码
      MYSQL_DATABASE: grafana           # 初始化数据库grafana
    ports:
      - "3306:3306"
    networks:
      prometheus:
        ipv4_address: 172.22.0.34

启动测试环境:docker-compose-prometheus.yml 需修改grafana中配置的mysql连接信息 prometheus.yml 自行配置

# 运行
docker-compose -f docker-compose-prometheus.yml -p prometheus up -d
# 查看grafana日志
docker logs -fn10 prometheus-grafana

grafana访问地址:http://ip地址:3000 默认登录账号密码:admin/admin

prometheus访问地址: http://ip地址:9090

exporter访问地址: http://ip地址:9100/metrics

一、依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-demo</artifactId>
        <groupId>com.et</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>prometheus</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-core</artifactId>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
        </dependency>

    </dependencies>
</project>

二、配置文件和启动类

server.port=8088
spring.application.name=springboot2-prometheus
management.endpoints.web.exposure.include=*
management.metrics.tags.application=${spring.application.name}
@SpringBootApplication
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }
}

三、PrometheusCustomMonitor类

@Component
public class PrometheusCustomMonitor {

    private Counter requestErrorCount;
    private Counter orderCount;
    private DistributionSummary amountSum;
    private AtomicInteger failCaseNum;

    private final MeterRegistry registry;

    @Autowired
    public PrometheusCustomMonitor(MeterRegistry registry) {
        this.registry = registry;
    }

    @PostConstruct
    private void init() {
        requestErrorCount = registry.counter("requests_error_total", "status", "error");
        orderCount = registry.counter("order_request_count", "order", "test-svc");
        amountSum = registry.summary("order_amount_sum", "orderAmount", "test-svc");
        failCaseNum = registry.gauge("fail_case_num", new AtomicInteger(0));
    }

    public Counter getRequestErrorCount() {
        return requestErrorCount;
    }

    public Counter getOrderCount() {
        return orderCount;
    }

    public DistributionSummary getAmountSum() {
        return amountSum;
    }

    public AtomicInteger getFailCaseNum() {
        return failCaseNum;
    }
}

四、GlobalExceptionHandler类

@ControllerAdvice
public class GlobalExceptionHandler {
    @Resource
    private PrometheusCustomMonitor monitor;

    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public String handle(Exception e) {
        monitor.getRequestErrorCount().increment();
        return "error, message: " + e.getMessage();
    }
}

五、TestController

@RestController
public class TestController {
    @Resource
    private PrometheusCustomMonitor monitor;

    @RequestMapping("/order")
    public String order(@RequestParam(defaultValue = "0") String flag) throws Exception {
        // 统计下单次数
        monitor.getOrderCount().increment();
        if ("1".equals(flag)) {
            throw new Exception("出错啦");
        }
        Random random = new Random();
        int amount = random.nextInt(100);
        // 统计金额
        monitor.getAmountSum().record(amount);

        monitor.getFailCaseNum().set(amount);
        return "下单成功, 金额: " + amount;
    }
}

测试:

启动springboot服务,,访问http://localhost:8089/order和http://localhost:8089/order?flag=1模拟下单成功和失败的情况
然后我们访问http://localhost:8088/actuator/prometheus,可以看到我们自定义指标已经被 /prometheus 端点暴露出来


# TYPE order_request_count_total counter
order_request_count_total{application="springboot2-prometheus",order="test-svc",} 34.0
# HELP jvm_threads_daemon_threads The current number of live daemon threads
# TYPE jvm_threads_daemon_threads gauge
jvm_threads_daemon_threads{application="springboot2-prometheus",} 18.0
# HELP jvm_classes_loaded_classes The number of classes that are currently loaded in the Java virtual machine
# TYPE jvm_classes_loaded_classes gauge
jvm_classes_loaded_classes{application="springboot2-prometheus",} 7250.0
# HELP order_amount_sum_max  
# TYPE order_amount_sum_max gauge
order_amount_sum_max{application="springboot2-prometheus",orderAmount="test-svc",} 97.0
# HELP order_amount_sum  
# TYPE order_amount_sum summary
order_amount_sum_count{application="springboot2-prometheus",orderAmount="test-svc",} 34.0
order_amount_sum_sum{application="springboot2-prometheus",orderAmount="test-svc",} 1482.0

在grafana上配置自定义的监控参数

访问 http://localhost:3000/login ,初始账号/密码为:admin/admin

①、配置数据源
点击左侧齿轮Configuration中Add Data Source,会看到如下界面:
在这里插入图片描述
选择Prometheus 当做数据源,这里我们就配置一下Prometheus 的访问地址,点击 Save & Test
在这里插入图片描述

②、创建按监控Dashboard
点击导航栏上的 + 按钮,并点击Dashboard,将会看到类似如下的界面
在这里插入图片描述
点击+ Add new panel
在这里插入图片描述
最终效果:
在这里插入图片描述


http://www.niftyadmin.cn/n/5415154.html

相关文章

3.8Code

基于顺序存储结构的图书信息表的新图书的入库 #include<iostream> #include<stdlib.h> #include<string.h>typedef int status;#define OK 1using namespace std;typedef struct{char no[50];char name[50];float price; }Book;typedef struct{Book* elem;i…

网络协议学习DAY2--TCP通信

TCP发端&#xff1a; socket connect send recv close TCP收端&#xff1a; socket bind listen accept send recv 各函数资料&#xff1a; 1.connect int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 功能:…

剑指offer C ++双栈实现队列

1. 基础 队列:先进先出,即插入数据在队尾进行,删除数据在队头进行; 栈:后进先出,即插入与删除数据均在栈顶进行。 2. 思路 两个栈实现一个队列的思想:用pushStack栈作为push数据的栈,用popStack栈作为pop数据的栈。 只要是对队列进行push操作,就将数据push入pushSt…

[java] 23种设计模式之桥接模式

一、什么是桥接模式 桥接(Bridge)模式属于结构型设计模式。通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。把抽象(abstraction)与行为实现(implementation)分离开来&#xff0c;从而可以保持各部分的独立性以及应对它们的功能扩展。 二、适用场景 当一…

Xilinx 7系列 FPGA硬件知识系列(九)——FPGA的配置

目录 1 .1配置模式 1.1.1 主模式 1.1.2 从模式 1.2 7种配置模式 1.2.1 主串配置模式 1.2.2 从串配置模式 ​编辑1.2.3 主并配置模式 1.2.4 从并配置模式 1.2.5 JTAG配置模式 ​编辑1.2.6 主SPI配置模式 ​编辑1.2.7 主BPI配置模式 1.2.8 FPGA BPI加载时间…

数据结构---复杂度(1)

1.时间复杂度 衡量算法的好坏&#xff0c;使用大写的o来表示时间复杂度&#xff0c;通俗的讲&#xff0c;就是一个算法执行的次数&#xff1b; 时间复杂度就是数学里面的函数表达式&#xff1b;本质上是一个函数&#xff1b; 下面举几个例子&#xff1a; (1)这里的执行次数是…

【深入理解设计模式】享元设计模式

享元设计模式 概述 享元设计模式&#xff08;Flyweight Design Pattern&#xff09;是一种用于性能优化的设计模式&#xff0c;它通过共享尽可能多的相似对象来减少对象的创建&#xff0c;从而降低内存使用和提高性能。享元模式的核心思想是将对象的共享部分提取出来&#xff…

数据挖掘案例分析:从零售到医疗的深度探索

数据挖掘&#xff0c;作为一种从大量数据中提取有用信息和模式的过程&#xff0c;已经在各个领域得到了广泛的应用。以下&#xff0c;我们将通过几个具体的案例&#xff0c;深入剖析数据挖掘在实际业务中的应用及其带来的价值。 案例一&#xff1a;沃尔玛的“啤酒与尿布” 这…