『Spring Boot Actuator Spring Boot Admin』 实现应用监控管理

前言

本文将会使用 Spring Boot Actuator 组件实现应用监视和管理,同时结合 Spring Boot Admin 对 Actuator 中的信息进行界面化展示,监控应用的健康状况,提供实时警报功能

Spring Boot Actuator

简介

官方文档:Production-ready Features (spring.io)

Actuator 的核心是端点(Endpoint),它用来监视、提供应用程序的信息,Spring Boot 提供的 spring-boot-actuator 组件中已经内置了非常多的 Endpointhealth、info、beans、metrics、httptrace、shutdown 等),每个端点都可以启用和禁用。Actuator 也允许我们扩展自己的端点。通过 JMX 或 HTTP 的形式暴露自定义端点

注:查看全部 Endpoints 请参照上方的官方文档

Actuator 会将自定义端点的 ID 默认映射到一个带 /actuator 前缀的 URL。比如,health 端点默认映射到 /actuator/health。这样就可以通过 HTTP 的形式获取自定义端点的数据,许多网关作为反向代理需要 URL 来探测后端集群应用是否存活,这个 URL 就可以提供给网关使用

启动端点

默认情况下,除shutdown之外的所有终结点都处于启用状态。若要配置终结点的启用,请使用其  management.endpoint.<id>.enabled  属性。以下示例启用终结点  shutdown

management:endpoint:shutdown:enabled: true

如果您希望端点启用选择加入而不是选择退出,请将该  management.endpoints.enabled-by-default  属性设置为  false  并使用单个端点  enabled  属性选择重新加入。以下示例启用该  info  终结点并禁用所有其他终结点:

management:endpoints:enabled-by-default: falseendpoint:info:enabled: true

注:禁用的端点将从应用程序上下文中完全删除。如果只想更改公开终结点的技术,请改用  include  和  exclude  属性。

公开端点

禁用的端点将从应用程序上下文中完全删除。如果只想更改公开终结点的技术,请改用 include 和 exclude 属性。若要更改公开的终结点,请使用以下特定于 include 技术的 exclude 属性

include 属性列出了公开的终结点的 ID。exclude 属性列出了不应公开的终结点的 ID。 exclude 属性优先于该 include 属性。您可以使用端点 ID 列表配置属性和 exclude 属性 include 。

例如,要仅通过 JMX 公开  health  和  info  端点,请使用以下属性

management:endpoints:jmx:exposure:include: "health,info"

*可用于选择所有端点。例如,若要通过 HTTP 公开除 env 和 beans 终结点之外的所有内容,请使用以下属性

management:endpoints:web:exposure:include: "*"exclude: "env,beans"

Actuator 同时还可以与外部应用监控系统整合,比如 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic 等。这些系统提供了非常好的仪表盘、图标、分析和告警等功能,使得你可以通过统一的接口轻松的监控和管理你的应用系统。这对于实施微服务的中小团队来说,无疑快速高效的解决方案

配置集成

首先我们需要创建 springboot web 项目,然后 pom.xml 中添加如下 actuator 依赖

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

配置 application.yml

server:port: 8080management:endpoints:enabled-by-default: falseweb:base-path: /manageexposure:include: 'info,health,env,beans'endpoint:info:enabled: truehealth:enabled: trueenv:enabled: truebeans:enabled: true

上述配置只暴露 info,health,env,beans 四个 endpoints, web 通过可以 /manage 访问

访问:localhost:8080/manage 查看所有开放的端点

{"_links": {"self": {"href": "http://localhost:8080/manage","templated": false},"beans": {"href": "http://localhost:8080/manage/beans","templated": false},"health": {"href": "http://localhost:8080/manage/health","templated": false},"health-path": {"href": "http://localhost:8080/manage/health/{*path}","templated": true},"info": {"href": "http://localhost:8080/manage/info","templated": false},"env": {"href": "http://localhost:8080/manage/env","templated": false},"env-toMatch": {"href": "http://localhost:8080/manage/env/{toMatch}","templated": true}}
}

访问:localhost:8080/manage/beans

image.png

拓展配置

