SpringBoot——指标监控,自定义指标监控

news2025/7/18 7:57:03

为什么要进行指标监控?

在微服务架构中多个组件部署以后,我们需要能够监控到每个组件的健康情况,因此SpringBoot抽取了Actuator用于监控组件。

1.Java自带的监控工具(不推荐)

步骤: win+r输入cmd 回车 进入命令提示符窗口 输入 jconsole 进入Java提供的监控平台
选择启动的项目 -->连接
在这里插入图片描述
若出现该界面 选择 不安全的连接
在这里插入图片描述
查看程序相关性能参数
在这里插入图片描述

2.使用SpringBoot提供的Actuator使用(推荐)

2.1 引入依赖

<!--        引入监控功能-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

2.2 yml配置文件

management:
  endpoints:
    enabled-by-default: false # 默认开启所有监控端点
    web:
      exposure:
        include: '*' # 以web方式暴露所有端点
  endpoint:
    health:
      show-details: always #总是显示详细信息
      enabled: true
    info:
      enabled: true
    beans:
      enabled: true
    metrics:
      enabled: true

2.3 浏览器访问Actuator

http://localhost:8080/actuator
查看组件监控(笔者此处安装了json格式化插件,读者需要自行百度配置)
在这里插入图片描述
若需要查看其他监控直接访问其中href指向地址即可
eg:http://localhost:8080/actuator/metrics
在这里插入图片描述

3.自定义健康指标

3.1定制健康监控

在日常监控中除了actuator自带监控的信息外,我们还需要自定义监控其他信息如何实现?定制健康健康。编写类自定义模拟监控mongodb健康

@Component//将组件放到容器中
public class MyComHealthIndicator extends AbstractHealthIndicator {
    /**
     * 真实的检查方法
     * @param builder
     * @throws Exception
     */
    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        //mongodb 获取链接测试
        Map<String,Object> map = new HashMap<>();
        if (1 == 1){//模拟成功
//            builder.up();
            builder.status(Status.UP);//返回健康信息
            map.put("count",1);//假如此处监控mangodb查询了几行数据
            map.put("ms",100);//模拟耗费了多少毫秒
        }else {
//            builder.down();
            builder.status(Status.OUT_OF_SERVICE);
            map.put("err","连接超时");
            map.put("ms",3000);
        }
        builder.withDetail("code",100)
                .withDetails(map);//模拟状态码
    }
}

运行程序查看健康监控
eg访问:http://localhost:8080/actuator/health
在这里插入图片描述

4.自定义info信息指标

4.1 方式一:自定义info信息

yml配置文件编写info信息 并 开启info的env功能

  info:
    env:
      enabled: true
info:
  appName: boot-admin
  appVersion: 1.0.0
  mavenProjectName: @project.artifactId@  #使用@@可以获取maven的pom文件值
  mavenProjectVersion: @project.version@

网页访问:http://localhost:8080/actuator/info
在这里插入图片描述

4.2 方式二:定制info信息

@Component
public class AppAdminInfoContributor implements InfoContributor {
    @Override
    public void contribute(Info.Builder builder) {
        builder.withDetail("msg","你好")
                .withDetails(Collections.singletonMap("key", "value"));
    }
}

结果
在这里插入图片描述

5.自定义Metrics信息指标

在需要被监听的类中编写业务逻辑,实现saveUser方法调用一次进行一次计数
编写重载Java类加入MeterRegistry 参数,内部对该参数进行操作

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    Counter counter;
    public UserServiceImpl(MeterRegistry meterRegistry){//该注册中心统计saveUser方法被调用的次数
         counter = meterRegistry.counter("userService.saveUser.count");//注册新的指标项
    }
    public void saveUser(){
        counter.increment();//该方法每被调用一次就会增加counter值
    }
}

注:下图笔者为了方便截图将自定义metric名字前加了一个a
在这里插入图片描述
进入访问:http://localhost:8080/actuator/metrics/auserService.saveUser.count查看我们定义的count参数和值
在这里插入图片描述

6.自定义 定制端点(完整的EndPoint)

需求:现在我们需要在项目中引入docker操作的相关端点,如何配置监控?
编写Java类

@Component
@Endpoint(id = "container")//自定义端点名
public class DockerEndpoint {
    @ReadOperation//标注此处为一个端点的读操作
    public Map getDockerInfo(){//此方法等价为一个属性,不能传参
        return Collections.singletonMap("info","docker started...");
    }
    @WriteOperation//标注此端点为一个写操作
    private void stopDocker(){
        System.out.println("docker stop....");
    }
}

