欢迎访问 生活随笔!

凯发k8官方网

当前位置: 凯发k8官方网 > 前端技术 > javascript >内容正文

javascript

springboot actuator-凯发k8官方网

发布时间:2024/10/8 javascript 0 豆豆
凯发k8官方网 收集整理的这篇文章主要介绍了 springboot actuator_spring boot 服务监控,健康检查,线程信息,jvm堆信息,指标收集,运行情况监控... 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
作者:richard_yi来源:http://39sd.cn/b2a0b

去年我们项目做了微服务1.0的架构转型,但是服务监控这块却没有跟上。这不,最近我就被分配了要将我们核心的微服务应用全部监控起来的任务。我们的微服务应用都是springboot 应用,因此就自然而然的想到了借助spring boot 的actuator 模块。

本篇是我在完成这个工单之后,对spring boot actuator模块 学习应用的总结。在本篇文章中,你可以学习到:

1、spring boot actuator 的快速使用入门2、spring boot actuator 的一些重要的endpoints的介绍3、如何通过actuator 模块实时查看当前应用的线程 dump信息4、如何通过actuator 模块实时查看当前应用的堆信息5、如何通过actuator 模块实时修改当前应用的日志打印等级6、...

之后我还会介绍:

todo:springboot 微服务应用集成prometheus grafana实现监控告警

一、什么是 spring boot actuator

spring boot actuator 模块提供了生产级别的功能,比如健康检查,审计,指标收集,http 跟踪等,帮助我们监控和管理spring boot 应用、bean加载情况、环境变量、日志信息、线程信息,jvm 堆信息等 。这个模块是一个采集应用内部信息暴露给外部的模块,上述的功能都可以通过http 和 jmx 访问。

因为暴露内部信息的特性,actuator 也可以和一些外部的应用监控系统整合(prometheus, graphite, datadog, influx, wavefront, new relic等)。这些监控系统提供了出色的仪表板,图形,分析和警报,可帮助你通过一个统一友好的界面,监视和管理你的应用程序。

actuator使用micrometer与这些外部应用程序监视系统集成。这样一来,只需很少的配置即可轻松集成外部的监控系统。

micrometer 为 java 平台上的性能数据收集提供了一个通用的 api,应用程序只需要使用 micrometer 的通用 api 来收集性能指标即可。micrometer 会负责完成与不同监控系统的适配工作。这就使得切换监控系统变得很容易。

对比 slf4j 之于 java logger 中的定位。

二、快速开始,创建一个spring boot actuator demo

我们先创建一个demo应用。

你可以通过spring boot cli 创建:

spring init -d=web,actuator -n=actuator-demo actuator-demo

或者通过spring initializr 创建:

对应的maven依赖:

...

org.springframework.boot

spring-boot-starter-actuator

...

对应的gradle 依赖:

dependencies {

compile("org.springframework.boot:spring-boot-starter-actuator")

}

三、endpoints 介绍

spring boot 提供了所谓的 endpoints (下文翻译为端点)给外部来与应用程序进行访问和交互。

打比方来说, /health 端点 提供了关于应用健康情况的一些基础信息。metrics 端点提供了一些有用的应用程序指标(jvm 内存使用、系统cpu使用等)。

这些 actuator 模块本来就有的端点我们称之为原生端点。根据端点的作用的话,我们大概可以分为三大类:

应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与spring boot应用密切相关的配置类信息。

度量指标类:获取应用程序运行过程中用于监控的度量指标,比如:内存信息、线程池信息、http请求统计等。

操作控制类:提供了对应用的关闭等操作类功能。

详细的原生端点介绍,请以凯发k8官方网官网为准,这里就不赘述徒增篇幅。

需要注意的就是:

1、每一个端点都可以通过配置来单独禁用或者启动

2、不同于actuator 1.x,actuator 2.x 的大多数端点默认被禁掉。actuator 2.x 中的默认端点增加了 /actuator前缀。默认暴露的两个端点为 /actuator/health和 /actuator/info

四、端点暴露配置

我们可以通过以下配置,来配置通过jmx 和 http 暴露的端点。

propertydefault
management.endpoints.jmx.exposure.exclude
management.endpoints.jmx.exposure.include*
management.endpoints.web.exposure.exclude
management.endpoints.web.exposure.includeinfo,healt

可以打开所有的监控点

management.endpoints.web.exposure.include=*

也可以选择打开部分,"*" 代表暴露所有的端点,如果指定多个端点,用","分开

management.endpoints.web.exposure.exclude=beans,trace