安全性

当我们想要暴露更多接口,同时保证 endpoint 接口安全,可以与 Spring Security 集成

@Configuration(proxyBeanMethods = false)
public class MySecurityConfiguration {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests((requests) -> requests.anyRequest().hasRole("ENDPOINT_ADMIN"));http.httpBasic();return http.build();}}

此外,如果存在 Spring Security,同时你需要添加自定义安全配置,以允许对端点进行未经身份验证的访问,如以下示例所示

@Configuration(proxyBeanMethods = false)
public class MySecurityConfiguration {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.securityMatcher(EndpointRequest.toAnyEndpoint());http.authorizeHttpRequests((requests) -> requests.anyRequest().permitAll());return http.build();}}
跨域访问
management:endpoints:web:cors:allowed-origins: "https://example.com"allowed-methods: "GET,POST"
自定义端点

我们可以通过@JmxEndpoint or @WebEndpoint 注解来定义自己的 endpoint, 然后通过@ReadOperation, @WriteOperation 或者@DeleteOperation 来暴露操作

比如添加系统时间 date 的 endpoint

@RestController("custom")
@WebEndpoint(id = "date")
public class CustomEndpointController {@ReadOperationpublic ResponseEntity<String> currentDate() {return ResponseEntity.ok(LocalDateTime.now().toString());}
}
management:endpoints:enabled-by-default: falseweb:base-path: /manageexposure:include: 'info,health,env,beans,date'endpoint:info:enabled: truehealth:enabled: trueenv:enabled: truebeans:enabled: truedate:enabled: true
info 不显示

我们直接访问 info 接口是空的

问题出处官方文档:Production-ready Features (spring.io)

image.png

解决方案,修改 application.yml 如下

management:endpoint:info:env:enabled: true

Spring Boot Admin

简介

官方仓库:codecentric/spring-boot-admin

官方文档:Spring Boot Admin – (spring-boot-admin.com)

Spring Boot Admin(简称 SBA)由两部分组成:SBA Server 和 SBA Client

image.png

SBA Server: 包括 Admin 用户界面并独立运行于被监控应用

SBA Client: 提供一种方式将被监控应用注册到 SBA Server

SBA 分为服务端和客户端原理:因为 SBA 需要做集中化的监控(比如应用的集群,多个服务或者微服务等),而不是每个应用都需要有一个 UI。同时被监控的应用应该是和监控平台是分离的,并且需要考虑其他语言和其他平台的集成

除此之外,SBA Client 不仅只可以注册到 SBA Server ,还可以注册到 Spring Cloud Discovery(微服务),Python Applications Using Pyctuator(其他语言)等平台

启用 Server

pom.xml 配置

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

注意:这里我们必须添加 <version> 字段,因为父模块 spring-boot-starter-parent 中的 BOM(Bill of Material) 并没有配置 SBA 的 version,无法自动识别

通过 @EnableAdminServer 注解启用 SBA Server

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

访问:Spring Boot Admin

image.png

注册 Client

引入 SBA Client 依赖

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

配置 application.yml

server:port: 8080management:endpoints:enabled-by-default: falseweb:base-path: /manageexposure:include: 'info,health,env,beans'endpoint:info:env:enabled: trueenabled: truehealth:enabled: trueenv:enabled: truebeans:enabled: true
# 添加如下配置
spring:boot:admin:client:url: 'http://localhost:8080'

访问:Spring Boot Admin

image.png

之后点击进入实例,可以自行探索监控信息

image.png

其他问题

启用 JMX 管理

默认下 SBA 没有启用 JMX,需要通过如下配置启用。

首先需要引入 POM 依赖(PS:需要 SpringBoot2.2+ 版本)

<dependency><groupId>org.jolokia</groupId><artifactId>jolokia-core</artifactId>
</dependency>

yml 配置

spring:jmx:enabled: true
显示日志内容

默认下没有显示 Log File 的内容,如果需要显示 SpringBoot 应用日志需要进行如下配置(配置 logging.file.path 或者 logging.file.name)

