43-指标监控

https://docs.spring.io/spring-boot/docs/2.4.3/reference/html/production-ready-features.html#production-ready

1. 简述#

未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot 就抽取了 Actuator 场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能。

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

You can choose to manage and monitor your application by using HTTP endpoints or with JMX (Java Management Extensions).

运行起 SpringBoot 程序后,查看二者的默认情况:① 通过在 CMD 输入 jconsole 选择正在运行的 SpringBoot 的主程序类(好多 Endpoint);② 在 Firefox 输入 <SpringBoot访问路径>/actuator(就能看到 4 个)。

2. Endpoints#

Actuator endpoints let you monitor and interact with your application. Spring Boot includes a number of built-in endpoints and lets you add your own. For example, the health endpoint provides basic application health information.

Each individual endpoint can be enabled or disabled and exposed (made remotely accessible) over HTTP or JMX. An endpoint is considered to be available when it is both enabled and exposed. The built-in endpoints will only be auto-configured when they are available. Most applications choose exposure via HTTP, where the ID of the endpoint along with a prefix of /actuator is mapped to a URL. For example, by default, the health endpoint is mapped to /actuator/health.

2.1 Enable#

所有 Endpoint(除了 shutdown)默认都是开启的:management.endpoints.enabled-by-default=true,只是有没有暴露而已(API-2.2. Exposing Endpoints 可以查看 JMX、Web 分别默认暴露的 Endpoint),如果有特殊需求,可以将其设置为 false 后手动开启指定的 Endpoint。

management:
  endpoints:
    enabled-by-default: false
  endpoint:
    beans:
      enabled: true
    health:
      enabled: true
    shutdown:
      enabled: true
    ...

2.2 Expose#

配置上“以 web 方式暴露所有端点”后,访问 http://localhost:8080/admin/actuator

3. 定制 Endpoint#

3.1 定制 health 信息#

/**
 * @author 6x7
 * @Description Actuator-健康检查
 */
@Component
public class MyAppHealthIndicator extends AbstractHealthIndicator {
    /**
     * 检查逻辑
     * @param builder
     * @throws Exception
     */
    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        Map<String, Object> config = new HashMap<>();
        builder.status(Status.UP);
        config.put("controller", 1);
        config.put("service", 1);
        config.put("mapper", 1);
        builder.withDetail("code", 1101).withDetails(config);
    }
}

访问 http://localhost:8080/admin/actuator/health

3.2 定制 info 信息#

(1)在 application.yml 中配置

info:
  appName: boot-admin
  appVersion: @project.version@     # 引用 pom.xml 的内容

(2)注册一个实现 InfoContributor 接口的组件

@Component
public class AppInfoContributor implements InfoContributor {
    @Override
    public void contribute(Info.Builder builder) {
        builder
            .withDetail("msg0", "Can you hear me?")
            .withDetail("msg1", "You are being watched.");
    }
}

访问 http://localhost:8080/admin/actuator/info

3.3 定制 metrics 信息#

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserMapper userMapper;

    Counter counter;

    public UserServiceImpl(MeterRegistry meterRegistry) {
        counter = meterRegistry.counter("userService.getUserById.count");
    }

    @Override
    public User getUserById(Long id) {
        counter.increment();
        return userMapper.getUserById(id);
    }
}

访问 http://localhost:8080/admin/actuator/metrics

访问处理逻辑中会调用到 userService#getUserById 的 handler 方法后,再访问 http://localhost:8080/admin/actuator/metrics/userService.getUserById.count

3.4 定制 Endpoint#

@Slf4j
@Component
@Endpoint(id="my-secret-service")
public class MyEndpoint {

    /**
     * http://localhost:8080/admin/actuator/my-secret-service
     * @return
     */
    @ReadOperation
    public Map getServiceInfo() {
        return Collections.singletonMap("serviceInfo", "service started...");
    }

    /**
     * jconsole: boot -> EndPoint -> my-secret-service -> 操作 -> click [stopService]
     */
    @WriteOperation
    public void stopService() {
        log.info("service stopped...");
    }
}

访问 http://localhost:8080/admin/actuator

4. 可视化#

https://github.com/codecentric/spring-boot-admin
https://codecentric.github.io/spring-boot-admin/current/

4.1 新建监控可视化微服务#

(1)添加如下依赖

<dependencies>
    <dependency>
        <groupId>de.codecentric</groupId>
        <artifactId>spring-boot-admin-starter-server</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

(2)主启动类上添加 @EnableAdminServer 注解

(3)将服务注册到 8888 端口

4.2 注册客户端微服务#

(1)我们写的微服务的监控数据是要被上面新建的 SpringBoot Admin Server 收集的,所以要在我们的微服务程序中添加客户端依赖:

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

访问 localhost:8888

(2)Enable the SBA Client by configuring the URL of the Spring Boot Admin Server :

spring:
  application:
    name: boot_03_admin              # 注册时微服务的名字
  boot:
    admin:
      client:
        url: http://localhost:8888
        instance:
          prefer-ip: true            # 注册方式是 hostname 还是 ip

management:
  endpoints:
    enabled-by-default: true
    web:
      exposure:
        include: '*'

此时再查看 http://localhost:8888

posted @   tree6x7  阅读(82)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示
主题色彩