actuator 默认所有的监控点路径都在 /actuator/*,当然如果有需要这个路径也支持定制。

management.endpoints.web.base-path=/minitor

设置完重启后,再次访问地址就会变成 /minitor/*。

现在我们按照如下配置:

# "*" 代表暴露所有的端点 如果指定多个端点,用","分开

management.endpoints.web.exposure.include=*

# 赋值规则同上

management.endpoints.web.exposure.exclude=

启动demo程序,访问 http://localhost:8080/actuator,查看暴露出来的端点:


上面这样显示是因为chrome 浏览器安装了 json-handle 插件,实际上就是返回一大段json

下面,我会着重介绍几个比较重要的端点。

五、重要端点解析

5.1 /health端点

/health端点会聚合你程序的健康指标,来检查程序的健康情况。端点公开的应用健康信息取决于:

management.endpoint.health.show-details=always

该属性可以使用以下值之一进行配置:

namedescription
never不展示详细信息,up或者down的状态,默认配置
when-authorized详细信息将会展示给通过认证的用户。授权的角色可以通过 management.endpoint.health.roles配置
always对所有用户暴露详细信息

按照上述配置,配置成 always之后,我们启动项目,访问 http://localhost:8080/actuator/health端口,可以看到这样的信息:

是不是感觉好像健康信息有点少?先别急,那是因为我们创建的是一个最基础的demo项目,没有依赖很多的组件。

/health端点有很多自动配置的健康指示器:如redis、rabbitmq、db等组件。当你的项目有依赖对应组件的时候,这些健康指示器就会被自动装配,继而采集对应的信息。如上面的 diskspace 节点信息就是 diskspacehealthindicator 在起作用。

上述截图取自官方文档

这是我另一个项目的 /health端点信息。

当如上的组件有一个状态异常,应用服务的整体状态即为down。我们也可以通过配置禁用某个组件的健康监测。

management.health.mongo.enabled: false

或者禁用所有自动配置的健康指示器:

management.health.defaults.enabled: false

自定义 health indicator

当然你也可以自定义一个health indicator,只需要实现 healthindicator 接口或者继承 abstracthealthindicator类。

/**

* @author richard_yyf

* @version 1.0 2020/1/16

*/

@component

publicclasscustomhealthindicatorextendsabstracthealthindicator{

@override

protectedvoid dohealthcheck(health.builder builder) throwsexception{

// 使用 builder 来创建健康状态信息

// 如果你throw 了一个 exception,那么status 就会被置为down,异常信息会被记录下来

builder.up()

.withdetail("app", "这个项目很健康")

.withdetail("error", "nothing, i'm very good");

}

}

最终效果:

5.2 /metrics端点

/metrics端点用来返回当前应用的各类重要度量指标,比如:内存信息、线程信息、垃圾回收信息、tomcat、数据库连接池等。

{

"names": [

"tomcat.threads.busy",

"jvm.threads.states",

"jdbc.connections.active",

"jvm.gc.memory.promoted",

"http.server.requests",

"hikaricp.connections.max",

"hikaricp.connections.min",

"jvm.memory.used",

"jvm.gc.max.data.size",

"jdbc.connections.max",

....

]

}

不同于1.x,actuator在这个界面看不到具体的指标信息,只是展示了一个指标列表。为了获取到某个指标的详细信息,我们可以请求具体的指标信息,像这样:

http://localhost:8080/actuator/metrics/{metricname}

比如我访问 /actuator/metrics/jvm.memory.max,返回信息如下:

你也可以用query param的方式查看单独的一块区域。比如你可以访问 /actuator/metrics/jvm.memory.max?tag=id:metaspace。结果就是:

5.3 /loggers端点

/loggers 端点暴露了我们程序内部配置的所有logger的信息。我们访问 /actuator/loggers可以看到,

你也可以通过下述方式访问单独一个logger,

http://localhost:8080/actuator/loggers/{name}

比如我现在访问 root logger, http://localhost:8080/actuator/loggers/root

{

"configuredlevel": "info",

"effectivelevel": "info"

}

改变运行时的日志等级

/loggers端点我最想提的就是这个功能,能够动态修改你的日志等级。

比如,我们可以通过下述方式来修改 root logger的日志等级。我们只需要发起一个url 为 http://localhost:8080/actuator/loggers/root的 post请求,post报文如下:

{

"configuredlevel": "debug"

}

仔细想想,这个功能是不是非常有用。如果在生产环境中,你想要你的应用输出一些debug信息以便于你诊断一些异常情况,你你只需要按照上述方式就可以修改,而不需要重启应用。

如果想重置成默认值,把value 改成 null

5.4 /info端点

/info端点可以用来展示你程序的信息。我理解过来就是一些程序的基础信息。并且你可以按照自己的需求在配置文件 application.properties中个性化配置(默认情况下,该端点只会返回一个空的json内容。):

info.app.name=actuator-test-demo

info.app.encoding=utf-8

info.app.java.source=1.8

info.app.java.target=1.8