logging:file:name: 'pdai-spring-boot-application.log'pattern:file: '%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx'
继承 Spring Security
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
@Configuration
public static class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().permitAll()  .and().csrf().disable();}
}
通知告警信息

集成 spring-boot-starter-mail 配置 JavaMailSender 来用邮件通知信息

官方文档对应链接:Spring Boot Admin – (spring-boot-admin.com)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>
spring:mail:host:smtp.example.comboot:admin:notify:mail:to:admin@example.com

注:更多通知方式(钉钉,微信等)可以直接参考上方官方文档

补充

在生产环境下,使用 Prometheus + Grafana 组合也是非常推荐的监控解决方案,这里篇章有限,读者可以自行探索

参考链接

  • SpringBoot 监控 - 集成 actuator 监控工具 | Java 全栈知识体系 (pdai.tech)
  • SpringBoot 监控 - 集成 springboot admin 监控工具 | Java 全栈知识体系 (pdai.tech)
  • 微服务系列:服务监控 Spring Boot Actuator 和 Spring Boot Admin - 掘金 (juejin.cn)
  • 实战:使用 Spring Boot Admin 实现运维监控平台-阿里云开发者社区 (aliyun.com)
  • Prometheus 快速入门教程(六):Spring Boot Actuator 实现应用监控
  • Prometheus简介 - prometheus-book (gitbook.io)

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

python算法例10 整数转换为罗马数字

1. 问题描述 给定一个整数&#xff0c;将其转换为罗马数字&#xff0c;要求返回结果的取值范围为1~3999。 2. 问题示例 4→Ⅳ&#xff0c;12→Ⅻ&#xff0c;21→XⅪ&#xff0c;99→XCIX。 3. 代码实现 def int_to_roman(num):val [1000, 900, 500, 400,100, 90, 50, 40…

蓝桥杯每日一题2023.11.19

题目描述 “蓝桥杯”练习系统 (lanqiao.cn) 题目分析 首先想到的方法为dfs去寻找每一个数&#xff0c;但发现会有超时 #include<bits/stdc.h> using namespace std; const int N 2e5 10; int n, cnt, a[N]; void dfs(int dep, int sum, int start) {if(dep 4){if(s…

SpirngBoot + Vue 前后端分离开发工具代码

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

软件测试技术之地图导航的测试用例

外观测试 屏幕显示不能有花屏、黑点和闪屏&#xff0c;清晰度、亮度、颜色要正常。 检测所有按键都能起到相应作用&#xff0c;是否手感不良。 UI显示状态、颜色、清晰度、效果。 控制&#xff1a;放大&#xff0c;缩小&#xff0c;音量调节功能测试。 交叉路口查询测试&am…

HAL库STM32串口开启DMA接收数据

STM32CubeMx的配置 此博客仅仅作为记录&#xff0c;这个像是有bug一样&#xff0c;有时候好使&#xff0c;有时候不好&#xff0c;所以趁现在好使赶紧记录一下&#xff0c;很多地方用到串口接收数据&#xff0c;DMA又是一种非常好的接收方式&#xff0c;可以节约CPU的时间&…

Redis(哈希Hash和发布订阅模式)

哈希是一个字符类型字段和值的映射表。 在Redis中&#xff0c;哈希是一种数据结构&#xff0c;用于存储键值对的集合。哈希可以理解为一个键值对的集合&#xff0c;其中每个键都对应一个值。哈希在Redis中的作用主要有以下几点&#xff1a; 1. 存储对象&#xff1a;哈希可以用…

米家竞品分析

一、项目描述 1. 竞品分析描述 分析市场直接竞品和潜在竞品&#xff0c;优化产品核心结构和页面布局&#xff0c;确立产品核心功能定位。了解目标用户核心需求&#xff0c;挖掘用户魅力型需求&#xff0c;以及市场现状为产品迭代做准备。 2. 产品测试环境 二、市场 1. 行业…

AI自动直播软件,ai无人直播工具2.0支持多平台矩阵直播一键同步直播脚本内容【直播脚本+使用技术教程】

