Bộ sưu tập

Giám sát ứng dụng với Spring Actuator


https://codersontrang.com/2017/12/20/giam-sat-ung-dung-voi-spring-actuator/

Đối với một nhà phát triển ứng dụng từng trải, có một điều rất hiển nhiên là việc phát triển ứng dụng không chỉ dừng lại ở giai đoạn code, mà việc vận hành cũng như bảo trì ứng dụng khi chạy thật cũng là một khâu rất quan trọng. Cho đến những ngày hôm nay, khi mà các hệ thống phần mềm đang được định hướng theo kiến trúc microservice, thì việc vận hành vào bảo trì cũng như giám sát hệ thống phần mềm là càng lúc càng trở nên quan trọng. Lý do vì khi càng chia nhỏ các nghiệp vụ ra các service riêng biệt, rồi các cơ chế cân bằng tải làm tăng tính ổn định của hệ thống làm cho số lượng service trong một hệ thống phần mềm sẽ lớn hơn trước. Việc truy tìm ra các ngọn nguồn của mọi vấn đề trong quá trình vận hành càng lúc càng là gánh nặng đặt lên vai hệ thống giám sát. Trong bài viết này, mình sẽ trình bày về Spring Actuator là một trong những framework trong hệ sinh thái của Spring, giúp cho việc giám sát các ứng dụng Spring trở nên dễ dàng hơn bao giờ hết qua việc cung cấp các API cho các hệ thống ngoài gọi vào để lấy ra tình trạng hoạt động của ứng dụng.

Với Spring Actuator, ứng dụng có thể tạo ra các API cho việc giám sát hệ thống qua các giao thức như HTTP, JMX, SSH, Telnet… tuy nhiên trong bài viết này sẽ chỉ giới thiệu cho các bạn về các API dựa trên giao thức web HTTP (dưới dạng các restful API). Ví dụ trong bài viết này sẽ là viết tiếp của ví dụ trong bài viết “Một cách nhìn khác về ứng dụng web với Spring MVC, Spring Boot, Tomcat dạng nhúng và Thymeleaf“.

Có một điều cần chú ý là các API dựa trên giao thức HTTP được chạy trên một framework web nào đó của Spring như là Spring MVC hay Spring Webflux. Vì vậy chúng ta nên nhớ rằng việc tích hợp các API giám sát vào ứng dụng cũng đồng nghĩa với việc tạo ra một web server đang chạy ngầm trong ứng dụng (cho dù kể cả khi ứng dụng của ta đã là ứng dụng web nhưng viết bằng framework khác như Jersey chẳng hạn).

Đầu tiên với cấu trúc của Maven project thì vẫn là kết thừa trong bài viết trước, ta chỉ thêm mới vào một lớp là BuildInfoContributor.java nằm trong package springmvcdemo.monitoring như hình dưới đây:

pom.xml


<?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>

    <groupId>com.codersontrang</groupId>
    <artifactId>spring-mvc-with-boot</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <repositories>
        <repository>
            <id>spring-milestone</id>
            <name>spring milestone</name>
            <url>http://repo.spring.io/milestone/</url>
        </repository>
        <repository>
            <id>maven-central</id>
            <name>maven central</name>
            <url>http://central.maven.org/maven2/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.0.0.M7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.0.0.M7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.0.0.M7</version>
        </dependency>
    </dependencies>
</project>

Về nội dung của file pom.xml, ta thêm một dependency mới là spring-boot-starter-actuator cũng là dependency duy nhất cần phải khai báo để có thể sử dụng đầy đủ các tính năng của Spring Actuator. Tiếp đó ta cũng nâng version của hai dependencies cũ lên phiên bản mới nhất tính đến thời điểm hiện tại là 2.0.0.M7.

application.properties


