15.2.1 Truy xuất thông tin thiết yếu của ứng dụng
Khi bắt đầu một cuộc khám bệnh thông thường, chúng ta thường được hỏi hai câu rất cơ bản: bạn là ai và bạn cảm thấy thế nào? Mặc dù cách diễn đạt của bác sĩ hoặc y tá có thể khác nhau, nhưng cuối cùng họ chỉ muốn biết một chút về người họ đang điều trị và lý do bạn đến khám.
Chính những câu hỏi cơ bản đó là điều mà các endpoint /info và /health của Actuator trả lời cho một ứng dụng Spring Boot. Endpoint /info cung cấp cho bạn một chút thông tin về ứng dụng, còn /health cho bạn biết tình trạng sức khỏe của ứng dụng.
YÊU CẦU THÔNG TIN VỀ ỨNG DỤNG
Để tìm hiểu một chút thông tin về một ứng dụng Spring Boot đang chạy, bạn có thể gọi đến endpoint /info. Tuy nhiên, theo mặc định, endpoint /info không cung cấp nhiều thông tin. Đây là ví dụ bạn có thể thấy khi gọi nó bằng curl:
$ curl localhost:8081/actuator/info
{}Mặc dù có vẻ như endpoint /info không hữu ích lắm, nhưng tốt nhất bạn nên xem nó như một "tấm toan trắng" mà bạn có thể vẽ lên bất kỳ thông tin nào bạn muốn hiển thị.
Chúng ta có nhiều cách để cung cấp thông tin cho endpoint /info, nhưng cách đơn giản nhất là tạo một hoặc nhiều thuộc tính cấu hình với tên thuộc tính được bắt đầu bằng tiền tố info. Ví dụ, giả sử bạn muốn phản hồi từ /info bao gồm thông tin liên hệ hỗ trợ, như địa chỉ email và số điện thoại. Để làm điều đó, bạn có thể cấu hình các thuộc tính sau trong tệp application.yml:
info:
contact:
email: support@tacocloud.com
phone: 822-625-6831Cả info.contact.email và info.contact.phone đều không có ý nghĩa đặc biệt nào với Spring Boot hay bất kỳ bean nào trong application context. Tuy nhiên, vì chúng có tiền tố là info, nên endpoint /info sẽ phản hồi với các giá trị này như sau:
{
"contact": {
"email": "support@tacocloud.com",
"phone": "822-625-6831"
}
}Trong mục 15.3.1, chúng ta sẽ xem thêm một vài cách khác để điền thông tin hữu ích vào endpoint /info.
KIỂM TRA TÌNH TRẠNG ỨNG DỤNG
Gửi một yêu cầu HTTP GET đến endpoint /health sẽ trả về một phản hồi JSON đơn giản với trạng thái sức khỏe của ứng dụng. Ví dụ, đây là những gì bạn có thể thấy khi dùng curl để truy xuất endpoint /health:
$ curl localhost:8080/actuator/health
{"status":"UP"}Bạn có thể tự hỏi rằng việc có một endpoint báo rằng ứng dụng đang ở trạng thái UP thì có ích gì. Nếu ứng dụng không hoạt động thì sao?
Thực tế, trạng thái được hiển thị ở đây là trạng thái tổng hợp từ một hoặc nhiều thành phần kiểm tra sức khỏe (health indicator). Các health indicator này báo cáo tình trạng của các hệ thống bên ngoài mà ứng dụng đang tương tác, như cơ sở dữ liệu, bộ xử lý message, và thậm chí cả các thành phần Spring Cloud như Eureka hay Config Server. Trạng thái của mỗi indicator có thể thuộc một trong các loại sau:
UP- Hệ thống bên ngoài đang hoạt động và có thể kết nối được.DOWN- Hệ thống bên ngoài đang không hoạt động hoặc không thể kết nối.UNKNOWN- Không thể xác định được trạng thái của hệ thống bên ngoài.OUT_OF_SERVICE- Hệ thống bên ngoài có thể kết nối nhưng hiện không sẵn sàng phục vụ.
Các trạng thái của tất cả các health indicator sẽ được tổng hợp thành trạng thái tổng thể của ứng dụng dựa theo các quy tắc sau:
- Nếu tất cả các health indicator đều
UP, thì trạng thái của ứng dụng làUP. - Nếu có một hoặc nhiều health indicator là
DOWN, thì trạng thái của ứng dụng làDOWN. - Nếu có một hoặc nhiều health indicator là
OUT_OF_SERVICE, thì trạng thái của ứng dụng làOUT_OF_SERVICE. - Các trạng thái
UNKNOWNsẽ bị bỏ qua và không được tính vào trạng thái tổng thể của ứng dụng.
Theo mặc định, chỉ trạng thái tổng hợp (aggregate status) được trả về khi gọi đến /health. Tuy nhiên, bạn có thể cấu hình thuộc tính management.endpoint.health.show-details để hiển thị toàn bộ chi tiết của các health indicator như sau:
management:
endpoint:
health:
show-details: alwaysThuộc tính management.endpoint.health.show-details mặc định là never, nhưng bạn có thể đặt nó thành always để luôn hiển thị đầy đủ chi tiết, hoặc when-authorized để chỉ hiển thị chi tiết khi client có quyền truy cập đầy đủ.
Giờ đây, khi bạn gửi yêu cầu GET đến /health, bạn sẽ nhận được toàn bộ chi tiết của các health indicator. Dưới đây là một ví dụ về những gì bạn có thể thấy với một dịch vụ tích hợp với cơ sở dữ liệu Mongo:
{
"status": "UP",
"details": {
"mongo": {
"status": "UP",
"details": {
"version": "3.2.2"
}
},
"diskSpace": {
"status": "UP",
"details": {
"total": 499963170816,
"free": 177284784128,
"threshold": 10485760
}
}
}
}Tất cả các ứng dụng, dù có hay không có phụ thuộc vào các hệ thống bên ngoài khác, đều sẽ có một health indicator cho hệ thống tập tin có tên là diskSpace. Health indicator diskSpace phản ánh tình trạng của hệ thống file (hy vọng là UP), được xác định dựa vào lượng không gian trống còn lại. Nếu dung lượng trống xuống dưới ngưỡng cho phép, nó sẽ báo trạng thái là DOWN.
Trong ví dụ trên, còn có một indicator tên là mongo, báo cáo trạng thái của cơ sở dữ liệu Mongo. Thông tin chi tiết có thể bao gồm phiên bản Mongo hiện đang sử dụng.
Tự động cấu hình (autoconfiguration) sẽ đảm bảo rằng chỉ những health indicator liên quan đến ứng dụng mới xuất hiện trong phản hồi của endpoint /health. Ngoài các indicator như mongo và diskSpace, Spring Boot cũng cung cấp các indicator cho nhiều cơ sở dữ liệu và hệ thống bên ngoài khác, bao gồm:
- Cassandra
- Config Server
- Couchbase
- Eureka
- Hystrix
- JDBC data sources
- Elasticsearch
- InfluxDB
- JMS message brokers
- LDAP
- Email servers
- Neo4j
- Rabbit message brokers
- Redis
- Solr
Ngoài ra, các thư viện bên thứ ba cũng có thể tự cung cấp các health indicator của riêng mình. Chúng ta sẽ tìm hiểu cách tự viết một health indicator tùy chỉnh trong mục 15.3.2.
Như bạn đã thấy, các endpoint /health và /info cung cấp thông tin tổng quan về ứng dụng đang chạy. Trong khi đó, các endpoint khác của Actuator cung cấp cái nhìn sâu hơn về cấu hình ứng dụng. Hãy cùng xem Actuator có thể hiển thị cấu hình ứng dụng như thế nào.