访问端点地址:http://localhost:8080/actuator
在这里插入图片描述
查看到我们自定义的端点
进入端点查看详细信息:http://localhost:8080/actuator/container
在这里插入图片描述

7.使用开源项目可视化指标监控

官方文档:https://codecentric.github.io/spring-boot-admin/2.5.1/#getting-started

7.1 搭建可视化监控项目

新建项目boot-05-adminserver
在这里插入图片描述
勾选spring web
在这里插入图片描述
引入依赖

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.5.1</version>
</dependency>

主配置中加入注解@EnableAdminServer开启服务监控功能

@EnableAdminServer
@SpringBootApplication
public class Boot05AdminserverApplication {
    public static void main(String[] args) {
        SpringApplication.run(Boot05AdminserverApplication.class, args);
    }
}

配置文件中修改端口防止与其他项目冲突

server.port=8888

运行项目可以查看可视化监控界面
在这里插入图片描述

7.2 将需要监控的应用配置给可视化监控程序

在需要被监控的boot-05-web-admin应用程序中引入依赖
在这里插入图片描述
引入依赖

<dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>2.5.1</version>
        </dependency>

配置文件中配置可视化监控程序地址+端口号

spring:
  boot:
    admin:
      client:
        url: http://localhost:8888
spring:
  application:
    name: boot-05-web-admin # 给程序命名       

查看可视化监控程序

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

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

相关文章

广告机联物联卡联网的优势?

广告机联物联卡联网的优势&#xff1f; 随着技术的发展、物联网技术的应用、物联网卡的授权&#xff0c;广告模式也在悄然发生变化&#xff0c;从传统的电视、报纸、杂志等广告模式逐渐转变为建筑之间的广告机。最常见的是地铁、公交车等公共区域设置的广告机或广告屏幕。 一…

67. SAP ABAP 监控用户事物码和程序执行的工具介绍

本文咱们不谈 ABAP 代码编写,而是介绍 SAP ABAP 系统里,如果想查找某个用户在某个时间段之内,在系统干了哪些事情,应该具体如何去做,SAP 又是提供了哪些工具来满足这种监控需求。 本文写作动机来源于一位朋友向我发起的咨询: 我们抛开 SAPGUI Script 这个因素不谈,本文…

第七章《Java的异常处理》第2节:异常的分类及处理方法

异常可以分为多种类型,Java语言允许程序员使用不同的方式来处理不同种类的异常,这样可以实现对异常的精细化处理。 7.2.1异常的分类 7.1小节中提到Exception是用来表示异常的类,但Exception并非Java语言中唯一用来表示异常的类,它只是庞大的异常类家族中的一员。下图7-7就…

[附源码]java毕业设计游戏网站设计

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

第八章 动态规划 5 AcWing 1591. 快速排序

第八章 动态规划 5 AcWing 1591. 快速排序 原题链接 AcWing 1591. 快速排序 算法标签 DP 思路 直接枚举a[i]之前所有元素与a[i]之后所有元素 判断 时间复杂度 O(N2)O(1010)O(N^2)O(10^{10})O(N2)O(1010) 超时 a[i]之前所有元素小于a[i] &#xff0c;即小于a[i]之前所有元…

YOLO算法(You Only Look Once)系列讲解与实现(待完善)

文章目录前言一、指标分析1.mAP (mean Average Precision)2.IOU二、YOLO1.YOLO-v1&#xff08;1&#xff09;步骤&#xff08;2&#xff09;网络结构&#xff08;3&#xff09;损失函数&#xff08;4&#xff09;存在问题2.YOLO-v2&#xff08;1&#xff09;新的尝试-Better&am…

Pod的生命周期

Pod的生命周期 与容器一样&#xff0c;Pod也有生命周期&#xff0c;Pod在整个生命周期中被定义为各种状态。了解这些状态对于后面我们学习Pod的调度是有帮助的。 Pending 挂起状态&#xff0c;Pod已经被K8s系统所认可&#xff0c;但是目前还有一个或多个容器镜像还没有被创建&…

Git错误:Incorrect username or password (access token)

目录 问题描述&#xff1a; 解决办法&#xff1a; 步骤一&#xff1a;进入电脑控制界面 步骤二&#xff1a;进入用户账户 步骤三&#xff1a;管理你的凭据 步骤四&#xff1a;选择Windows凭据 步骤五&#xff1a;找到gitee 步骤六&#xff1a;修改正确的用户名和密码 问…

