『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.hqwc.cn/news/195266.html

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

相关文章

python-opencv 培训课程作业

python-opencv 培训课程作业 作业一&#xff1a; 第一步&#xff1a;读取 res 下面的 flower.jpg&#xff0c;读取彩图&#xff0c;并用 opencv 展示 第二步&#xff1a;彩图 -> 灰度图 第三步&#xff1a;反转图像&#xff1a;最大图像灰度值减去原图像&#xff0c;即可得…

基于Vue+SpringBoot的大病保险管理系统 开源项目

项目编号&#xff1a; S 031 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S031&#xff0c;文末获取源码。} 项目编号&#xff1a;S031&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统配置维护2.2 系统参保管理2.3 大…

lv11 嵌入式开发 ARM指令集中(伪操作与混合编程) 7

目录 1 伪指令 2 伪操作 3 C和汇编的混合编程 4 ATPCS协议 1 伪指令 本身不是指令&#xff0c;编译器可以将其替换成若干条等效指令 空指令NOP 指令LDR R1, [R2] 将R2指向的内存空间中的数据读取到R1寄存器 伪指令LDR R1, 0x12345678 R1 0x12345678 LDR伪指令可以将任…

各类语言真实性能比较列表

这篇文章是我所做或将要做的所有真实世界性能比较的索引。如果你对想要看到的其他真实世界案例有建议&#xff0c;请在评论中添加。 用例 1 — JWT 验证 & MySQL 查询 该用例包括&#xff1a; 从授权头部获取 JWT验证 JWT 并从声明中获取电子邮件使用电子邮件执行 MySQL…

AI实践与学习1_Milvus向量数据库实践与原理分析

前言 随着NLP预训练模型&#xff08;大模型&#xff09;以及多模态研究领域的发展&#xff0c;向量数据库被使用的越来越多。 在XOP亿级题库业务背景下&#xff0c;对于试题召回搜索单单靠着ES集群已经出现性能瓶颈&#xff0c;因此需要预研其他技术方案提高试题搜索召回率。…

Fibonacci 数列与黄金分割

mapp[1 for item in range(30)] for item in range(3,30):mapp[item]mapp[item-1]mapp[item-2]pass numint(input()) if num>19:print("0.61803399")pass else:anss float((mapp[num]*1.0) / (mapp[num 1]*1.0))print(format(anss,.8f))进行短程的打表就可以看出…

hypermesh常用快捷键

#hypermesh常用快捷键

【Linux】-进程间通信-命名管道文件(没有关系的进程间进行通信),以及写一个日志模板

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

mfc140.dll是什么文件?如何修复mfc140.dll丢失的方法分享

​mfc140.dll丢失的原因 未正确安装Microsoft Visual C Redistributable&#xff1a;mfc140.dll是Visual C库的一部分&#xff0c;如果没有正确安装Visual C Redistributable&#xff0c;可能导致mfc140.dll丢失。 系统文件损坏&#xff1a;由于病毒感染、系统错误或其他原因…

Spring Cloud学习(十)【Elasticsearch搜索功能 分布式搜索引擎02】

文章目录 DSL查询文档DSL查询分类全文检索查询精准查询地理坐标查询组合查询相关性算分Function Score Query复合查询 Boolean Query 搜索结果处理排序分页高亮 RestClient查询文档快速入门match查询精确查询复合查询排序、分页、高亮 黑马旅游案例 DSL查询文档 DSL查询分类 …

C语言入门笔记—static、extern、define、指针、结构体

一、static static修饰局部变量的时候&#xff0c;局部变量出了作用域&#xff0c;不销毁。本质上&#xff0c;static修饰局部变量的时候&#xff0c;改变了变量的存储位置。详见下图&#xff0c;当a不被static修饰和被static修饰的时候。 C/C static关键字详解&#xff…

Idea远程debug

Idea远程debug 一、方法 1.1、启动时加参数 java -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 -jar remote-debug-0.0.1-SNAPSHOT.jar1.2、运行时加参数 在没有显式-agentlib:jdwp参数的情况下进行远程调试&#xff1a; 首先&#xff0c;确保您的Sprin…