1. 程式人生 > 其它 >通過spring actuator監控微服務健康指標

通過spring actuator監控微服務健康指標

技術標籤:Spring Bootspring bootactuator微服務監控

使用Spring Boot搭建微服務框架已經是Java微服務開發的主流場景。微服務監控是微服務運維管理的重要一環。Spring Actuator擁有操作簡單,監控指標完善,擴充套件性好的優點。

參考Spring官方指導文件,梳理了一下在專案中如何使用Spring Actuator。

一、配置依賴

  1. 在pom檔案中引入依賴的jar包:
        <dependency>
            <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId> <version>2.0.1.RELEASE</version> </dependency>

配套使的spring boot版本是2.1.6.RELEASE。

  1. 在yml中新增actuator管理配置:
management:
  security:
    enabled: false
  endpoints:
    web:
      exposure:
         include:
health,metrics endpoint: health: show-details: always

管理介面基本上都是在內部環境呼叫,簡化處理不配置安全認證。

二、微服務健康指標

Actuator預設提供了微服務狀態,資料庫連線,MQ狀態、磁碟佔用等指標資料的檢視功能。訪問方式是服務URL+actuator/health。樣例程式碼的訪問地址是:http://localhost:10000/elon/elon-actuator/actuator/health

除了預設支援的健康指標外,還可以根據自己的需要自定義:從HealthIndicator派生自定義指標類,注入到Spring框架。

package com.elon.actuator.service;

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.actuate.health.Status;
import org.springframework.stereotype.Component;

/**
 * 自定義健康檢查指標
 *
 * @author elon
 * @since 2020-12-13
 */
@Component
public class CustomHealthIndicator implements HealthIndicator {
    @Override
    public Health health() {
        Health.Builder builder = new Health.Builder();
        builder.status(Status.UP);

        /**
         * 蒐集所有自定義指標資料,封裝到Health中返回
         */
        builder.withDetail("自定義健康指標1", "正常").withDetail("自定義健康指標2", "異常");

        return builder.build();
    }
}

從Web端呼叫http://localhost:10000/elon/elon-actuator/actuator/health介面時,CustomHealthIndicator的health方法會被呼叫,可以將蒐集的指標資料封裝到Health中返回。

呼叫介面返回的資料如下。可以看到自定義的健康指標資料一同返回了。

{
    "status": "UP",
    "details": {
        "custom": {
            "status": "UP",
            "details": {
                "自定義健康指標1": "正常",
                "自定義健康指標2": "異常"
            }
        },
        "db": {
            "status": "UP",
            "details": {
                "database": "MySQL",
                "hello": 1
            }
        },
        "diskSpace": {
            "status": "UP",
            "details": {
                "total": 214747312128,
                "free": 129423261696,
                "threshold": 10485760
            }
        }
    }
}

三、檢視微服務度量指標

Actuator除了監控微服務整體的健康狀態外,還能看很多細的指標資料。如:記憶體佔用情況、CPU利用率、執行緒、WEB會話等。

呼叫http://localhost:10000/elon/elon-actuator/actuator/metrics可以看到能監控哪些度量指標:

{"names":["jvm.memory.max","tomcat.threads.busy","jvm.threads.states","jvm.gc.memory.promoted","jvm.memory.used","jvm.gc.max.data.size","jdbc.connections.max","jdbc.connections.min","jvm.memory.committed","system.cpu.count","jvm.buffer.memory.used","tomcat.sessions.created","jvm.threads.daemon","system.cpu.usage","jvm.gc.memory.allocated","tomcat.global.sent","tomcat.sessions.expired","tomcat.global.request.max","jvm.threads.live","jvm.threads.peak","tomcat.global.request","process.uptime","tomcat.sessions.rejected","tomcat.global.received","process.cpu.usage","jvm.classes.loaded","jvm.gc.pause","jvm.classes.unloaded","tomcat.sessions.active.current","tomcat.threads.config.max","tomcat.sessions.alive.max","jvm.gc.live.data.size","log4j2.events","tomcat.global.error","custom.metrics1","custom.metrics2","jvm.buffer.count","tomcat.threads.current","jvm.buffer.total.capacity","tomcat.sessions.active.max","process.start.time"]}

檢視單個度量指標的值,使用http://localhost:10000/elon/elon-actuator/actuator/metrics/{指標項拼接 }。例如檢視jvm.memory.max的值,呼叫介面http://localhost:10000/elon/elon-actuator/actuator/metrics/jvm.memory.max

四、自定義微服務度量指標

package com.elon.actuator.service;

import com.google.common.util.concurrent.AtomicDouble;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Component;

/**
 * 自定義度量指標
 *
 * @author elon
 * @since 2020-12-13
 */
@Component
public class CustomMetrics {
    // 儲存自定義度量指標值
    private AtomicDouble value1 = new AtomicDouble(0);
    private AtomicDouble value2 = new AtomicDouble(0);

    public CustomMetrics(MeterRegistry registry) {
        // 註冊指標
        registry.gauge("custom.metrics1", value1);
        registry.gauge("custom.metrics2", value2);
    }

    public void setValue1(double value1) {
        this.value1.set(value1);
    }

    public void setValue2(double value2) {
        this.value2.set(value2);
    }
}

註冊完後呼叫介面http://localhost:10000/elon/elon-actuator/actuator/metrics,可以看到自定義指標已列出:
在這裡插入圖片描述

檢視自定義指標值的方式與預設指標一致,都是用URL+指標項名稱拼接。

自定義健康指標是在查詢時實時收集資料,自定義度量指標是在註冊指標時綁定了一個指標值變數(框架提供了多種註冊方式,這是其中一種)。

通過測試介面改變了指標值後,再呼叫查詢介面http://localhost:10000/elon/elon-actuator/actuator/metrics/custom.metrics1。可以看到指標值發生了變化。

DEMO程式碼路徑:https://github.com/ylforever/elon-actuator