【学习笔记23】JavaScript数组的遍历方法

笔记首发 1、forEach 语法: 数组.forEach(function(item, index, origin){})参数&#xff1a; item: 数组实际每一项的值index: 数组每一项对应的下标origin:原数组 作用: 遍历数组返回值: 返回值是undefined&#xff0c;哪怕你手写了return&#xff0c;也是undefined var arr…

springboot 使用shiro集成阿里云短信验证码

目录 1.阿里云短信验证码服务 2.发送短信验证码 3.多个realm配置 4.验证短信验证码 5.一些拓展思路 引言&#xff1a;短信验证码是通过发送验证码到手机的一种有效的验证码系统&#xff0c;主要用于验证用户手机的合法性及敏感操作的身份验证。在注册和修改密码时需要用到…

手摸手教会你在idea中配置Tomcat进行servlet/jsp开发(多图超详)

1. 下载安装idea&#xff0c;创建project&#xff0c;如果没有JDK可以通过idea指定文件夹并下载JDK。工程就是普通的Java工程&#xff0c;名字为webdemo 2.因为是Web项目&#xff0c;所以要对这个普通的项目进行WEB扶持^^&#xff0c;在项目名称webdemo上右键单间选择菜单项&qu…

Hive搭建

Hive系列第二章 第二章 Hive搭建 2.1 MySQL5.6安装 1、检查删除已有的 有就删除&#xff0c;没有就不用管。 rpm -qa | grep mysql rpm -e mysql-libs-5.1.73-8.el6_8.x86_64 --nodepsrpm -qa | grep mariadb rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_642、删除mysql分…

Windows下Labelimg标注自己的数据集使用(Ubuntu18.04)Jetson AGX Orin进行YOLO5训练测试完整版教程

一、环境配置介绍 整个实现过程所涉及的文件目录&#xff0c;其中&#xff0c;自备表示自己需要准备的&#xff0c;生成表示无需自己准备。 使用yolov5时出现“assertionerror:no labels found in */*/*/JPEGImages.cache can not train without labels”问题 很多朋友都会遇…

SpringBoot+Vue项目医疗管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

待办事项是什么意思,怎么用?

待办事项是什么意思&#xff0c;为什么要用&#xff1f;待办事项工具怎么设置&#xff1f;这里一文给你讲清&#xff01; 废话不多说&#xff0c;下面直接教你&#xff1a;梳理待办事项清单的方法&#xff0c;以及待办工具的操作实操步骤。想要快速提升工作效率的小伙伴&#…

第三十七篇 Vue中封装Swiper组件

在上一篇内容的结尾讲到了将swiper初始化从mounted生命周期转移到updated中来能够让swiper动起来&#xff0c;但同时是否会造其他的一个问题&#xff1f;什么问题呢&#xff1f;在每次data中的状态发什么改变&#xff0c;updated中的内容会又重新执行&#xff0c;这样会导致swi…

二维数组与二级指针是好朋友吗?

抛出问题 有一个二维数组&#xff0c;我想把它传给一个函数。于是我把函数接口定义出来了&#xff0c;如下&#xff1a; int array[2][3] {1,2,3,4,5,6}; void fun(int **array) {array[0][0] 5; } 当我试图直接把数组名传给函数时候&#xff0c;fun(array)编译会报错&…

C++ 中explicit的作用及用法

目录 Cexplicit&#xff08;官网的说法&#xff09; Cexplicit 清楚的说法&#xff08;建议英文不好的从这里开始食用哦&#xff09; Cexplicit使用的例子&#xff08;建议喜欢自己敲代码实验的从这里开始食用哦&#xff09; 总结 Cexplicit&#xff08;官网的说法&#xff…

神经网络和深度学习-梯度下降Gradient Descent(下)

梯度下降gradient descent 我们接着用数学公式来看一下梯度下降 首先是梯度 ∂cos⁡t∂ω\frac{\partial \cos t}{\partial \omega} ∂ω∂cost​ 然后我们对权重进行更新 ωω−α∂cos⁡t∂ω\omega\omega-\alpha \frac{\partial \cos t}{\partial \omega} ωω−α∂ω∂c…

python基础之容器类型公共方法

文章目录一、简介1.高级数据类型的公共方法&#xff1a;2.python的内置函数&#xff1a;3.python包含的内置函数&#xff1a;二、遍历字典的列表一、简介 1.高级数据类型的公共方法&#xff1a; 列表元组字典或者字符串都能够共同使用的方法&#xff1b; 2.python的内置函数…