SpringBoot 项目健康检查与监控

2023-11-10

转载:https://www.cnblogs.com/javanoob/p/springboot_healthcheck.html

前言

You build it,You run it, 当我们编写的项目上线后,为了能第一时间知晓该项目是否出现问题,常常对项目进行健康检查及一些指标进行监控。
Spring Boot-Actuator 就是帮助我们监控我们的Spring Boot 项目的。

使用

Spring Boot 最主要的特性就是AutoConfig(自动配置),而对于我们这些使用者来说也就是各种starter,
Spring Boot-Actuator 也提供了starter,为我们自动配置,在使用上我们只需要添加starter到我们的依赖中,然后启动项目即可。

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

常用Endpoint

Spring Boot-actuator,提供了许多有用的EndPoint,对Spring Boot应用提供各种监控,下面说一下我常用的EndPoint:

/health 应用的健康状态
/configprops 获取应用的配置信息,因为Spring Boot 可能发布时是单独的Jar包,配置文件可能包含其中, 当我们需要检查配置文件时可以使用 ConfigpropsEndPoint 进行查看一些配置是否正确。
/trace 最近几次的http请求信息

HealthEndPoint

当我们访问 http://localhost:8088/health 时,可以看到 HealthEndPoint 给我们提供默认的监控结果,包含 磁盘检测和数据库检测。

{
    "status": "UP",
    "diskSpace": {
        "status": "UP",
        "total": 398458875904,
        "free": 315106918400,
        "threshold": 10485760
    },
    "db": {
        "status": "UP",
        "database": "MySQL",
        "hello": 1
    }
}

其实看 Spring Boot-actuator 源码,你会发现 HealthEndPoint 提供的信息不仅限于此,org.springframework.boot.actuate.health 包下 你会发现 ElasticsearchHealthIndicator、RedisHealthIndicator、RabbitHealthIndicator 等
也就是 HealthEndPoint 也提供 ES, Redis 等组件的健康信息。

自定义Indicator 扩展 HealthEndPoint

看源码 其实 磁盘和数据库健康信息就是 DiskSpaceHealthIndicator、DataSourceHealthIndicator 来实现的,当我们对一些我们自定义的组件进行监控时, 我们也可以实现个Indicator :

@Component
public class User implements HealthIndicator {
    /**
     * user监控 访问: http://localhost:8088/health
     *
     * @return 自定义Health监控
     */
    @Override
    public Health health() {

        return new Health.Builder().withDetail("usercount", 10) //自定义监控内容
                .withDetail("userstatus", "up").up().build();
    }
}

这时我们再次访问: http://localhost:8088/health 这时返回的结果如下,包含了我们自定义的 User 健康信息。

{
    "status": "UP",
    "user": {
        "status": "UP",
        "usercount": 10,
        "userstatus": "up"
    },
    "diskSpace": {
        "status": "UP",
        "total": 398458875904,
        "free": 315097989120,
        "threshold": 10485760
    },
    "db": {
        "status": "UP",
        "database": "MySQL",
        "hello": 1
    }
}

自定义EndPoint

其实除了扩展 HealthEndPoint 来添加一些健康检查, 我们也可以自定定义一些EndPoint 来提供程序运行时一些信息的展示:

@Configuration
public class EndPointAutoConfig {
    @Bean
    public Endpoint<Map<String, Object>> customEndPoint() {
        return new SystemEndPoint();
    }
}


@ConfigurationProperties(prefix="endpoints.customsystem")
public class SystemEndPoint extends AbstractEndpoint<Map<String, Object>> {

    public SystemEndPoint(){
        super("customsystem");
    }
    @Override
    public Map<String, Object> invoke() {
        Map<String,Object> result= new HashMap<>();
        Map<String, String> map = System.getenv();
        result.put("username",map.get("USERNAME"));
        result.put("computername",map.get("COMPUTERNAME"));
        result.put("userdomain",map.get("USERDOMAIN"));
        return result;
    }
}

