应用程序监控管理


应用程序监控管理

1. Actuator 应用监控快速入门

一、大纲

  • Spring Boot Actuator 简介
  • Actuator 开启与配置
  • 常用监控端点说明

二、Spring Boot Actuator 简介

Spring Boot 作为构建微服务节点的方案,一定要提供全面而且细致的监控指标,使微服务更易于管理!微服务不同于单体应用,微服务的每个服务节点都单独部署,独立运行,大型的微服务项目甚至有成百上干个服务节点。这就为我们进行系统监控与运维提出了挑战。为了应对这个挑战,其中最重要的工作之一就是:微服务节点能够合理的暴露服务的相关监控指标,用以对服务进行健康检查、监控管理,从而进行合理的流量规划与安排系统运维工作!

图片描述

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

Actuator 也可以和⼀些外部的应⽤监控系统整合(Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic 等)。这些监控系统提供了出⾊的仪表板,图形,分析和警报,可帮助你通过⼀个统⼀友好的 界⾯,监视和管理你的应⽤程序。

三、Actuator 开启与配置

新建 boot-actuator 模块

3.1 开启监控

在 Spring Boot 项目中开启 Actuator 非常简单,只需要引入如下的 maven 坐标即可。

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

3.2 默认开放访问的监控端点

Spring Boot Actuator 启⽤之后,HTTP 协议下默认开放了两个端点的访问:

  • /actuator/health ⽤以监控应⽤状态。返回值是应⽤状态信息,包含四种状态 DOWN(应⽤不正常), OUT_OF_SERVICE(服务不可⽤),UP(状态正常), UNKNOWN(状态未知)。如果服务状态正常,我们访问 http:/host:port/actuator/health 得到如下响应信息:
{
  "status": "UP"
}

从上⾯的响应结果看,该监控端点的监控信息⾮常有限,如果我们想让展示信息更加丰富的话,可以做如下配置。

management.endpoint.health.show-details=always
  • /actuator/info ⽤来响应应⽤相关信息,默认为空。可以根据我们⾃⼰的需要,向服务调⽤者暴露相 关信息。如下所示,配置属性可以随意起名,但都要挂在 info 下⾯:
info.app-name=spring-boot-actuator-demo
info.description=spring-boot-actuator-demo indexs monitor

3.3 开放端点配置(exposure)

如果我们希望开放更多的监控端点给服务调⽤者,需要配置:开放部分监控端点,端点名称⽤逗号分隔。

## 开放访问的服务端点
management.endpoints.web.exposure.include=beans,env
## 不暴露对外开放的服务端点
management.endpoints.web.exposure.exclude=mappings

开放所有监控端点:

management.endpoints.web.exposure.include=*

星号在 YAML 配置⽂件中中有特殊的含义,所以在 YAML 配置⽂件使⽤星号⼀定要加引号,如下所示:

management:
  endpoints:
    web:
      exposure:
        include: "*"

3.4.开启端点配置(enabled)

  • 针对 actuator 提供的服务端点,开启启⽤(enabled)不等于开放访问(include)。

  • 绝⼤部分的监控端点是默认开启的(下图中的 Yes),少部分监控端点默认是不开启的,⽐如:shutdown。

  • 对于默认不启⽤的监控服务端点,⼀定要先开启(enabled),开启的配置⽅法如下:

# shutdown是服务端点名称,可以替换
management.endpoint.shutdown.enabled=true

四、常⽤监控端点说明

Spring Boot Actuator 监控端点的分类

  • 静态配置类:主要是⼀些静态配置信息,⽐如: Spring Bean 加载信息、yml 或 properties 配置信息、环境变量信息、请求接⼝关系映射信息等;

  • 动态指标类:主要⽤于展现程序运⾏期状态,例如内存堆栈信息、请求链信息、健康指标信息等;

  • 操作控制类:主要是 shutdown 功能,⽤户可以远程发送 HTTP 请求,从⽽关闭监控功能。

ID(监控端点名称) 描述 服务是否默认启⽤
auditevents 应⽤程序的审计事件相关信息 Yes
beans 应⽤中所有 Spring Beans 的完整列表 Yes
conditions (confguration and auto-confgurationclasses)的状态及它们被应用或未被应用的原因 Yes
configprops @ConfigurationProperties 的集合列表 Yes
env Spring 的 ConfigurableEnvironment 的属性 Yes
flyway flyway 数据库迁移路径,如果有的话 Yes
liquibase Liquibase 数据库迁移路径,如果有的话 Yes
metrics 应⽤的 metrics 指标信息 Yes
mappings 所有@RequestMapping 路径的集合列表 Yes
scheduledtasks 应⽤程序中的计划任务 Yes
sessions 允许从 Spring 会话支持的会话存储中检索和删除(retrieval and deletion)用户会话.使用 Spring Session 对反应性 Web 应用程序的支持时不可用 Yes
shutdown 允许应⽤以优雅的⽅式关闭(默认情况下不启⽤) No
threaddump 线程名、线程 ID、线程的状态、是否等待锁资源、线程堆栈等信息 Yes
httptrace 显示 HTTP 跟踪信息(默认显示最后 100 个 HTTP 请求-响应交换) Yes