server.port=8080
management.server.port=8090
management.endpoints.web.expose=*
management.endpoint.shutdown.enabled=true
  • server.port: Như ở trong bài viết nội dung của file application.properties được để trống và ứng dụng web của chúng ta khi bật lên sẽ chạy ở trên cổng mặc định là 8080. Để thay đổi cổng này sang một giá trị khác thì ta có thể khai báo bằng thuộc tính server.port trong file application.properties, ở bài viết này ta vẫn giữ nó là 8080.
  • management.server.port: Các API liên quan đến việc giám sát sẽ được truy cập qua một cổng khác với cổng 8080 ở trên để tránh việc lẫn lộn cũng như vấn đề bảo mật. Ở đây ta cấu hình cho các API giám sát được truy cập qua cổng 8090.
  • management.endpoints.web.expose: Mặc định thì không phải tất cả các API giám sát sẽ được kích hoạt. Ta có thể kích hoạt từng loại API giám sát bằng các thuộc tính khác nhưng ở đây để thuận tiện cho việc demo, ta kích hoạt tất cả các API giám lên bằng việc cấu hình dấu *
  • management.endpoint.shutdown.enabled: Có một API rất đặc biệt có khả năng cho phép ta gọi đến để tắt ứng dụng một cách an toàn mà không phải dùng các lệnh kill process của hệ điều hành. Để có thể kích hoạt API này lên thì ta phải cấu hình giá trị của nó là true trong application.properties.

Đến đây tạm thời quên đi nội dung của file BuildInfoContributor.java, ta bật thử ứng dụng lên và thử truy cập vào các trang ở cổng 8080 ta vẫn có được giống như những gì trình bày trong bài viết trước. Và bây giờ ta thử truy cập thử vào các API giám sát qua cổng 8090

/actuator

/actuator là API trả về các thông tin về các API khác mà ta có thể truy cập tới. Ta sẽ điểm qua một vài API đặc trưng như ở dưới đây.

/actuator/beans

Hiển thị danh sách các Spring Bean đăng tồn tại trong Spring Application Context.

/actuator/health

Hiển thị thông tin về tình trạng của ứng dụng là đang sống (UP) hay là đã chết (DOWN) do một lỗi gì đó. Ngoài ra ra các thông tin về tình trạng ổ cứng như dung lượng tổng, dung lượng đã dùng…

/actuator/env

Hiển thị thống tin về các biến môi trường được sử dụng trong ứng dụng hiện tại. Ví dụ như thông tin về cấu hình các cổng (8080, 8090) ta cũng thấy ở đây.

/actuator/info

Hiển thị thông tin bất kì nào đó mà ta muốn giám sát trong ứng dụng. Mặc định thì không có thông tin gì được trả về ở đây vì thế mà nội dung sẽ là trắng như hình dưới đây

Bây giờ giả sử ta muốn giám sát thông tin về phiên bản của ứng dụng đang chạy chẳng hạn, ta có thể tạo một đối tượng thuộc kiểu org.springframework.boot.actuate.info.InfoContributor để trả về thông tin này như sau.

BuildInfoContributor.java


package springmvcdemo.monitoring;

import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class BuildInfoContributor implements InfoContributor{
    @Override
    public void contribute(Info.Builder builder) {
        builder.withDetail("buildInfo", Map.of("build.version", "2.0.0.0"));
    }
}

Bây giờ bật lại ứng dụng, ta có thể thấy thông tin về phiên bản của ứng dụng được trả về qua API /actuator/info như hình dưới đây:

/actuator/shutdown

Là API dùng để tắt ứng dụng, ta gọi đến API này qua phương thức POST bằng công cụ Postman, khi thành công API sẽ trả về lời nhắn là “Shutting down, bye…

Và sau đó thì ứng dụng của chúng ta đã được tắt một cách an toàn mà không cần dùng các lệnh kill process của hệ điều hành.

Xin nhắc lại là để dùng API này thì ta cần phải kích hoạt nó trong applications.properties với thuộc tính management.endpoint.shutdown.enabled=true.

Như vậy là bài viết này đã giới thiệu đến các bạn về Spring Actuator và cách nó tạo ra các API phục vụ cho việc giám sát hệ thống qua giao thức web HTTP. Spring Actuator không chỉ giới hạn như vậy, nó còn có thể tạo ra các API qua các giao thức khác nhau và có khả năng tích hợp với các công cụ giám sát khác như Prometheus, Netflix Atlas, và Datadog mà trong tương lai nếu có cơ hội chúng ta sẽ lại cùng nhau chia sẻ.

Good luck!

Advertisements

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s