Spring Boot学习笔记(六):Spring Boot 应用监控

Spring Boot 提供了运行时的应用监控和管理功能,我们可以通过http、JMX进行操作。

全部章节传送门:
Spring Boot学习笔记(一):Spring Boot 入门基础
Spring Boot学习笔记(二):Spring Boot 运行原理
Spring Boot学习笔记(三):Spring Boot Web开发
Spring Boot学习笔记(四):Spring Boot 数据访问
Spring Boot学习笔记(五):Spring Boot 企业级开发
Spring Boot学习笔记(六):Spring Boot 应用监控

常见端点介绍

Spring Boot 2.0提供的常用端点如下所示。

序号 端点名 描述 默认开启(Web) 默认开启(JMX)
1 actuator 所有端点的列表,需加入spring HATEOAS支持
2 auditevents 显示应用暴露的审计事件 (比如认证进入、订单失败)
3 info 显示应用的基本信息
4 health 显示应用的健康状态
5 metrics 显示应用多样的度量信息
6 loggers 显示和修改配置的loggers
7 logfile 返回log file中的内容(如果logging.file或者logging.path被设置) 不适用
8 httptrace 显示HTTP足迹,最近100个HTTP request/repsponse
9 env 显示当前的环境特性
10 flyway 显示数据库迁移路径的详细信息
11 shutdown 让你逐步关闭应用
12 mappings 显示所有的@RequestMapping路径
13 scheduledtasks 显示应用中的调度任务
14 threaddump 执行一个线程dump 不适用
15 heapdump 返回一个GZip压缩的JVM堆dump 不适用

配置端点

默认情况下,所有的端点都是打开的,除了 shutdown 端点。可以通过 management.endpoint.<id>.enabled的值设置为true或者false

例如,想要打开 shutdown 端点,可以在application.properties中配置:

management.endpoint.shutdown.enabled=true

默认情况下,所有的端点都可以通过JMX查看,而只有health端点和info端点可以通过HTTP查看。我们可以通过配置进行修改。

management.endpoints.web.exposure.include=health,info 
management.endpoints.web.exposure.exclude=
management.endpoints.jmx.exposure.include=*
management.endpoints.jmx.exposure.exclude=

查看端点

创建 Spring Boot 项目,添加 Actuator、Web和HATEOAS依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wyk</groupId>
    <artifactId>actuatordemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>actuatordemo</name>
    <description>Demo project for Spring Boot Actustor</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

在application.properties中添加配置信息。

# 开启所有端点允许HTTP查看
management.endpoints.web.exposure.include=*
# 显示详细健康信息
management.endpoint.health.show-details=always

然后运行程序,即可查看端点信息。

登录 http://localhost:8080/actuator

actuator端点查看.png

登录 http://localhost:8080/actuator/health 查看端点信息。

health端点查看.png

除了shutdown端点需要POST方式查看,其他端点均可直接查看。

还可以通过JMX对应用进行管理和监控。在控制台输入 jconsole即可进入JMX。

然后选择我们的程序进入界面,然后在MBean标签的org.springframework.boot域下可以对程序进行监控和管理。

jmx界面.png

自定义端点

自定义端点需要使用如下注释。

  • @Endpoint 是构建 rest 的唯一路径。不同请求的操作,调用时缺少必需参数,或者使用无法转换为所需类型的参数,则不会调用操作方法,响应状态将为400(错误请求)
  • @ReadOperation = GET 响应状态为 200 如果没有返回值响应 404(资源未找到)。
  • @WriteOperation = POST 响应状态为 200 如果没有返回值响应 204(无响应内容)
  • @DeleteOperation = DELETE 响应状态为 200 如果没有返回值响应 204(无响应内容)

依旧使用上面的工程,添加一个实体类。

package com.wyk.actuatordemo;

import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
import org.springframework.stereotype.Component;

@Endpoint(id="status")
@Component
public class StatusEndpoint {
    private String status;

    @ReadOperation
    public String getStatus() {
        return status;
    }

    @WriteOperation
    public void setStatus(String status) {
        this.status = status;
    }
}

然后修改运行类。

package com.wyk.actuatordemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class ActuatordemoApplication {

    @Autowired
    StatusEndpoint statusEndpoint;

    public static void main(String[] args) {
        SpringApplication.run(ActuatordemoApplication.class, args);
    }

    @RequestMapping("/change")
    public String changeStatus(String status) {
        //StatusEndpoint statusEndpoint = new StatusEndpoint();
        statusEndpoint.setStatus(status);
        return "OK";
    }
}

运行程序,打开 http://localhost:8080/actuator/status, 这时候会报404,是因为status没有值。

自定义端点状态1.png

再打开一个窗口,输入 http://localhost:8080/change?status=123 , 这时候再打开 http://localhost:8080/actuator/status ,就可以看到了。

自定义端点状态2.png

自定义 HealthIndicator

Health 信息是从 AppliciationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring 内置的HealthIndicator 如下所示。

名称 描述
CassandraHealthIndicator 检查 Cassandra 数据库是否启动。
DiskSpaceHealthIndicator 检查磁盘空间不足。
DataSourceHealthIndicator 检查是否可以获得连接 DataSource。
ElasticsearchHealthIndicator 检查 Elasticsearch 集群是否启动。
InfluxDbHealthIndicator 检查 InfluxDB 服务器是否启动。
JmsHealthIndicator 检查 JMS 代理是否启动。
MailHealthIndicator 检查邮件服务器是否启动。
MongoHealthIndicator 检查 Mongo 数据库是否启动。
Neo4jHealthIndicator 检查 Neo4j 服务器是否启动。
RabbitHealthIndicator 检查 Rabbit 服务器是否启动。
RedisHealthIndicator 检查 Redis 服务器是否启动。
SolrHealthIndicator 检查 Solr 服务器是否已启动。

要实现自己的 HealthIndicator 只需要实现 HealthIndicator 类。

package com.wyk.actuatordemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;

public class StatusHealth implements HealthIndicator {
    @Autowired
    StatusEndpoint statusEndpoint;

    @Override
    public Health health() {
        String status = statusEndpoint.getStatus();

        if(status == null || !status.equals("123")) {
            return Health.down().withDetail("Error", "Not Running").build();
        }
        return  Health.up().build();


    }
}

运行程序,打开 http://localhost:8080/actuator/health 查看。

自定义health.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352