AI实景直播软件简介&#xff1a; 支持一台手机自动直播&#xff0c;支持语音和文字同时回复&#xff0c;商品自动弹窗&#xff0c;支持抖音、快手、视频号、美团平台直播&#xff0c;支持矩阵直播&#xff0c;一键同步直播脚本内容。 设备需求&#xff1a; 安卓手机&#xf…

TensorRT量化实战课YOLOv7量化:YOLOv7-QAT量化

目录 前言1. YOLOv7-QAT流程2. QAT训练流程 前言 手写 AI 推出的全新 TensorRT 模型量化实战课程&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 该实战课程主要基于手写 AI 的 Latte 老师所出的 TensorRT下的模型量化&#xff0c;在其课程的基础上&#xff…

在做题中学习(30):字符串相加

思路&#xff1a; 相加时要转换成对应的数字&#xff0c;所以让字符数字-0 如‘9’-‘0’&#xff08;ASCII&#xff09;57-489 9110&#xff0c;会进1&#xff0c;把进位保存起来&#xff0c;只取0头插到新串里。 头插时要转换对应字符数字&#xff0c;所以让对应的数字‘…

数据结构:红黑树的插入实现(C++)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 一、红黑树二、红黑树的插入三、代码实现总结 一、红黑树 红黑树的概念&#xff1a; 红黑树是一颗二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&…

深入理解栈与队列:从基本概念到高级实现

&#x1f493; 博客主页&#xff1a;江池俊的博客⏩ 收录专栏&#xff1a;数据结构探索&#x1f449;专栏推荐&#xff1a;✅cpolar ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f525;编译环境&#xff1a;Visual Studio 2022&#x1f389;欢迎大…

golang中的并发模型

并发模型 传统的编程语言&#xff08;如C、Java、Python等&#xff09;并非为并发而生的&#xff0c;因此它们面对并发的逻辑多是基于操作系统的线程。其并发的执行单元&#xff08;线程&#xff09;之间的通信利用的也是操作系统提供的线程或进程间通信的原语&#xff0c;比如…

【Unity】单例模式及游戏声音管理类应用

【Unity】单例模式及游戏声音管理类应用 描述 在日常游戏项目开发中&#xff0c;单例模式是一种常用的设计模式&#xff0c;它允许在应用程序的生命周期中只创建一个对象实例&#xff0c;并提供对该实例的全局访问点。通过使用单例模式&#xff0c;可以提高代码的可维护性和可…

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷 2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B卷A模块基础设施设置/安全加固&#xff08;200分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows, Linux&#xff09;A-2&#…

Verilog基础:仿真时x信号的产生和x信号对于各运算符的特性

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 信号爆x也许是所有IC人的噩梦&#xff0c;满屏的红色波形常让人头疼不已&#xff0c;但x信号的产生原因却常常只有几种&#xff0c;只要遵循一定的代码规范&#…

超聚变服务器关闭超线程CPU的步骤(完整版)

前言: 笨鸟先飞&#xff0c;好记性不如烂笔头。 我们项目都用不到超线程CPU&#xff0c;所以调测设备的时候都需要关掉&#xff0c;最近新设备换成了超聚变的服务器&#xff0c;这篇记录我关闭&#xff08;超聚变&#xff09;服务器超线程CPU的方法步骤。 关闭超线程CPU的步骤…

JS-项目实战-鼠标悬浮变手势(鼠标放单价上生效)

1、鼠标悬浮和离开事件.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格…

基于单片机音乐弹奏播放DS1302万年历显示及源程序

一、系统方案 1、本设计采用51单片机作为主控器。 2、DS1302计时显示年月日时分秒。 3、按键可以弹奏以及播放音乐&#xff0c;内置16首音乐。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 /时钟显示**/ void init_1602_ds1302() { write…

机器学习-搜索技术:从技术发展到应用实战的全面指南

在本文中&#xff0c;我们全面探讨了人工智能中搜索技术的发展&#xff0c;从基础算法如DFS和BFS&#xff0c;到高级搜索技术如CSP和优化问题的解决方案&#xff0c;进而探索了机器学习与搜索的融合&#xff0c;最后展望了未来的趋势和挑战&#xff0c;提供了对AI搜索技术深刻的…