访问 http://localhost:8088/customsystem 来查看我们自定义的EndPoint ,返回结果如下:


{
    "username": "xxx",
    "userdomain": "DESKTOP-6EAN1H4",
    "computername": "DESKTOP-6EAN1H4"
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot 项目健康检查与监控 的相关文章

  • 在 String 值之后打印 int 值

    我有以下示例代码 int pay 80 int bonus 65 System out println pay bonus bonus pay 有人可以向我解释一下为什么我得到以下输出 145 6580 您的代码正在从左到右解释表达式 pa
  • Selenium:将 Internet Explorer 中的文件下载到指定文件夹,无需直接链接,无需 Windows 窗体,无需 AutoIt 或 Robot

    我经常遇到一个问题 如何在 IE 中下载文件 与 Firefox 的 Chrome 不同 您不能只指定所需的文件夹 所有文件都会下载到该文件夹 您还需要与本机 Windows 表单等进行交互 有多种选项 例如使用 AutoIt 使用键盘命令
  • 如何在ArrayList中的特定位置插入对象

    假设我有一个大小为 n 的对象的 ArrayList 现在我想在特定位置插入另一个对象 假设在索引位置 k 大于 0 且小于 n 并且我希望索引位置 k 处及其之后的其他对象向前移动一个索引位置 那么有没有什么方法可以直接在Java中做到这
  • 将处理项目移至 Eclipse

    我已经在处理项目上工作了一段时间 现在想将其移至 Eclipse 中 我已经在 Eclipse 环境中安装了 Proclipse 我有很多扩展名为 pde 的文件 然而 Proclipse 文件都以 java 结尾 所有 pde 文件都存在
  • Java,顺序流在哪个线程中执行?

    在阅读有关流的文档时 我遇到了以下句子 attempting to access mutable state from behavioral parameters presents you with a bad choice if you
  • Java 小程序在 Mac 上闪烁

    这个问题很奇怪 问题并非在每个平台上都会发生 我在使用 MacOSX 的 Google Chrome 中出现了这种情况 但在 Safari 中却没有出现这种情况 对于使用 Windows 的朋友来说 在 Google Chrome 上运行得
  • JAXB 继承冲突 - 重新注释子类

    目前我的项目中有这样的环境 public abstract class Foo private List
  • Spring HATEOAS 和 HAL:更改 _embedded 中的数组名称

    我正在尝试使用 Spring HATEOAS 构建符合 HAL 的 REST API 经过一番摆弄后我终于开始工作了mostly正如预期的那样 示例 输出现在看起来像这样 links self href http localhost 808
  • 在拇指上方显示修改后的 JSlider 值

    有没有一种简单的方法可以在使用某些 外观和感觉 的同时更改 JSlider 上方标签中显示的值 为了清楚起见 我正在谈论这个值 具体来说 我想显示除以 1000 的值而不是值本身 我知道如果我显示它们 我可以为刻度设置标签 但用户将不得不猜
  • Java 中如何验证字符串的格式是否正确

    我目前正在用 Java 编写一个验证方法来检查字符串是否是要更改为日期的几种不同格式之一 我希望它接受的格式如下 MM DD YY M DD YY MM D YY 和 M D YY 我正在测试第一种格式 每次它都告诉我它无效 即使我输入了有
  • 避免 @Secured 注释的重复值

    我正在尝试使用以下方法来保护我的服务方法 Secured如下 public interface IUserService Secured ROLE ROLE1 ROLE ROLE2 ResponseEntity saveUser Creat
  • ActiveMQ JNDI 查找问题

    尝试使用 JNDI 运行以下 ActiveMQ http activemq apache org jndi support html http ActiveMQ 20JNDI 并且我的 jboss server node lib 文件夹中有
  • 了解Kafka流groupBy和window

    我无法理解 kafka 流中的 groupBy groupById 和窗口的概念 我的目标是聚合一段时间内 例如 5 秒 的流数据 我的流数据看起来像 value 0 time 1533875665509 value 10 time 153
  • Java HashSet 是线程安全的只读吗?

    如果我通过 Collections unmodifyingSet 运行 HashSet 实例后 它是线程安全的吗 我问这个是因为 Set 文档声明它不是 但我只是执行读取操作 来自 Javadoc 请注意 此实现不是同步的 如果多个线程同时
  • 无法连接到docker中的elasticsearch容器

    我正在尝试使用 docker 的官方 elasticsearch 镜像 我遵循了本指南 https www elastic co guide en elasticsearch reference current docker html但是当
  • 如何使用eclipse调试JSP tomcat服务?

    我想使用 Eclipse IDE 调试器来调试单独运行的 JSP Struts Tomcat Hibernate 应用程序堆栈 如何设置 java JVM 和 eclipse 以便设置断点 监视变量值并查看当前正在执行的代码 我刚刚用谷歌搜
  • 使用 Java 8 Spring 4 + MyBatis 集成问题

    使用 Java 8 1 8 0 60 Spring 4 2 1 和 MyBatis 3 3 0 时遇到以下异常 Sep 29 2015 11 02 58 AM org springframework context annotation A
  • 从 InputStream 中删除换行符

    我喜欢从一个文件中删除所有换行符 对于 n 和 r n java io InputStream 在读取文件时 相应的方法如下所示 param target linkplain File return linkplain InputStrea
  • com.sun.xml.ws.message.saaj.SAAJHeader 无法转换为 com.sun.xml.ws.security.opt.impl.outgoing.SecurityHeader

    我正在尝试访问第三方 Web 服务 该服务要求我创建一个传递时间信息 用户名和密码的安全标头 我在网上搜索了可行的示例 并尝试了多种方法 我正在尝试使用 Java 6 中内置的内容来做到这一点 我不确定我做错了什么 从 WSDL 生成 We
  • 如何在J2ME中获取数字的幂[重复]

    这个问题在这里已经有答案了 可能的重复 J2ME power double double 数学函数实现 https stackoverflow com questions 2076913 j2me powerdouble double ma

随机推荐

  • 创建jira plugin插件、创建jira实例生成jar包总结

    创建jira plugin插件 创建jira实例生成jar包总结 创建插件骨架 在本地安装完Atlassian SDK后 需注意将环境变量里的maven路径更改为sdk里自带的maven仓库路径 进入Atlassian的bin目录下 在此路
  • unity导入的模型无法编辑材质球属性

    有时候美术做好的模型导入到unity 发现无法编辑材质的shader 如图 选中对应的模型 在inspector面板上更改一个设置 一般就可以了 将location从use embedded materials 改成use external
  • Java原始客户端操作Mongodb 增删改查

    Document方式操作增删改查 1 导入Pom依赖 2 java客户端代码 1 导入Pom依赖
  • 全面理解网络流中的最大流问题

    网络流 最大流问题 前序 在将网络里实现算法之前 我们得聊聊网络流究竟是个什么东西 毕竟只有知道它的样貌 才能继续看懂下面的定义 对吧 首先 网络流不仅仅指的是什么FF算法 dinic算法 算法只是用来解决问题的 稍后我们会更加能体会这一点
  • 移动构造-C++11

    移动构造 移动构造是C 11标准中提供的一种新的构造方法 在现实中有很多这样的例子 我们将钱从一个账号转移到另一个账号 将手机SIM卡转移到另一台手机 将文件从一个位置剪切到另一个位置 移动构造可以减少不必要的复制 带来性能上的提升 有些复
  • 查询每门课程成绩都大于80分学生的姓名

    转载的sql语句 1 查询每门课程成绩都大于80分学生的学号 数据库 表 student name score course A 85 语文 A 75 数学 A 82 英语 B 75 语文 B 89 数学 B 79 英语 天使美眉90 语文
  • Flutter报错之Waiting for another flutter command to release the startup lock解决方案

    问题引入 通过命令行执行 flutter devices 或其他flutter命令时 报错如下 Waiting for another flutter command to release the startup lock 解决方案 关闭A
  • 不用看网课就能学到python的文章(第一天)

    为什么要学python 在大数据时代 抖音快手火爆全球 作业帮小猿搜题的数据库 都离不开大数据 大数据的科学计算 最重要的语言就是python 网络爬虫 网络爬虫 搜狗百科 搜索引擎等等也主要是python 包括一些游戏图像等等都缺少不了p
  • Windows7在Eclipse中配置Python+OpenCV

    1 从http www oracle com technetwork java javase downloads jdk 7u2 download 1377129 html下载jdk 7u2 windows i586 exe 安装到D Pr
  • 简单介绍Roop(类似SimSwap)项目

    文章目录 一 关于Roop 二 安装Roop CPU 2 1 克隆仓库 2 2 设置python国内源 2 2 检查安装virtualenv 2 3 创建项虚拟环境 2 5 安装项目依赖 2 6 下载必要文件 三 运行Roop CPU 四
  • 论文解读《SOLO: Segmenting Objects by Locations》

    实例分割属于比较challenging的任务 他相当于是object detection和semantic segmentation的结合体 在SOLO出现之前 有两种常用的paradigm 1 top down 先进行目标检测 再对检测框
  • mysql中TINYINT的取值范围

    项目场景 最近在开发过程中 看见表设计中是thinyint字段 但对于它的范围产生了好奇 问题描述 当我们填写超过128数值的时候 该字段就会报以下错误 Cause com mysql jdbc MysqlDataTruncation Da
  • 62_Pandas有条件地提取 pandas.DataFrame 的行

    62 Pandas有条件地提取 pandas DataFrame 的行 使用query 方法根据pandas DataFrame的列值的条件提取行 它很方便 因为您可以使用比较运算符和字符串方法以及多个条件的组合来简洁地描述条件规范 目录
  • -bash: /etc/profile: line 11: syntax error near unexpected token `$'{\r''报错问题解决

    在Linux系统配置Java环境变量之后执行 source etc profile指令报 bash etc profile line 11 syntax error near unexpected token r 如下图 错误提示信息已经反
  • dlmalloc解析连载一

    dlmalloc是目前一个十分流行的内存分配器 其由Doug Lea 主页为 http gee cs oswego edu 从1987年开始编写 到目前为止 最新版本为2 8 3 可以从 ftp g oswego edu pub misc
  • 对计算机硬件维护的方法,计算机硬件维护方法

    计算机硬件维护方法 随着科技的不断发展 计算机应用率越来越高 在社会生活的各个领域均有广泛的应用 下面是小编分享的计算机硬件维护方法 一起来看一下吧 计算机常见的硬件故障主要包括内存条损坏 主板元器件损坏 硬盘损坏等 计算机硬件出现故障 一
  • 黑马程序员--分布式搜索ElasticSearch学习笔记

    写在最前 黑马视频地址 https www bilibili com video BV1LQ4y127n4 想获得最佳的阅读体验 请移步至我的个人博客 SpringCloud学习笔记 消息队列MQ学习笔记 Docker学习笔记 分布式搜索E
  • CENTOS环境Apache最新版本httpd-2.4.54编译安装

    一 下载 Apache至少需要apr apr util pcre组件的支持 cd usr local src wget http dlcdn apache org apr apr 1 7 0 tar gz wget http dlcdn a
  • 微信小程序心得体会

    1 微信小程序诞生的前景 1 受到手机内存的限制 用户无法下载诸多app 2 用户为了简洁性不愿意下载app 3 微信用户的日益增加 2 微信小程序的特点 微信小程序的理念是 触手可及 用完即走 是一种不需要下载安装即可使用的应用 一次开发
  • SpringBoot 项目健康检查与监控

    转载 https www cnblogs com javanoob p springboot healthcheck html 前言 You build it You run it 当我们编写的项目上线后 为了能第一时间知晓该项目是否出现问