# 在 maven 项目中你可以直接用下列方式引用 maven properties的值

# info.app.encoding=@project.build.sourceencoding@

# info.app.java.source=@java.version@

# info.app.java.target=@java.version@

启动项目,访问 http://localhost:8080/actuator/info:

{

"app": {

"encoding": "utf-8",

"java": {

"source": "1.8.0_131",

"target": "1.8.0_131"

},

"name": "actuator-test-demo"

}

}

5.5 /beans端点

/beans端点会返回spring 容器中所有bean的别名、类型、是否单例、依赖等信息。

访问 http://localhost:8080/actuator/beans,返回如下:

5.6 /heapdump 端点

访问:http://localhost:8080/actuator/heapdump会自动生成一个 jvm 的堆文件 heapdump。我们可以使用 jdk 自带的 jvm 监控工具 visualvm 打开此文件查看内存快照。

5.7 /threaddump 端点

这个端点我个人觉得特别有用,方便我们在日常定位问题的时候查看线程的情况。主要展示了线程名、线程id、线程的状态、是否等待锁资源、线程堆栈等信息。就是可能查看起来不太直观。访问 http://localhost:8080/actuator/threaddump返回如下:

5.8 /shutdown端点

这个端点属于操作控制类端点,可以优雅关闭 spring boot 应用。要使用这个功能首先需要在配置文件中开启:

management.endpoint.shutdown.enabled=true

由于 shutdown 接口默认只支持 post 请求,我们启动demo项目,向 http://localhost:8080/actuator/shutdown发起 post请求。返回信息:

{

"message": "shutting down, bye..."

}

然后应用程序被关闭。

由于开放关闭应用的操作本身是一件非常危险的事,所以真正在线上使用的时候,我们需要对其加入一定的保护机制,比如:定制actuator的端点路径、整合spring security进行安全校验等。(不是特别必要的话,这个端点不用开)

六、整合spring security 对端点进行安全校验

由于端点的信息和产生的交互都是非常敏感的,必须防止未经授权的外部访问。如果您的应用程序中存在spring security的依赖,则默认情况下使用基于表单的http身份验证来保护端点。

如果没有,只需要增加对应的依赖即可:

org.springframework.boot

spring-boot-starter-security

添加之后,我们需要定义安全校验规则,来覆盖spring security 的默认配置。

这里我给出了两个版本的模板配置:

import org.springframework.boot.actuate.autoconfigure.security.servlet.endpointrequest;

import org.springframework.boot.actuate.context.shutdownendpoint;

import org.springframework.boot.autoconfigure.security.servlet.pathrequest;

import org.springframework.context.annotation.configuration;

import org.springframework.security.config.annotation.web.builders.httpsecurity;

import org.springframework.security.config.annotation.web.configuration.websecurityconfigureradapter;

/**

* @author richard_yyf

*/

@configuration

publicclassactuatorsecurityconfigextendswebsecurityconfigureradapter{

/*

* version1:

* 1. 限制 '/shutdown'端点的访问,只允许actuator_admin访问

* 2. 允许外部访问其他的端点

* 3. 允许外部访问静态资源

* 4. 允许外部访问 '/'

* 5. 其他的访问需要被校验

* version2:

* 1. 限制所有端点的访问,只允许actuator_admin访问

* 2. 允许外部访问静态资源

* 3. 允许外部访问 '/'

* 4. 其他的访问需要被校验

*/

@override

protectedvoid configure(httpsecurity http) throwsexception{

// version1

// http

// .authorizerequests()

// .requestmatchers(endpointrequest.to(shutdownendpoint.class))

// .hasrole("actuator_admin")

// .requestmatchers(endpointrequest.toanyendpoint())

// .permitall()

// .requestmatchers(pathrequest.tostaticresources().atcommonlocations())

// .permitall()

// .antmatchers("/")

// .permitall()

// .antmatchers("/**")

// .authenticated()

// .and()

// .httpbasic();

// version2

http

.authorizerequests()

.requestmatchers(endpointrequest.toanyendpoint())

.hasrole("actuator_admin")

.requestmatchers(pathrequest.tostaticresources().atcommonlocations())

.permitall()

.antmatchers("/")

.permitall()

.antmatchers("/**")

.authenticated()

.and()

.httpbasic();

}

}

application.properties的相关配置如下:

# spring security default user name and password

spring.security.user.name=actuator

spring.security.user.password=actuator

spring.security.user.roles=actuator_admin

特别推荐一个分享架构 算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼

如有收获,点个在看,诚挚感谢

总结

以上是凯发k8官方网为你收集整理的springboot actuator_spring boot 服务监控,健康检查,线程信息,jvm堆信息,指标收集,运行情况监控...的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发k8官方网网站内容还不错,欢迎将凯发k8官方网推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图