如果使⽤ web 应⽤(Spring MVC, Spring WebFlux, 或者 Jersey),还可以使⽤以下端点:

ID (监控端点名称) 描述 默认启⽤
heapdump 返回⼀个 GZip 压缩的 hprof 堆 dump ⽂件 Yes
jolokia 通过 HTTP 暴露 JMX beans(当 Jolokia 在类路径上时,WebFlux 不可用) Yes
logfile 返回日志文件内容(如果设置了 logging.file 或 logging。path 展性的话),支持使用 HTTPRange 头接收日志文件内容的部分信息 Yes
prometheus 以可以被 Prometheus 服务器抓取的格式显示 metrics 信息 Yes

2. SpringBootAdmin 界面化监控

在之前的内容中,我们学习了如何使用 Spring Boot Actuator 对单个 Spring Boot 应用进行监控。通过浏览器访问 url 可以各个监控应用端点,可以知道应用的运行状态信息。但是这种方式返回的数据都是 JSON 的格式,各种指标需要单独访问查看。我们迫切希望有一种方式:可以通过方便地通过鼠标点击和友好的 U!界面的展现方式查看应用的各种运行指标。Spring Boot Admin 应运而生!

⼀、Spring Boot Admin 介绍

  • Spring Boot Admin 是⼀个针对 Spring Boot Actuator 的 JSON 数据响应结果进⾏ UI 美化封装的监控⼯具

  • 通过 Spring Boot Admin,可以在可视化⻚⾯中浏览所有被监控的 spring-boot 项⽬的 Actuator 运⾏时信息,甚⾄还可以直接修改 logger 的 level

图片描述

  • Spring Boot Admin 包括客户端和服务端两个部分,⼀个服务端可以展示多个客户端的监控结果:
    • 客户端:即需要监控的应⽤服务,需集成 spring-boot-admin-starter-client,通过 HTTP 协议注册到 Spring Boot Admin 服务端,从⽽进⾏集中展示。(也可以结合 Spring Cloud 服务注册中⼼)
    • 服务端:访问客户端的 Actuator 运⾏时数据,并使⽤ UI 界⾯进⾏展示。是⼀个独⽴的 Spring Boot 应⽤,需集成 spring-boot-admin-starter-server

⼆、创建 SpringBoot Admin 服务端

新建⼀个模块:boot-admin ,maven 坐标引⼊

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

在项⽬启动类上⾯加上@EnableAdminServer 注解

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

指定访问端⼝

server:
  port: 8081

访问 http://localhost:8081/,因为⽬前没有任何的客户端应⽤注册上来,所以界⾯上没有相关的展示信息。

三、集成 SpringBoot Admin 客户端

在我们之前的项⽬ boot-actuator ⾥⾯引⼊下⾯的依赖,作为被 SpringBoot Admin 监控的客户端存在。

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

进⾏ application.yml 配置

spring:
  boot:
    admin:
      client:
        url: http://localhost:8081
management:
  endpoint:
    health:
      show-details: always
  endpoints:
    web:
      exposure:
        include: "*"
  • spring.boot.admin.client.url 体现的是服务端的访问地址,也就是监控注册的地址。

  • 当客户端注册到 spring boot admin 服务端之后,admin 服务端就会访问客户端应⽤的”/actuator”访问端点信息,因为我们为 boot-launch 配置了⽤户密码的访问权限(上⼀节),所以需要将⽤户名密码告知服务端,它才能正确的获取”/actuator”访问端点信息。这就是 metadata.user 配置段的作⽤

另外,为了让 Spring Boot Admin 展示的内容更加丰富,我们将所有的服务端点都开放出来。如果不开放,spring boot admin 只能获取健康检查”/health”和“/info”两个默认开放访问的基础信息,也就失去了使⽤ Spring Boot Admin 的意义。

再次访问 http://localhost:8081/ ,这次展示的监控信息内容就很多了:


文章作者: Syhan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Syhan !
评论
  目录